ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5MzJhZQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTAzIEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMCBOZXN0IExhYnMsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdCBMYWJzLiBJdCBpcyBjb25zaWRlcmVkCisjICAgIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24uCisjCisjICAgIFRoaXMgZG9jdW1lbnQgbWF5IG5vdCBiZSByZXByb2R1Y2VkIG9yIHRyYW5zbWl0dGVkIGluIGFueSBmb3JtLAorIyAgICBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHRoZSBleHByZXNzIHdyaXR0ZW4gcGVybWlzc2lvbiBvZgorIyAgICBOZXN0IExhYnMuCisjCisjICAgIERlc2NyaXB0aW9uOgorIyAgICAgIFRoaXMgZmlsZSBpcyB0aGUgbWFrZSBmaWxlIGZvciBYLUxvYWRlciwgYW4gaW5pdGlhbCBwcm9ncmFtCisjICAgICAgbG9hZGVyIChJUEwpIGZvciBlbWJlZGRlZCBib2FyZHMgYmFzZWQgb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMgICAgICBPTUFQIHByb2Nlc3NvcnMuCisjCisKK2luY2x1ZGUgcHJlLm1haworCitQYWNrYWdlUm9vdAkJOj0gLgorCitQYWNrYWdlTmFtZQkJOj0geC1sb2FkZXIKKworUGFja2FnZVNlcGFyYXRvcgk6PSAKKworUGFja2FnZVZlcnNpb24JCTo9IAorUGFja2FnZVNvdXJjZURpcgk6PSAkKFBhY2thZ2VOYW1lKSQoUGFja2FnZVNlcGFyYXRvcikkKFBhY2thZ2VWZXJzaW9uKQorCitQYWNrYWdlQnVpbGRNYWtlZmlsZQk9ICQoY2FsbCBHZW5lcmF0ZUJ1aWxkUGF0aHMsaW5jbHVkZS9jb25maWcubWspCisKK0NsZWFuUGF0aHMJCSs9ICQoUGFja2FnZUxpY2Vuc2VGaWxlKQorCitTT1VSQ0VESVJTICAgICAgICAgICAgICAgICAgICAgID0gJChQYWNrYWdlU291cmNlRGlyKQorJChQYWNrYWdlU291cmNlRGlyKV9SVUxFX1RBUkdFVCA9ICQoQnVpbGREaXJlY3RvcnkpL2NvbmZpZ3VyZQorCithbGw6ICQoUGFja2FnZURlZmF1bHRHb2FsKQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGxpY2Vuc2UgY29udGVudHMuCisKKyQoUGFja2FnZVNvdXJjZURpcikvUkVBRE1FOiAkKEJ1aWxkRGlyZWN0b3J5KS9zb3VyY2UKKworJChQYWNrYWdlTGljZW5zZUZpbGUpOiAkKFBhY2thZ2VTb3VyY2VEaXIpL1JFQURNRQorCSQoRWNobykgIkV4dHJhY3RpbmcgXCIkKGNhbGwgR2VuZXJhdGVCdWlsZFJvb3RFbGxpcHNlZFBhdGgsJChAKSlcIiIKKwkkKFZlcmJvc2UpJChTRUQpIC1uIC1lICcxMCwyNXAnIDwgJDwgPiAkQAorCisjIFByZXBhcmUgdGhlIHNvdXJjZXMuCisKKyQoQnVpbGREaXJlY3RvcnkpL3NvdXJjZTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpICQoQnVpbGREaXJlY3RvcnkpCisJJChWZXJib3NlKXRvdWNoICRACisKKyMgUGF0Y2ggdGhlIHNvdXJjZXMsIGlmIG5lY2Vzc2FyeS4KKworJChCdWlsZERpcmVjdG9yeSkvcGF0Y2g6ICQoQnVpbGREaXJlY3RvcnkpL3NvdXJjZQorCSQoVmVyYm9zZSl0b3VjaCAkQAorCisjIFgtTG9hZGVyIGhhcyBubyB3YXkgb2YgZXhwbGljaXRseSBzZXR0aW5nIENDLCBMRCwgT0JKQ09QWSwgZXQgYWwgYW5kCisjIGluc3RlYWQgcmVsaWVzIG9uIHRoZSB2YWx1ZSBvZiBDUk9TU19DT01QSUxFLiBDb25zZXF1ZW50bHksIHdlIGhhdmUKKyMgdG8gZW5zdXJlIHRoYXQgJ1Rvb2xCaW5EaXInIGlzIGluICdQQVRIJyBzbyB0aGF0IHRoZSBrZXJuZWwgYnVpbGQKKyMgaW5mcmFzdHJ1Y3R1cmUgY2FuIGZpbmQgJChDUk9TU19DT01QSUxFKWdjYywgJChDUk9TU19DT01QSUxFKWxkLCBldCBhbC4KKworJChCdWlsZERpcmVjdG9yeSkvY29uZmlndXJlICQoQnVpbGREaXJlY3RvcnkpL2J1aWxkICQoQnVpbGREaXJlY3RvcnkpL3N0YWdlOiBQQVRIIDo9ICQoUEFUSCk6JChUb29sQmluRGlyKQorJChCdWlsZERpcmVjdG9yeSkvY29uZmlndXJlICQoQnVpbGREaXJlY3RvcnkpL2J1aWxkICQoQnVpbGREaXJlY3RvcnkpL3N0YWdlOiBDUk9TU19DT01QSUxFIDo9ICQoQ0NBQ0hFKSAkKENST1NTX0NPTVBJTEUpCisKKyMgR2VuZXJhdGUgdGhlIHBhY2thZ2UgYnVpbGQgbWFrZWZpbGUuCisKKyMgQ29uZmlndXJlIHRoZSBzb3VyY2UgZm9yIGJ1aWxkaW5nLgorCiskKEJ1aWxkRGlyZWN0b3J5KS9jb25maWd1cmU6ICQoQnVpbGREaXJlY3RvcnkpL3NvdXJjZSB8ICQoUGFja2FnZVNvdXJjZURpcikgJChCdWlsZERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpdW5zZXQgTUFLRUZMQUdTICYmIFwKKwkkKE1BS0UpICQoSk9CU0ZMQUcpIC1DICQoUGFja2FnZVNvdXJjZURpcikgTz0kKENVUkRJUikvJChCdWlsZERpcmVjdG9yeSkgXAorCUlOU1RBTEw9IiQoSU5TVEFMTCkgJChJTlNUQUxMRkxBR1MpIiBcCisJJChYTG9hZGVyUHJvZHVjdGlvbkNvbmZpZykKKwkkKFZlcmJvc2UpdG91Y2ggJEAKKworIyBCdWlsZCB0aGUgc291cmNlLgorCiskKEJ1aWxkRGlyZWN0b3J5KS9idWlsZDogJChCdWlsZERpcmVjdG9yeSkvY29uZmlndXJlCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKFBhY2thZ2VTb3VyY2VEaXIpIE89JChDVVJESVIpLyQoQnVpbGREaXJlY3RvcnkpIFwKKwlJTlNUQUxMPSIkKElOU1RBTEwpICQoSU5TVEFMTEZMQUdTKSIgXAorCWFsbAorCSQoVmVyYm9zZSl0b3VjaCAkQAorCisjIFN0YWdlIHRoZSBidWlsZCB0byBhIHRlbXBvcmFyeSBpbnN0YWxsYXRpb24gYXJlYS4KKyMKKyMgWC1Mb2FkZXIgZG9lcyBub3Qgc3VwcG9ydCBhIG5vdGlvbiBvZiBpbnN0YWxsaW5nLCBzbyB3ZSBoYXZlIHRvCisjIGNoZXJyeS1waWNrIHRoZSBjb21wb25lbnRzIHdlIHdhbnQgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5IGFuZAorIyBjb3B5L2luc3RhbGwgdGhlbSB0byB0aGUgcmVzdWx0cyBkaXJlY3RvcnkuCisKKyQoQnVpbGREaXJlY3RvcnkpL3N0YWdlOiAkKEJ1aWxkRGlyZWN0b3J5KS9idWlsZCB8ICQoUmVzdWx0RGlyZWN0b3J5KQorCSQoVmVyYm9zZSljcCAtZiAkKHdpbGRjYXJkICQoY2FsbCBHZW5lcmF0ZUJ1aWxkUGF0aHMseC1sb2FkKikpICQoUmVzdWx0RGlyZWN0b3J5KQorCSQoVmVyYm9zZSljcCAtZiAkKGNhbGwgR2VuZXJhdGVCdWlsZFBhdGhzLFN5c3RlbS5tYXApICQoUmVzdWx0RGlyZWN0b3J5KQorCSQoVmVyYm9zZSl0b3VjaCAkQAorCisuUEhPTlk6IHN0YWdlCitzdGFnZTogJChCdWlsZERpcmVjdG9yeSkvc3RhZ2UKKworCitjbGVhbjoKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKEJ1aWxkRGlyZWN0b3J5KQorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUmVzdWx0RGlyZWN0b3J5KQorCitpbmNsdWRlIHBvc3QubWFrCmRpZmYgLS1naXQgYS94LWxvYWRlci52ZXJzaW9uIGIveC1sb2FkZXIudmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmYwOTViCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIudmVyc2lvbgpAQCAtMCwwICsxIEBACisxLjQ2X09NQVBQU1BfMDMuMDAuMDEuMDYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyLy5maWxlLWxpc3QgYi94LWxvYWRlci8uZmlsZS1saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZDUwNjkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci8uZmlsZS1saXN0CkBAIC0wLDAgKzEsMTExIEBACisuQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzUKKy4vUkVBRE1FQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9hcm1fY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzQKKy4vYm9hcmQvb21hcDE3MTBoM0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDE3MTBoMy9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDE3MTBoMy9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAxNzEwaDMvb21hcDE3MTBoMy5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMTcxMGgzL3BsYXRmb3JtLlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAxNzEwaDMveC1sb2FkLmxkc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDI0MjBoNEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDI0MjBoNC9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDI0MjBoNC9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9ib2FyZC9vbWFwMjQyMGg0L3BsYXRmb3JtLlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2JvYXJkL29tYXAyNDIwaDQveC1sb2FkLmxkc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDI0MzBzZHBAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2JvYXJkL29tYXAyNDMwc2RwL01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9ib2FyZC9vbWFwMjQzMHNkcC9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAyNDMwc2RwL29tYXAyNDMwc2RwLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC83CisuL2JvYXJkL29tYXAyNDMwc2RwL3BsYXRmb3JtLlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2JvYXJkL29tYXAyNDMwc2RwL3gtbG9hZC5sZHNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAzNDMwc2RwQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMzQzMHNkcC9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDM0MzBzZHAvY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMzQzMHNkcC9vbWFwMzQzMHNkcC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9ib2FyZC9vbWFwMzQzMHNkcC9wbGF0Zm9ybS5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9ib2FyZC9vbWFwMzQzMHNkcC94LWxvYWQubGRzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2NwdUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vY3B1L2FybTExMzZAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9hcm0xMTM2L01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtMTEzNi9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC83CisuL2NwdS9hcm0xMTM2L2NwdS5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtMTEzNi9zdGFydC5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtOTI2ZWpzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtOTI2ZWpzL01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtOTI2ZWpzL2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vY3B1L2FybTkyNmVqcy9jcHUuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTkyNmVqcy9zdGFydC5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9jcHUvb21hcDNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9vbWFwMy9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L29tYXAzL2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L29tYXAzL2NwdS5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvb21hcDMvc3RhcnQuU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vZHJpdmVyc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vZHJpdmVycy9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vZHJpdmVycy9rOWY1NjE2LmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2RyaXZlcnMvazlrMTIxNi5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9kcml2ZXJzL25zMTY1NTAuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vZHJpdmVycy9vbmVuYW5kLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2RyaXZlcnMvb25lbmFuZF9yZWdzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2RyaXZlcnMvc2VyaWFsLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzZAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9iaXRzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MuaAorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzMjQyeC5oCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MyNDN4LmgKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L21lbS5oCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9vbWFwMjQyMC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvb21hcDI0MzAuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L3NpemVzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9zeXNfaW5mby5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTkyNmVqc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm05MjZlanMvc2l6ZXMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwM0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9iaXRzLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jbG9ja3MuaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2Nsb2NrczM0M3guaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2NwdS5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbWVtLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9tdXguaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL29tYXAzNDMwLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zaXplcy5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc3lzX2luZm8uaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3N5c19wcm90by5oCisuL2luY2x1ZGUvYXNtL2F0b21pYy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9wcm9jLWFybXZAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL3NldHVwLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL3NpemVzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL3N0cmluZy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS90eXBlcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS94LWxvYWQtYXJtLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvY29tbW9uLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2luY2x1ZGUvY29uZmlnc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzQKKy4vaW5jbHVkZS9jb25maWdzL29tYXAxNTEwLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvY29uZmlncy9vbWFwMTcxMGgzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC80CisuL2luY2x1ZGUvY29uZmlncy9vbWFwMjQzMHNkcC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvNgorLi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBzZHAuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9saW51eEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9saW51eC9jb25maWcuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2xpbnV4L3R5cGVzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvbnMxNjU1MC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9saWJAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2xpYi9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vbGliL191ZGl2c2kzLlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2xpYi9fdW1vZHNpMy5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9saWIvYm9hcmQuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzgKKy4vbGliL2RpdjAuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vbGliL2VjYy5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9saWIvcHJpbnRmLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL21rY29uZmlnQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9zY3JpcHRzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9zY3JpcHRzL21rb25lYm9vdC5zaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL01ha2VmaWxlIGIveC1sb2FkZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0M2RhZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMzg2IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2LCBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDEwCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworVkVSU0lPTiA9IDEKK1BBVENITEVWRUwgPSA0NgorU1VCTEVWRUwgPQorRVhUUkFWRVJTSU9OID0KK2lmbmVxICIkKFNVQkxFVkVMKSIgIiIKK1hfTE9BREVSX1ZFUlNJT04gPSAkKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikKK2Vsc2UKK1hfTE9BREVSX1ZFUlNJT04gPSAkKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkkKEVYVFJBVkVSU0lPTikKK2VuZGlmCitUSU1FU1RBTVBfRklMRSA9ICQob2JqKWluY2x1ZGUvdGltZXN0YW1wX2F1dG9nZW5lcmF0ZWQuaAorVkVSU0lPTl9GSUxFID0gJChvYmopaW5jbHVkZS92ZXJzaW9uX2F1dG9nZW5lcmF0ZWQuaAorCitIT1NUQVJDSCA6PSAkKHNoZWxsIHVuYW1lIC1tIHwgXAorCXNlZCAtZSBzL2kuODYvaTM4Ni8gXAorCSAgICAtZSBzL3N1bjR1L3NwYXJjNjQvIFwKKwkgICAgLWUgcy9hcm0uKi9hcm0vIFwKKwkgICAgLWUgcy9zYTExMC9hcm0vIFwKKwkgICAgLWUgcy9wcGM2NC9wb3dlcnBjLyBcCisJICAgIC1lIHMvcHBjL3Bvd2VycGMvIFwKKwkgICAgLWUgcy9tYWNwcGMvcG93ZXJwYy9cCisJICAgIC1lIHMvc2guKi9zaC8pCisKK0hPU1RPUyA6PSAkKHNoZWxsIHVuYW1lIC1zIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScgfCBcCisJICAgIHNlZCAtZSAncy9cKGN5Z3dpblwpLiovY3lnd2luLycpCisKKyMgU2V0IHNoZWxsIHRvIGJhc2ggaWYgcG9zc2libGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gc2gKK1NIRUxMIDo9ICQoc2hlbGwgaWYgWyAteCAiJCRCQVNIIiBdOyB0aGVuIGVjaG8gJCRCQVNIOyBcCisJZWxzZSBpZiBbIC14IC9iaW4vYmFzaCBdOyB0aGVuIGVjaG8gL2Jpbi9iYXNoOyBcCisJZWxzZSBlY2hvIHNoOyBmaTsgZmkpCisKK2V4cG9ydAlIT1NUQVJDSCBIT1NUT1MgU0hFTEwKKworIyBEZWFsIHdpdGggY29sbGlkaW5nIGRlZmluaXRpb25zIGZyb20gdGNzaCBldGMuCitWRU5ET1I9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQWxsb3cgZm9yIHNpbGVudCBidWlsZHMKK2lmZXEgKCwkKGZpbmRzdHJpbmcgcywkKE1BS0VGTEFHUykpKQorWEVDSE8gPSBlY2hvCitlbHNlCitYRUNITyA9IDoKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgWC1sb2FkZXIgYnVpbGQgc3VwcG9ydHMgcHJvZHVjaW5nIGEgb2JqZWN0IGZpbGVzIHRvIHRoZSBzZXBhcmF0ZSBleHRlcm5hbAorIyBkaXJlY3RvcnkuIFR3byB1c2UgY2FzZXMgYXJlIHN1cHBvcnRlZDoKKyMKKyMgMSkgQWRkIE89IHRvIHRoZSBtYWtlIGNvbW1hbmQgbGluZQorIyAnbWFrZSBPPS90bXAvYnVpbGQgYWxsJworIworIyAyKSBTZXQgZW52aXJvbmVtZW50IHZhcmlhYmxlIEJVSUxEX0RJUiB0byBwb2ludCB0byB0aGUgZGVzaXJlZCBsb2NhdGlvbgorIyAnZXhwb3J0IEJVSUxEX0RJUj0vdG1wL2J1aWxkJworIyAnbWFrZScKKyMKKyMgVGhlIHNlY29uZCBhcHByb2FjaCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggYSBNQUtFQUxMIHNjcmlwdAorIyAnZXhwb3J0IEJVSUxEX0RJUj0vdG1wL2J1aWxkJworIyAnLi9NQUtFQUxMJworIworIyBDb21tYW5kIGxpbmUgJ089JyBzZXR0aW5nIG92ZXJyaWRlcyBCVUlMRF9ESVIgZW52aXJvbmVudCB2YXJpYWJsZS4KKyMKKyMgV2hlbiBub25lIG9mIHRoZSBhYm92ZSBtZXRob2RzIGlzIHVzZWQgdGhlIGxvY2FsIGJ1aWxkIGlzIHBlcmZvcm1lZCBhbmQKKyMgdGhlIG9iamVjdCBmaWxlcyBhcmUgcGxhY2VkIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorIworCitpZmRlZiBPCitpZmVxICgiJChvcmlnaW4gTykiLCAiY29tbWFuZCBsaW5lIikKK0JVSUxEX0RJUiA6PSAkKE8pCitlbmRpZgorZW5kaWYKKworaWZuZXEgKCQoQlVJTERfRElSKSwpCitzYXZlZC1vdXRwdXQgOj0gJChCVUlMRF9ESVIpCisKKyMgQXR0ZW1wdCB0byBjcmVhdGUgYSBvdXRwdXQgZGlyZWN0b3J5LgorJChzaGVsbCBbIC1kICR7QlVJTERfRElSfSBdIHx8IG1rZGlyIC1wICR7QlVJTERfRElSfSkKKworIyBWZXJpZnkgaWYgaXQgd2FzIHN1Y2Nlc3NmdWwuCitCVUlMRF9ESVIgOj0gJChzaGVsbCBjZCAkKEJVSUxEX0RJUikgJiYgL2Jpbi9wd2QpCiskKGlmICQoQlVJTERfRElSKSwsJChlcnJvciBvdXRwdXQgZGlyZWN0b3J5ICIkKHNhdmVkLW91dHB1dCkiIGRvZXMgbm90IGV4aXN0KSkKK2VuZGlmICMgaWZuZXEgKCQoQlVJTERfRElSKSwpCisKK09CSlRSRUUJCTo9ICQoaWYgJChCVUlMRF9ESVIpLCQoQlVJTERfRElSKSwkKENVUkRJUikpCitTUkNUUkVFCQk6PSAkKENVUkRJUikKK1RPUERJUgkJOj0gJChTUkNUUkVFKQorTE5ESVIJCTo9ICQoT0JKVFJFRSkKK2V4cG9ydAlUT1BESVIgU1JDVFJFRSBPQkpUUkVFCisKK01LQ09ORklHCTo9ICQoU1JDVFJFRSkvbWtjb25maWcKK2V4cG9ydCBNS0NPTkZJRworCitpZm5lcSAoJChPQkpUUkVFKSwkKFNSQ1RSRUUpKQorUkVNT1RFX0JVSUxECTo9IDEKK2V4cG9ydCBSRU1PVEVfQlVJTEQKK2VuZGlmCisKKyMgJChvYmopIGFuZCAoc3JjKSBhcmUgZGVmaW5lZCBpbiBjb25maWcubWsgYnV0IGhlcmUgaW4gbWFpbiBNYWtlZmlsZQorIyB3ZSBhbHNvIG5lZWQgdGhlbSBiZWZvcmUgY29uZmlnLm1rIGlzIGluY2x1ZGVkIHdoaWNoIGlzIHRoZSBjYXNlIGZvcgorIyBzb21lIHRhcmdldHMgbGlrZSB1bmNvbmZpZywgY2xlYW4sIGNsb2JiZXIsIGRpc3RjbGVhbiwgZXRjLgoraWZuZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKK29iaiA6PSAkKE9CSlRSRUUpLworc3JjIDo9ICQoU1JDVFJFRSkvCitlbHNlCitvYmogOj0KK3NyYyA6PQorZW5kaWYKK2V4cG9ydCBvYmogc3JjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGUgInRvb2xzIiBhcmUgbmVlZGVkIGVhcmx5LCBzbyBwdXQgdGhpcyBmaXJzdAorIyBEb24ndCBpbmNsdWRlIHN0dWZmIGFscmVhZHkgZG9uZSBpbiAkKExJQlMpCitTVUJESVJTID0gdG9vbHMKKy5QSE9OWSA6ICQoU1VCRElSUykKKworaWZlcSAoJChvYmopaW5jbHVkZS9jb25maWcubWssJCh3aWxkY2FyZCAkKG9iailpbmNsdWRlL2NvbmZpZy5taykpCisKKyMgSW5jbHVkZSBhdXRvY29uZi5tayBiZWZvcmUgY29uZmlnLm1rIHNvIHRoYXQgdGhlIGNvbmZpZyBvcHRpb25zIGFyZSBhdmFpbGFibGUKKyMgdG8gYWxsIHRvcCBsZXZlbCBidWlsZCBmaWxlcy4gIFdlIG5lZWQgdGhlIGR1bW15IGFsbDogdGFyZ2V0IHRvIHByZXZlbnQgdGhlCisjIGRlcGVuZGVuY3kgdGFyZ2V0IGluIGF1dG9jb25mLm1rLmRlcCBmcm9tIGJlaW5nIHRoZSBkZWZhdWx0LgorYWxsOgorc2luY2x1ZGUgJChvYmopaW5jbHVkZS9hdXRvY29uZi5tay5kZXAKK3NpbmNsdWRlICQob2JqKWluY2x1ZGUvYXV0b2NvbmYubWsKKworIyBsb2FkIEFSQ0gsIEJPQVJELCBhbmQgQ1BVIGNvbmZpZ3VyYXRpb24KK2luY2x1ZGUgJChvYmopaW5jbHVkZS9jb25maWcubWsKK2V4cG9ydAlBUkNIIENQVSBCT0FSRCBWRU5ET1IgU09DCisKKyMgc2V0IGRlZmF1bHQgdG8gbm90aGluZyBmb3IgbmF0aXZlIGJ1aWxkcworaWZlcSAoJChIT1NUQVJDSCksJChBUkNIKSkKK0NST1NTX0NPTVBJTEUgPz0KK2VuZGlmCisKKyMgbG9hZCBvdGhlciBjb25maWd1cmF0aW9uCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBYLUxvYWQgb2JqZWN0cy4uLi5vcmRlciBpcyBpbXBvcnRhbnQgKGkuZS4gc3RhcnQgbXVzdCBiZSBmaXJzdCkKKworT0JKUyAgPSAkKENQVURJUikvc3RhcnQubworCitPQkpTIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKE9CSlMpKQorCitMSUJTICs9ICQoc2hlbGwgaWYgWyAtZiBib2FyZC8kKFZFTkRPUikvY29tbW9uL01ha2VmaWxlIF07IHRoZW4gZWNobyBcCisJImJvYXJkLyQoVkVORE9SKS9jb21tb24vbGliJChWRU5ET1IpLmEiOyBmaSkKK0xJQlMgKz0gJChDUFVESVIpL2xpYiQoQ1BVKS5hCitMSUJTICs9IGxpYi9saWIkKEFSQ0gpLmEKK0xJQlMgKz0gY29tbW9uL2xpYmNvbW1vbi5hCitMSUJTICs9IGZzL2ZhdC9saWJmYXQuYQorTElCUyArPSBkaXNrL2xpYmRpc2suYQorTElCUyArPSBkcml2ZXJzL210ZC9uYW5kL2xpYm5hbmQuYQorTElCUyArPSBkcml2ZXJzL210ZC9vbmVuYW5kL2xpYm9uZW5hbmQuYQorTElCUyArPSBkcml2ZXJzL3J0Yy9saWJydGMuYQorTElCUyArPSBkcml2ZXJzL3NlcmlhbC9saWJzZXJpYWwuYQorTElCUyArPSBkcml2ZXJzL3VzYi9saWJ1c2IuYQorCitMSUJTIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKExJQlMpKQorLlBIT05ZIDogJChMSUJTKSAkKFRJTUVTVEFNUF9GSUxFKSAkKFZFUlNJT05fRklMRSkKKworTElCQk9BUkQgPSBib2FyZC8kKEJPQVJERElSKS9saWIkKEJPQVJEKS5hCitMSUJCT0FSRCA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChMSUJCT0FSRCkpCisKKyMgQWRkIEdDQyBsaWIKK1BMQVRGT1JNX0xJQkdDQyA9IC1MICQoc2hlbGwgZGlybmFtZSBgJChDQykgJChDRkxBR1MpIC1wcmludC1saWJnY2MtZmlsZS1uYW1lYCkgLWxnY2MKK1BMQVRGT1JNX0xJQlMgKz0gJChQTEFURk9STV9MSUJHQ0MpCitleHBvcnQgUExBVEZPUk1fTElCUworCitfX09CSlMgOj0gJChzdWJzdCAkKG9iaiksLCQoT0JKUykpCitfX0xJQlMgOj0gJChzdWJzdCAkKG9iaiksLCQoTElCUykpICQoc3Vic3QgJChvYmopLCwkKExJQkJPQVJEKSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEFsd2F5cyBhcHBlbmQgQUxMIHNvIHRoYXQgYXJjaCBjb25maWcubWsncyBjYW4gYWRkIGN1c3RvbSBvbmVzCitBTEwgKz0gJChvYmopeC1sb2FkLnNyZWMgJChvYmopeC1sb2FkLmJpbiAkKG9iail4LWxvYWQuYmluLmlmdCAkKG9iailTeXN0ZW0ubWFwCisKK2FsbDoJCSQoQUxMKQorCiskKG9iail4LWxvYWQuaGV4OgkkKG9iail4LWxvYWQKKwkJJChPQkpDT1BZKSAke09CSkNGTEFHU30gLU8gaWhleCAkPCAkQAorCiskKG9iail4LWxvYWQuc3JlYzoJJChvYmopeC1sb2FkCisJCSQoT0JKQ09QWSkgLU8gc3JlYyAkPCAkQAorCiskKG9iail4LWxvYWQuYmluOgkkKG9iail4LWxvYWQKKwkJJChPQkpDT1BZKSAke09CSkNGTEFHU30gLU8gYmluYXJ5ICQ8ICRACisKKyQob2JqKXgtbG9hZC5iaW4uaWZ0OgkkKG9iail4LWxvYWQuYmluCisJCSQob2JqKXRvb2xzL3NpZ25HUCAkPAorCiskKG9iail4LWxvYWQuZGlzOgkkKG9iail4LWxvYWQKKwkJJChPQkpEVU1QKSAtZCAkPCA+ICRACisKK0dFTl9YTE9BRCA9IFwKKwkJVU5ERUZfU1lNPWAkKE9CSkRVTVApIC14ICQoTElCQk9BUkQpICQoTElCUykgfCBcCisJCXNlZCAgLW4gLWUgJ3MvLipcKCQoU1lNX1BSRUZJWClfX3VfYm9vdF9jbWRfLipcKS8tdVwxL3AnfHNvcnR8dW5pcWA7XAorCQljZCAkKExORElSKSAmJiAkKExEKSAkKExERkxBR1MpICQkVU5ERUZfU1lNICQoX19PQkpTKSBcCisJCQktLXN0YXJ0LWdyb3VwICQoX19MSUJTKSAtLWVuZC1ncm91cCAkKFBMQVRGT1JNX0xJQlMpIFwKKwkJCS1NYXAgeC1sb2FkLm1hcCAtbyB4LWxvYWQJCiskKG9iail4LWxvYWQ6CWRlcGVuZCAkKFNVQkRJUlMpICQoT0JKUykgJChMSUJCT0FSRCkgJChMSUJTKSAkKExEU0NSSVBUKSAkKG9iail4LWxvYWQubGRzCisJCSQoR0VOX1hMT0FEKQorCiskKE9CSlMpOglkZXBlbmQKKwkJJChNQUtFKSAtQyAkKENQVURJUikgJChpZiAkKFJFTU9URV9CVUlMRCksJEAsJChub3RkaXIgJEApKQorCiskKExJQlMpOglkZXBlbmQgJChTVUJESVJTKQorCQkkKE1BS0UpIC1DICQoZGlyICQoc3Vic3QgJChvYmopLCwkQCkpCisKKyQoTElCQk9BUkQpOglkZXBlbmQgJChMSUJTKQorCQkkKE1BS0UpIC1DICQoZGlyICQoc3Vic3QgJChvYmopLCwkQCkpCisKKyQoU1VCRElSUyk6CWRlcGVuZAorCQkkKE1BS0UpIC1DICRAIGFsbAorCiskKExEU0NSSVBUKToJZGVwZW5kCisJCSQoTUFLRSkgLUMgJChkaXIgJEApICQobm90ZGlyICRAKQorCiskKG9iail4LWxvYWQubGRzOiAkKExEU0NSSVBUKQorCQkkKENQUCkgJChDUFBGTEFHUykgJChMRFBQRkxBR1MpIC1hbnNpIC1EX19BU1NFTUJMWV9fIC1QIC0gPCReID4kQAorCiskKG9iailvbmVib290OgkkKG9iail4LWxvYWQuYmluCisJCXNjcmlwdHMvbWtvbmVib290LnNoCiskKFZFUlNJT05fRklMRSk6CisJCUAoIHByaW50ZiAnI2RlZmluZSBYX0xPQURFUl9WRVJTSU9OICJUZXhhcyBJbnN0cnVtZW50cyBYLUxvYWRlciAlcyVzIlxuJyAiJChYX0xPQURFUl9WRVJTSU9OKSIgXAorCQkgJyQoc2hlbGwgJChUT1BESVIpL3Rvb2xzL3NldGxvY2FsdmVyc2lvbiAkKFRPUERJUikpJyApID4gJEAudG1wCisJCUBjbXAgLXMgJEAgJEAudG1wICYmIHJtIC1mICRALnRtcCB8fCBtdiAtZiAkQC50bXAgJEAKKworJChUSU1FU1RBTVBfRklMRSk6CisJCUBMQ19BTEw9QyBkYXRlICsnI2RlZmluZSBYX0xPQURFUl9EQVRFICIlYiAlZCAlQyV5IicgPiAkQAorCQlATENfQUxMPUMgZGF0ZSArJyNkZWZpbmUgWF9MT0FERVJfVElNRSAiJVQiJyA+PiAkQAorCisjIEV4cGxpY2l0bHkgbWFrZSBfZGVwZW5kIGluIHN1YmRpcnMgY29udGFpbmluZyBtdWx0aXBsZSB0YXJnZXRzIHRvIHByZXZlbnQKKyMgcGFyYWxsZWwgc3ViLW1ha2VzIGNyZWF0aW5nIC5kZXBlbmQgZmlsZXMgc2ltdWx0YW5lb3VzbHkuCitkZXBlbmQgZGVwOgkkKFRJTUVTVEFNUF9GSUxFKSAkKFZFUlNJT05fRklMRSkKKwkJZm9yIGRpciBpbiAkKFNVQkRJUlMpICQoQ1BVRElSKSAkKGRpciAkKExEU0NSSVBUKSkgOyBkbyBcCisJCQkkKE1BS0UpIC1DICQkZGlyIF9kZXBlbmQgOyBkb25lCisKK1RBR19TVUJESVJTID0gJChTVUJESVJTKQorVEFHX1NVQkRJUlMgKz0gJChkaXIgJChfX0xJQlMpKQorVEFHX1NVQkRJUlMgKz0gaW5jbHVkZQorCit0YWdzIGN0YWdzOgorCQljdGFncyAtdyAtbyAkKG9iailjdGFncyBgZmluZCAkKFRBR19TVUJESVJTKSBcCisJCQkJCQktbmFtZSAnKi5bY2hTXScgLXByaW50YAorCitldGFnczoKKwkJZXRhZ3MgLWEgLW8gJChvYmopZXRhZ3MgYGZpbmQgJChUQUdfU1VCRElSUykgXAorCQkJCQkJLW5hbWUgJyouW2NoU10nIC1wcmludGAKK2NzY29wZToKKwkJZmluZCAkKFRBR19TVUJESVJTKSAtbmFtZSAnKi5bY2hTXScgLXByaW50ID4gY3Njb3BlLmZpbGVzCisJCWNzY29wZSAtYiAtcSAtaworCitTWVNURU1fTUFQID0gXAorCQkkKE5NKSAkMSB8IFwKKwkJZ3JlcCAtdiAnXChjb21waWxlZFwpXHxcKFwubyQkXClcfFwoIFthVXddIFwpXHxcKFwuXC5uZyQkXClcfFwoTEFTSFtSTF1ESVwpJyB8IFwKKwkJTENfQUxMPUMgc29ydAorJChvYmopU3lzdGVtLm1hcDoJJChvYmopeC1sb2FkCisJCUAkKGNhbGwgU1lTVEVNX01BUCwkPCkgPiAkKG9iailTeXN0ZW0ubWFwCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitlbHNlCSMgIWNvbmZpZy5taworYWxsICQob2JqKXgtbG9hZC5oZXggJChvYmopeC1sb2FkLnNyZWMgJChvYmopeC1sb2FkLmJpbiBcCiskKG9iail4LWxvYWQuZGlzICQob2JqKXgtbG9hZCBcCiskKG9iailvbmVib290IFwKKyQoZmlsdGVyLW91dCB0b29scywkKFNVQkRJUlMpKSAkKFRJTUVTVEFNUF9GSUxFKSAkKFZFUlNJT05fRklMRSkgXAorZGVwZW5kIGRlcCB0YWdzIGN0YWdzIGV0YWdzIGNzY29wZSAkKG9iailTeXN0ZW0ubWFwOgorCUBlY2hvICJTeXN0ZW0gbm90IGNvbmZpZ3VyZWQgLSBzZWUgUkVBRE1FIiA+JjIKKwlAIGV4aXQgMQorCit0b29sczoKKwkkKE1BS0UpIC1DIHRvb2xzCit0b29scy1hbGw6CisJJChNQUtFKSAtQyB0b29scyBIT1NUX1RPT0xTX0FMTD15CitlbmRpZgkjIGNvbmZpZy5taworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3VuY29uZmlnOgorCUBybSAtZiAkKG9iailpbmNsdWRlL2NvbmZpZy5oICQob2JqKWluY2x1ZGUvY29uZmlnLm1rCisKKyVfY29uZmlnOjoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgLUEgJChAOl9jb25maWc9KQorCisjCisjIEZ1bmN0aW9ucyB0byBnZW5lcmF0ZSBjb21tb24gYm9hcmQgZGlyZWN0b3J5IG5hbWVzCisjCitsY25hbWUJPSAkKHNoZWxsIGVjaG8gJCgxKSB8IHNlZCAtZSAncy9cKC4qXClfY29uZmlnL1xMXDEvJykKK3VjbmFtZQk9ICQoc2hlbGwgZWNobyAkKDEpIHwgc2VkIC1lICdzL1woLipcKV9jb25maWcvXFVcMS8nKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEFSTQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgT01BUDEgKEFSTTkyeFQpIFN5c3RlbXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworb21hcDE3MTBoM19jb25maWcgOiAgICB1bmNvbmZpZworCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBhcm05MjZlanMgb21hcDE3MTBoMworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBPTUFQMiAoQVJNMTEzNikgU3lzdGVtcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitvbWFwMjQyMGg0X2NvbmZpZyA6ICAgIHVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIGFybTExMzYgb21hcDI0MjBoNAorCitvbWFwMjQzMHNkcF9jb25maWcgOiAgICB1bmNvbmZpZworCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBhcm0xMTM2IG9tYXAyNDMwc2RwCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIE9NQVAzIChBUk0tQ29ydGV4QTgpIFN5c3RlbXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK29tYXAzNDMwc2RwX2NvbmZpZyA6ICAgIHVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIG9tYXAzIG9tYXAzNDMwc2RwCisKK29tYXAzNDMwbGFicmFkb3JfY29uZmlnIDogICAgdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gb21hcDMgb21hcDM0MzBsYWJyYWRvcgorCitvbWFwM2V2bV9jb25maWcgOgl1bmNvbmZpZworCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBvbWFwMyBvbWFwM2V2bQorCithbTM1MTdldm1fY29uZmlnIDogICAgICAgdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gb21hcDMgYW0zNTE3ZXZtCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NsZWFuOgorCUBybSAtZiAkKG9iail0b29scy9zaWduR1AKKwlAcm0gLWYgJChUSU1FU1RBTVBfRklMRSkgJChWRVJTSU9OX0ZJTEUpCisJQGZpbmQgJChPQkpUUkVFKSAtdHlwZSBmIFwKKwkJXCggLW5hbWUgJ2NvcmUnIC1vIC1uYW1lICcqLmJhaycgLW8gLW5hbWUgJyp+JyBcCisJCS1vIC1uYW1lICcqLm8nCS1vIC1uYW1lICcqLmEnIC1vIC1uYW1lICcqLmV4ZScJXCkgLXByaW50IFwKKwkJfCB4YXJncyBybSAtZgorCitjbG9iYmVyOgljbGVhbgorCUBmaW5kICQoT0JKVFJFRSkgLXR5cGUgZiBcKCAtbmFtZSAuZGVwZW5kIFwKKwkJLW8gLW5hbWUgJyouc3JlYycgLW8gLW5hbWUgJyouYmluJyAtbyAtbmFtZSAnKi5iaW4uaWZ0JyBcKSBcCisJCS1wcmludDAgXAorCQl8IHhhcmdzIC0wIHJtIC1mCisJQHJtIC1mICQoT0JKUykgJChvYmopKi5iYWsgJChvYmopY3RhZ3MgJChvYmopZXRhZ3MgJChvYmopVEFHUyBcCisJCSQob2JqKWNzY29wZS4qICQob2JqKSouKn4KKwlAcm0gLWYgJChvYmopeC1sb2FkICQob2JqKXgtbG9hZC5tYXAgJChvYmopeC1sb2FkLmhleCAkKEFMTCkKKwlAcm0gLWYgJChvYmopaW5jbHVkZS9hc20vcHJvYyAkKG9iailpbmNsdWRlL2FzbS9hcmNoICQob2JqKWluY2x1ZGUvYXNtCisKK2lmZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKK21ycHJvcGVyIFwKK2Rpc3RjbGVhbjoJY2xvYmJlciB1bmNvbmZpZworZWxzZQorbXJwcm9wZXIgXAorZGlzdGNsZWFuOgljbG9iYmVyIHVuY29uZmlnCisJcm0gLXJmICQob2JqKSoKK2VuZGlmCisKK2JhY2t1cDoKKwlGPWBiYXNlbmFtZSAkKFRPUERJUilgIDsgY2QgLi4gOyBcCisJZ3RhciAtLWZvcmNlLWxvY2FsIC16Y3ZmIGBMQ19BTEw9QyBkYXRlICIrJCRGLSVZLSVtLSVkLSVULnRhci5neiJgICQkRgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9SRUFETUUgYi94LWxvYWRlci9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyNjYyYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL1JFQURNRQpAQCAtMCwwICsxLDE1MiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNiBUZXhhcyBJbnN0cnVtZW50cworIworIyBTb21lIGN1dC9wYXN0ZSBmcm9tIFUtQm9vdCBSRUFETUUKKyMgKEMpIENvcHlyaWdodCAyMDAwIC0gMjAwNAorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1N1bW1hcnk6Cis9PT09PT09PQorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgc291cmNlIGNvZGUgZm9yIFgtTG9hZGVyLCBhbiBpbml0aWFsIHByb2dyYW0KK2xvYWRlciBmb3IgRW1iZWRkZWQgYm9hcmRzIGJhc2VkIG9uIE9NQVAgcHJvY2Vzc29ycy4gWC1Mb2FkZXIgY2FuIGJlCitzaWduZWQgYnkgVGV4YXMgSW5zdHJ1bWVudHMgSUZUIGFuZCBpbnN0YWxsZWQgdG8gTmFuZCBmbGFzaCB0byBhY2hpZXZlCitOYW5kIGJvb3RpbmcuCisKKworU3RhdHVzOgorPT09PT09PQorCitUaGUgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgSDMgYm9hcmQgKE9NQVAxNzEwKSBoYXMgYmVlbiBpbXBsZW1lbnRlZAorYW5kIHRlc3RlZC4gKE1heSAyMDA0KQorVGhlIHN1cHBvcnQgZm9yIFRleGFzIEluc3RydW1lbnRzIEg0IGJvYXJkIChPTUFQMjQyMCkgaGFzIGJlZW4gaW1wbGVtZW50ZWQKK2FuZCB0ZXN0ZWQuIChOb3YgMjAwNCkKK1RoZSBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyAyNDMwU0RQIGJvYXJkIChPTUFQMjQzMCkgaGFzIGJlZW4gaW1wbGVtZW50ZWQKK2FuZCB0ZXN0ZWQuIChKdWwgMjAwNikKK1RoZSBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyAzNDMwU0RQIGJvYXJkIChPTUFQMzQzMCkgaGFzIGJlZW4gaW1wbGVtZW50ZWQKK2FuZCB0ZXN0ZWQuIChEZWMgMjAwNikKKworCitTdXBwb3J0IGZvciBvdGhlciBPTUFQIGJvYXJkcyBjYW4gYmUgYWRkZWQuCisgCisgIAorRGlyZWN0b3J5IEhpZXJhcmNoeToKKz09PT09PT09PT09PT09PT09PT09CisKKy0gYm9hcmQJCUJvYXJkIGRlcGVuZGVudCBmaWxlcworLSBjcHUJCUNQVSBzcGVjaWZpYyBmaWxlcworLSBkcml2ZXJzCUNvbW1vbmx5IHVzZWQgZGV2aWNlIGRyaXZlcnMKKy0gbGliCQlMaWJyYXJpZXMKKyAKKy0gY3B1L2FybTkyNmVqcyBGaWxlcyBzcGVjaWZpYyB0byBBUk0gOTI2IENQVXMKKy0gY3B1L2FybTExMzYgRmlsZXMgc3BlY2lmaWMgdG8gQVJNIDExMzYgQ1BVcworLSBjcHUvb21hcDMgRmlsZXMgc3BlY2lmaWMgdG8gQVJNIENvcnRleEE4IENQVQorCisgCistIGJvYXJkL29tYXAxNzEwaDMKKwkJRmlsZXMgc3BlY2lmaWMgdG8gT01BUCAxNzEwIEgzIGJvYXJkcworLSBib2FyZC9vbWFwMjQyMGg0CisJCUZpbGVzIHNwZWNpZmljIHRvIE9NQVAgMjQyMCBINCBib2FyZHMKKy0gYm9hcmQvb21hcDI0MzBzZHAKKwkJRmlsZXMgc3BlY2lmaWMgdG8gT01BUCAyNDMwIDI0MzBzZHAgYm9hcmRzCistIGJvYXJkL29tYXAzNDMwc2RwCisJCUZpbGVzIHNwZWNpZmljIHRvIE9NQVAgMzQyMHNkcCBib2FyZHMKKworIAorU29mdHdhcmUgQ29uZmlndXJhdGlvbjoKKz09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbmZpZ3VyYXRpb24gaXMgdXN1YWxseSBkb25lIHVzaW5nIEMgcHJlcHJvY2Vzc29yIGRlZmluZXMuIENvbmZpZ3VyYXRpb24KK2RlcGVuZHMgb24gdGhlIGNvbWJpbmF0aW9uIG9mIGJvYXJkIGFuZCBDUFUgdHlwZTsgYWxsIHN1Y2ggaW5mb3JtYXRpb24gaXMKK2tlcHQgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUgImluY2x1ZGUvY29uZmlncy88Ym9hcmRfbmFtZT4uaCIuCisKK0V4YW1wbGU6IEZvciBhIEgzIG1vZHVsZSwgYWxsIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgYXJlIGluCisiaW5jbHVkZS9jb25maWdzL29tYXAxNzEwaDMuaCIuCisgIAorRm9yIGFsbCBzdXBwb3J0ZWQgYm9hcmRzIHRoZXJlIGFyZSByZWFkeS10by11c2UgZGVmYXVsdAorY29uZmlndXJhdGlvbnMgYXZhaWxhYmxlOyBqdXN0IHR5cGUgIm1ha2UgPGJvYXJkX25hbWU+X2NvbmZpZyIuCisKK0V4YW1wbGU6IEZvciBhIEgzIG1vZHVsZSB0eXBlOgorCisJY2QgeC1sb2FkCisJbWFrZSBvbWFwMTcxMGgzX2NvbmZpZworCitBZnRlciBhIGJvYXJkIGhhcyBiZWVuIGNvbmZpZ3VyZWQsIHR5cGUgIm1ha2UiIHRvIGJ1aWxkIGl0IHN1cHBvc2luZyB0aGUKK25lZWRlZCBjcm9zcyB0b29scyBhcmUgaW4geW91ciBwYXRoLgorCisgCitJbWFnZSBGb3JtYXQ6Cis9PT09PT09PT09PT09CisKK1gtTG9hZGVyIGV4cGVjdHMgT1MgYm9vdCBsb2FkZXIgKGUuZy4gVS1Cb290KSBpbiBOYW5kIGZsYXNoIHVzaW5nCitKRkZTMiBzdHlsZSBFQ0MuIAorCisKK1ByZXBhcmUgQm9vdGluZyBOYW5kIEZsYXNoOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FmdGVyIHlvdSBoYXZlIGJ1aWx0IHgtbG9hZC5iaW4gZm9yIHlvdXIgYm9hcmQsIHlvdSBuZWVkIHRvIGRvIHRoZQorZm9sbG93aW5ncyB0byBnZXQgaXQgaW50byBOYW5kIGZsYXNoOgorCisxLiBVc2UgVGV4YXMgSW5zdHJ1bWVudHMgSUZUIHRvIHNpZ24geC1sb2FkLmJpbi4gVGhpcyByZXN1bHRzIGluIGEKK3NpZ25lZCBpbWFnZSBjYWxsZWQgeC1sb2FkLmJpbi5pZnQuCisyLiBVc2UgVGV4YXMgSW5zdHJ1bWVudHMgRmxhc2hQcmVwIHRvIGdlbmVyYXRlIGEgLm91dCBmaWxlIHVzaW5nCitGbGFzaFdyaXRlck5hbmQgYW5kIHNwZWNpZnlpbmcgMCBhcyBuYW5kIHRhcmdldCBhZGRyZXNzLgorMy4gVXNlIFRleGFzIGluc3RydW1uZXRzIENvZGUgQ29tcG9zZXIgU3R1ZGlvIHRvIHJ1biB0aGUgLm91dCBmaWxlIAord2hpY2ggZmxhc2hlcyB4LWxvYWQuYmluLmlmdCB0byBOYW5kIGZsYXNoLgorCitOZXh0IHlvdSBuZWVkIHRvIGdldCB5b3VyIE9TIGJvb3QgbG9hZGVyIHRvIE5hbmQgYXQgdGhlIGFkZHJlc3MgeW91cgorWC1Mb2FkZXIgZXhwZWN0cy4gRm9yIHRoZSBIMyBleGFtcGxlLCB5b3UgY2FuIHVzZSBVLUJvb3QgdG8gZmxhc2ggVS1Cb290LgorWW91IGNhbid0IHVzZSBGbGFzaFdyaXRlck5hbmQgYmVjYXVzZSBpdCB1c2VzIFJPTSBjb2RlIEVDQyBzdHlsZS4gIAorCisKK01vcmUgSW5mb3JtYXRpb24KKz09PT09PT09PT09PT09PT0KKworT01BUDE3MTAgTkFORCBCb290aW5nIERlc2lnbiBEb2N1bWVudCBoYXMgbW9yZSBpbmZvcm1hdGlvbi4KKworSW1wbGVtZW5hdGlvbiBub3RlczoKKz09PT09PT09PT09PT09PT09PT09CitIMywgSDQgc3VwcG9ydCBOQU5EIGZsYXNoIGJvb3RpbmcKKzI0MzBzZHAgJiAzNDMwc2RwIHN1cHBvcnQgT25lTkFORCBib290aW5nCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYXJtX2NvbmZpZy5tayBiL3gtbG9hZGVyL2FybV9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkOTYyNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2FybV9jb25maWcubWsKQEAgLTAsMCArMSwyNCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR19BUk0gLURfX0FSTV9fCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjMjkyNAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9NYWtlZmlsZQpAQCAtMCwwICsxLDQ5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwOQorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjIE1hbmlrYW5kYW4gUGlsbGFpPG1hbmkucGlsbGFpQHRpLmNvbT4KKyMgVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIGJvYXJkL29tYXAzZXZtL01ha2VmaWxlCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gYW0zNTE3ZXZtLm8KK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vYW0zNTE3ZXZtLmMgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vYW0zNTE3ZXZtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0NGJlOQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9hbTM1MTdldm0uYwpAQCAtMCwwICsxLDkwOCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOQorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogTWFuaWthbmRhbiBQaWxsYWk8bWFuaS5waWxsYWlAdGkuY29tPgorICogVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIGJvYXJkL29tYXAzZXZtL29tYXAzZXZtLmMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+CisjaW5jbHVkZSA8ZmF0Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKy8qIFVzZWQgdG8gaW5kZXggaW50byBEUExMIHBhcmFtZXRlciB0YWJsZXMgKi8KK3N0cnVjdCBkcGxsX3BhcmFtIHsKKyAgICAgICAgdW5zaWduZWQgaW50IG07CisgICAgICAgIHVuc2lnbmVkIGludCBuOworICAgICAgICB1bnNpZ25lZCBpbnQgZnNlbDsKKyAgICAgICAgdW5zaWduZWQgaW50IG0yOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBsbF9wYXJhbSBkcGxsX3BhcmFtOworCisjZGVmaW5lIE1BWF9TSUxfSU5ERVgJMworCisvKiBEZWZpbml0aW9ucyBmb3IgRU1JRjQgY29uZmlndXJhdGlvbiB2YWx1ZXMgKi8KKyNkZWZpbmUJRU1JRjRfVElNMV9UX1JQCQkweDMKKyNkZWZpbmUJRU1JRjRfVElNMV9UX1JDRAkweDMKKyNkZWZpbmUJRU1JRjRfVElNMV9UX1dSCQkweDMKKyNkZWZpbmUJRU1JRjRfVElNMV9UX1JBUwkweDgKKyNkZWZpbmUJRU1JRjRfVElNMV9UX1JDCQkweEEKKyNkZWZpbmUJRU1JRjRfVElNMV9UX1JSRAkweDIKKyNkZWZpbmUJRU1JRjRfVElNMV9UX1dUUgkweDIKKworI2RlZmluZQlFTUlGNF9USU0yX1RfWFAJCTB4MgorI2RlZmluZQlFTUlGNF9USU0yX1RfT0RUCTB4MAorI2RlZmluZQlFTUlGNF9USU0yX1RfWFNOUgkweDFDCisjZGVmaW5lCUVNSUY0X1RJTTJfVF9YU1JECTB4QzgKKyNkZWZpbmUJRU1JRjRfVElNMl9UX1JUUAkweDEKKyNkZWZpbmUJRU1JRjRfVElNMl9UX0NLRQkweDIKKworI2RlZmluZQlFTUlGNF9USU0zX1RfVERRU0NLTUFYCTB4MAorI2RlZmluZQlFTUlGNF9USU0zX1RfUkZDCTB4MjUKKyNkZWZpbmUJRU1JRjRfVElNM19UX1JBU19NQVgJMHg3CisKKyNkZWZpbmUJRU1JRjRfUFdSX0lETEUJCTB4MgorI2RlZmluZQlFTUlGNF9QV1JfRFBEX0VOCTB4MAorI2RlZmluZQlFTUlGNF9QV1JfUE1fRU4JCTB4MAorI2RlZmluZQlFTUlGNF9QV1JfUE1fVElNCTB4MAorCisjZGVmaW5lCUVNSUY0X0lOSVRSRUZfRElTCTB4MAorI2RlZmluZQlFTUlGNF9QQVNSCQkweDAKKyNkZWZpbmUJRU1JRjRfUkVGUkVTSF9SQVRFCTB4NTBGCisKKy8qCisgKiBTRFJBTSBDb25maWcgcmVnaXN0ZXIKKyAqLworI2RlZmluZQlFTUlGNF9DRkdfU0RSQU1fVFlQCTB4MgorI2RlZmluZQlFTUlGNF9DRkdfSUJBTktfUE9TCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfRERSX1RFUk0JMHgwCisjZGVmaW5lCUVNSUY0X0NGR19ERFIyX0REUVMJMHgxCisjZGVmaW5lCUVNSUY0X0NGR19EWU5fT0RUCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfRERSX0RJU19ETEwJMHgwCisjZGVmaW5lCUVNSUY0X0NGR19TRFJfRFJWCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfQ1dMCQkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX05BUlJPV19NRAkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX0NMCQkweDUKKyNkZWZpbmUJRU1JRjRfQ0ZHX1JPV1NJWkUJMHgwCisjZGVmaW5lCUVNSUY0X0NGR19JQkFOSwkJMHgzCisjZGVmaW5lCUVNSUY0X0NGR19FQkFOSwkJMHgwCisjZGVmaW5lCUVNSUY0X0NGR19QR1NJWkUJMHgyCisKKy8qCisgKiBFTUlGNCBQSFkgQ29udHJvbCAxIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBFTUlGNF9ERFIxX1JEX0xBVAkweDYKKyNkZWZpbmUJRU1JRjRfRERSMV9QV1JETl9ESVMJMHgwCisjZGVmaW5lIEVNSUY0X0REUjFfU1RSQkVOX0VYVAkweDAKKyNkZWZpbmUgRU1JRjRfRERSMV9ETExfTU9ERQkweDAKKyNkZWZpbmUgRU1JRjRfRERSMV9WVFBfRFlOCTB4MAorI2RlZmluZSBFTUlGNF9ERFIxX0xCX0NLX1NFTAkweDAKKworLyoKKyAqIEVNSUY0IFBIWSBDb250cm9sIDIgcmVnaXN0ZXIgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIEVNSUY0X0REUjJfVFhfREFUQV9BTElHTgkweDAKKyNkZWZpbmUgRU1JRjRfRERSMl9SWF9ETExfQllQQVNTCTB4MAorCisvKiBGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIGxvd2xldmVsX2luaXQuUyAqLworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKKyNpZiAwCitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworI2VuZGlmCitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKK2V4dGVybiBpbnQgbW1jX2luaXQoaW50IHZlcmJvc2UpOworZXh0ZXJuIGJsb2NrX2Rldl9kZXNjX3QgKm1tY19nZXRfZGV2KGludCBkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIiAic3VicyAlMCwgJTEsICMxXG4iCisJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIobG9vcHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBib2FyZF9pbml0CisgKiBEZXNjcmlwdGlvbjogRWFybHkgaGFyZHdhcmUgaW5pdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKiBUT0RPOiBNb3ZlIGl0IHRvIGNvbW1vbiBwbGFjZSBzbyB0aGF0IHNob3VsZCBiZSB1c2VkCisgKiBmb3IgYWxsIE9NQVAgc2VyaWVzIG9mIGRldmljZXMKKyAqLwordTMyIGlzX2NwdV9mYW1pbHkodm9pZCkKK3sKKwl1MzIgY3B1aWQgPSAwLCBjcHVfZmFtaWx5ID0gMDsKKwl1MTYgaGF3a2V5ZTsKKworCWNwdWlkID0gX19yYXdfcmVhZGwoT01BUDM0WFhfQ09OVFJPTF9JRCk7CisJaGF3a2V5ZSAgPSAoY3B1aWQgPj4gSEFXS0VZRV9TSElGVCkgJiAweGZmZmY7CisKKwlzd2l0Y2ggKGhhd2tleWUpIHsKKwljYXNlIEhBV0tFWUVfQU0zNVhYOgorCWRlZmF1bHQ6CisJCWNwdV9mYW1pbHkgPSBDUFVfQU0zNVhYOworCQlicmVhazsKKwl9CisJcmV0dXJuIGNwdV9mYW1pbHk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdldF9kZXZpY2VfdHlwZSgpOiB0ZWxsIGlmIEdQL0hTL0VNVS9UU1QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9kZXZpY2VfdHlwZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChERVZJQ0VfTUFTSyk7CisgICAgICAgIHJldHVybihtb2RlID4+PSA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkgLSByZXR1cm4gU1lTX0JPT1RbNDowXQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfc3lzYm9vdF92YWx1ZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChTWVNCT09UX01BU0spOworICAgICAgICByZXR1cm4gbW9kZTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBnZXRfbWVtX3R5cGUodm9pZCkgLSByZXR1cm5zIHRoZSBraW5kIG9mIG1lbW9yeSBjb25uZWN0ZWQKKyAqIHRvIEdQTUMgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIGJvb3QgZm9ybS4gVXNlcyBTWVMgQk9PVCBzZXR0aW5ncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9tZW1fdHlwZSh2b2lkKQoreworICAgICAgICB1MzIgICBtZW1fdHlwZSA9IGdldF9zeXNib290X3ZhbHVlKCk7CisgICAgICAgIHN3aXRjaCAobWVtX3R5cGUpeworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICBjYXNlIDI3OiAgICByZXR1cm4gR1BNQ19OQU5EOworCisKKworICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgIAkJcmV0dXJuIE1NQ19OQU5EOworCisgICAgICAgICAgICBkZWZhdWx0OiAgICByZXR1cm4gR1BNQ19OQU5EOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwl1MzIgY3B1aWQ9MDsKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIiAoY3B1aWQpKTsKKwlpZigoY3B1aWQgICYgMHhmKSA9PSAweDApCisJCXJldHVybiBDUFVfMzQzMF9FUzE7CisJZWxzZQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMyOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3IzMiAtIGNsZWFyICYgc2V0IGEgdmFsdWUgaW4gYSBiaXQgcmFuZ2UgZm9yIGEgMzIgYml0IGFkZHJlc3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpCit7CisJdTMyIHRtcCwgbXNrID0gMDsKKwltc2sgPSAxIDw8IG51bV9iaXRzOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FpdF9vbl92YWx1ZSgpIC0gY29tbW9uIHJvdXRpbmUgdG8gYWxsb3cgd2FpdGluZyBmb3IgY2hhbmdlcyBpbgorICogICB2b2xhdGlsZSByZWdzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNvbmZpZ19lbWlmNF9kZHIoKSAtIEluaXQvQ29uZmlndXJlIEREUiBvbiBBTTM1MTcgRVZNIGJvYXJkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY29uZmlnX2VtaWY0X2Rkcih2b2lkKQoreworCXVuc2lnbmVkIGludCByZWd2YWw7CisKKwkvKiBTZXQgdGhlIEREUiBQSFkgcGFyYW1ldGVycyBpbiBQSFkgY3RybCByZWdpc3RlcnMgKi8KKwlyZWd2YWwgPSAoRU1JRjRfRERSMV9SRF9MQVQgfCAoRU1JRjRfRERSMV9QV1JETl9ESVMgPDwgNikgfAorCQkoRU1JRjRfRERSMV9TVFJCRU5fRVhUIDw8IDcpIHwgKEVNSUY0X0REUjFfRExMX01PREUgPDwgMTIpIHwKKwkJKEVNSUY0X0REUjFfVlRQX0RZTiA8PCAxNSkgfCAoRU1JRjRfRERSMV9MQl9DS19TRUwgPDwgMjMpKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9ERFJfUEhZQ1RMMSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfRERSX1BIWUNUTDFfU0hEVyk7CisKKwlyZWd2YWwgPSAoRU1JRjRfRERSMl9UWF9EQVRBX0FMSUdOIHwgKEVNSUY0X0REUjJfUlhfRExMX0JZUEFTUyA8PCAxKSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfRERSX1BIWUNUTDIpOworCisJLyogUmVzZXQgdGhlIEREUiBQSFkgYW5kIHdhaXQgdGlsbCBjb21wbGV0ZWQgKi8KKwlzcjMyKEVNSUY0X0lPREZUX1RMR0MsIDEwLCAxLCAxKTsKKwkvKldhaXQgdGlsbCB0aGF0IGJpdCBjbGVhcnMqLworCXdoaWxlICgoX19yYXdfcmVhZGwoRU1JRjRfSU9ERlRfVExHQykgJiBCSVQxMCkgPT0gMHgxKTsKKwkvKlJlLXZlcmlmeSB0aGUgRERSIFBIWSBzdGF0dXMqLworCXdoaWxlICgoX19yYXdfcmVhZGwoRU1JRjRfU0RSQU1fU1RTKSAmIEJJVDIpID09IDB4MCk7CisKKwlzcjMyKEVNSUY0X0lPREZUX1RMR0MsIDAsIDEsIDEpOworCS8qIFNldCBTRFIgdGltaW5nIHJlZ2lzdGVycyAqLworCXJlZ3ZhbCA9IChFTUlGNF9USU0xX1RfV1RSIHwgKEVNSUY0X1RJTTFfVF9SUkQgPDwgMykgfAorCQkoRU1JRjRfVElNMV9UX1JDIDw8IDYpIHwgKEVNSUY0X1RJTTFfVF9SQVMgPDwgMTIpIHwKKwkJKEVNSUY0X1RJTTFfVF9XUiA8PCAxNykgfCAoRU1JRjRfVElNMV9UX1JDRCA8PCAyMSkgfAorCQkoRU1JRjRfVElNMV9UX1JQIDw8IDI1KSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfU0RSQU1fVElNMSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfU0RSQU1fVElNMV9TSERXKTsKKworCXJlZ3ZhbCA9IChFTUlGNF9USU0yX1RfQ0tFIHwgKEVNSUY0X1RJTTJfVF9SVFAgPDwgMykgfAorCQkoRU1JRjRfVElNMl9UX1hTUkQgPDwgNikgfCAoRU1JRjRfVElNMl9UX1hTTlIgPDwgMTYpIHwKKwkJKEVNSUY0X1RJTTJfVF9PRFQgPDwgMjUpIHwgKEVNSUY0X1RJTTJfVF9YUCA8PCAyOCkpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTIpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTJfU0hEVyk7CisKKwlyZWd2YWwgPSAoRU1JRjRfVElNM19UX1JBU19NQVggfCAoRU1JRjRfVElNM19UX1JGQyA8PCA0KSB8CisJCShFTUlGNF9USU0zX1RfVERRU0NLTUFYIDw8IDEzKSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfU0RSQU1fVElNMyk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfU0RSQU1fVElNM19TSERXKTsKKworCS8qIFNldCB0aGUgUFdSIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlyZWd2YWwgPSAoRU1JRjRfUFdSX1BNX1RJTSB8IChFTUlGNF9QV1JfUE1fRU4gPDwgOCkgfAorCQkoRU1JRjRfUFdSX0RQRF9FTiA8PCAxMCkgfCAoRU1JRjRfUFdSX0lETEUgPDwgMzApKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9QV1JfTUdUX0NUUkwpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1BXUl9NR1RfQ1RSTF9TSERXKTsKKworCS8qIFNldCB0aGUgRERSIHJlZnJlc2ggcmF0ZSBjb250cm9sIHJlZ2lzdGVyICovCisJcmVndmFsID0gKEVNSUY0X1JFRlJFU0hfUkFURSB8IChFTUlGNF9QQVNSIDw8IDI0KSB8CisJCShFTUlGNF9JTklUUkVGX0RJUyA8PCAzMSkpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1JGQ1IpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1JGQ1JfU0hEVyk7CisKKwkvKiBzZXQgdGhlIFNEUkFNIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwlyZWd2YWwgPSAoRU1JRjRfQ0ZHX1BHU0laRSB8IChFTUlGNF9DRkdfRUJBTksgPDwgMykgfAorCQkoRU1JRjRfQ0ZHX0lCQU5LIDw8IDQpIHwgKEVNSUY0X0NGR19ST1dTSVpFIDw8IDcpIHwKKwkJKEVNSUY0X0NGR19DTCA8PCAxMCkgfCAoRU1JRjRfQ0ZHX05BUlJPV19NRCA8PCAxNCkgfAorCQkoRU1JRjRfQ0ZHX0NXTCA8PCAxNikgfCAoRU1JRjRfQ0ZHX1NEUl9EUlYgPDwgMTgpIHwKKwkJKEVNSUY0X0NGR19ERFJfRElTX0RMTCA8PCAyMCkgfCAoRU1JRjRfQ0ZHX0RZTl9PRFQgPDwgMjEpIHwKKwkJKEVNSUY0X0NGR19ERFIyX0REUVMgPDwgMjMpIHwgKEVNSUY0X0NGR19ERFJfVEVSTSA8PCAyNCkgfAorCQkoRU1JRjRfQ0ZHX0lCQU5LX1BPUyA8PCAyNykgfCAoRU1JRjRfQ0ZHX1NEUkFNX1RZUCA8PCAyOSkpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX0NGRyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa19zcGVlZCAtIGRldGVybWluZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZAorICogIGJhc2VkIG9uIGtub3duIDMya0h6IGNsb2NrIGFuZCBncHRpbWVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X29zY19jbGtfc3BlZWQodm9pZCkKK3sKKwl1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSTV9DTEtTUkNfQ1RSTCk7CisJLyogSWYgU1lTX0NMSyBpcyBiZWluZyBkaXZpZGVkIGJ5IDIsIHJlbW92ZSBmb3Igbm93ICovCisJdmFsID0gKHZhbCAmICh+QklUNykpIHwgQklUNjsKKwlfX3Jhd193cml0ZWwodmFsLCBQUk1fQ0xLU1JDX0NUUkwpOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa2luX3NlbCgpIC0gcmV0dXJucyB0aGUgc3lzX2Nsa2luX3NlbCBmaWVsZCB2YWx1ZSBiYXNlZCBvbgorICogICAtLSBpbnB1dCBvc2NpbGxhdG9yIGNsb2NrIGZyZXF1ZW5jeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGdldF9zeXNfY2xraW5fc2VsKHUzMiBvc2NfY2xrLCB1MzIgKnN5c19jbGtpbl9zZWwpCit7CisJaWYob3NjX2NsayA9PSBTMzhfNE0pCisJCSpzeXNfY2xraW5fc2VsPSAgNDsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzI2TSkKKwkJKnN5c19jbGtpbl9zZWwgPSAzOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTlfMk0pCisJCSpzeXNfY2xraW5fc2VsID0gMjsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEzTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAxOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHByY21faW5pdCgpIC0gaW5pdHMgY2xvY2tzIGZvciBQUkNNIGFzIGRlZmluZWQgaW4gY2xvY2tzLmgKKyAqICAgLS0gY2FsbGVkIGZyb20gU1JBTSwgb3IgRmxhc2ggKHVzaW5nIHRlbXAgU1JBTSBzdGFjaykuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHByY21faW5pdCh2b2lkKQoreworCXUzMiBvc2NfY2xrPTAsIHN5c19jbGtpbl9zZWw7CisJZHBsbF9wYXJhbSAqZHBsbF9wYXJhbV9wOworCXUzMiBjbGtfaW5kZXgsIHNpbF9pbmRleDsKKworCS8qIEdhdWdlIHRoZSBpbnB1dCBjbG9jayBzcGVlZCBhbmQgZmluZCBvdXQgdGhlIHN5c19jbGtpbl9zZWwKKwkgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBjbG9jay4KKwkgKi8KKwlvc2NfY2xrID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChvc2NfY2xrLCAmc3lzX2Nsa2luX3NlbCk7CisKKwlzcjMyKFBSTV9DTEtTRUwsIDAsIDMsIHN5c19jbGtpbl9zZWwpOyAvKiBzZXQgaW5wdXQgY3J5c3RhbCBzcGVlZCAqLworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlLzIgKi8KKwlpZihzeXNfY2xraW5fc2VsID4gMikgeworCQlzcjMyKFBSTV9DTEtTUkNfQ1RSTCwgNiwgMiwgMik7LyogaW5wdXQgY2xvY2sgZGl2aWRlciAqLworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsLzI7CisJfSBlbHNlIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDEpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbDsKKwl9CisKKwkvKiBUaGUgRFBMTCB0YWJsZXMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHN5c2NsayB2YWx1ZSBhbmQKKwkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkgKiB0aGUgdmFsdWVzIGZvciB0aGF0IGlucHV0IHN5c2NsayBmcm9tIHRoZSBEUExMIHBhcmFtIHRhYmxlCisJICogYW5kIHNpbF9pbmRleCB3aWxsIGdldCB0aGUgdmFsdWVzIGZvciB0aGF0IFN5c0NsayBmb3IgdGhlCisJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuCisJICovCisJc2lsX2luZGV4ID0gZ2V0X2NwdV9yZXYoKSAtIDE7CisKKwkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBzcjMyKENNX0NMS1NFTDJfRU1VKSBzZXQgb3ZlcnJpZGUgdG8gd29yayB3aGVuIGFzbGVlcCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsJLyogbTN4MiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCAyLCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogU2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBTZXQgTSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CQkJLyogOTZNIFNyYyAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gUEVSICBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBjbGtfaW5kZXg7CisJLyogUEVSIERQTEwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJLyogc2V0IE01ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA1LCBQRVJfTTRYMik7CS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkvKiBzZXQgTTMgKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogc2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIHNldCBtICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogc2V0IG4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMjAsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7LyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOwkvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIFNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogU2V0IE0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogU2V0IE4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsgLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCS8qIFNldCB1cCBHUFRpbWVycyB0byBzeXNfY2xrIHNvdXJjZSBvbmx5ICovCisgCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgOCwgMHhmZik7CisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMCwgMSwgMSk7CisKKwlkZWxheSg1MDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZWN1cmVfdW5sb2NrCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgc2VjdXJpdHkgcmVnaXN0ZXJzIGZvciBhY2Nlc3MKKyAqIChHUCBEZXZpY2Ugb25seSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwlpbnQgbW9kZTsKKworCS8qIGlmIEdQIGRldmljZSB1bmxvY2sgZGV2aWNlIFNSQU0gZm9yIGdlbmVyYWwgdXNlICovCisJLyogc2VjdXJlIGNvZGUgYnJlYWtzIGZvciBTZWN1cmUvRW11bGF0aW9uIGRldmljZSAtIEhTL0UvVCovCisJbW9kZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCWlmIChtb2RlID09IEdQX0RFVklDRSkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNfaW5pdAorICogRGVzY3JpcHRpb246IERvZXMgZWFybHkgc3lzdGVtIGluaXQgb2YgbXV4aW5nIGFuZCBjbG9ja3MuCisgKiAtIENhbGxlZCBhdCB0aW1lIHdoZW4gb25seSBzdGFjayBpcyBhdmFpbGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBzX2luaXQodm9pZCkKK3sKKwl3YXRjaGRvZ19pbml0KCk7CisjaWZkZWYgQ09ORklHXzM0MzBfQVNfMzQxMAorCS8qIHNldHVwIHRoZSBzY2FsYWJpbGl0eSBjb250cm9sIHJlZ2lzdGVyIGZvcgorCSAqIDM0MzAgdG8gd29yayBpbiAzNDEwIG1vZGUKKwkgKi8KKwlfX3Jhd193cml0ZWwoMHg1QUJGLENPTlRST0xfU0NBTEFCTEVfT01BUF9PQ1ApOworI2VuZGlmCisJdHJ5X3VubG9ja19tZW1vcnkoKTsKKwlzZXRfbXV4Y29uZl9yZWdzKCk7CisJZGVsYXkoMTAwKTsKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCisJLyogZW5hYmxlIHRoZSBERFJQSFkgY2xrICovCisJc3IzMigoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHg1ODgpLCAxNSwgMTUsIDB4MSk7CisJLyogZW5hYmxlIHRoZSBFTUlGNCBjbGsgKi8KKwlzcjMyKChPTUFQMzRYWF9DVFJMX0JBU0UgKyAweDU4OCksIDE0LCAxNCwgMHgxKTsKKwkvKiBFbmFibGUgdGhlIHBlcmlwaGVyYWwgY2xvY2tzICovCisJc3IzMigoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHg1OUMpLCAwLCA0LCAweEYpOworCXNyMzIoKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NTlDKSwgOCwgMTAsIDB4Nyk7CisKKwkvKiBicmluZyBjcGdtYWMgb3V0IG9mIHJlc2V0ICovCisJc3IzMigoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHg1OTgpLCAxLCAxLCAweDEpOworCisJLyogQ29uZmlndXJlIHRoZSBFTUlGNCBmb3Igb3VyIEREUiAqLworCWNvbmZpZ19lbWlmNF9kZHIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG1pc2NfaW5pdF9yCisgKiBEZXNjcmlwdGlvbjogSW5pdCBldGhlcm5ldCAoZG9uZSBoZXJlIHNvIHVkZWxheSB3b3JrcykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRyYW1faW5pdAorICogRGVzY3JpcHRpb246IHNldHMgdWJvb3RzIGlkZWEgb2Ygc2RyYW0gc2l6ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisKKwkvKiBFbmFibGUgVUFSVDIgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDE0LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAxNCwgMSwgMHgxKTsKKworCS8qIEVuYWJsZSBVQVJUMiBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDExLCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOX1BFUiwgMTEsIDEsIDB4MSk7CisjZW5kaWYKKwkvKiBFbmFibGUgTU1DMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworCisJLyogRW5hYmxlIE1NQzIgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDI1LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAyNSwgMSwgMHgxKTsKKworCWRlbGF5KDEwMDApOworfQorCisvKiBTZXQgTVVYIGZvciBVQVJULCBHUE1DLCBTRFJDLCBHUElPICovCisKKy8qCisgKiBJRU4gIC0gSW5wdXQgRW5hYmxlCisgKiBJRElTIC0gSW5wdXQgRGlzYWJsZQorICogUFREICAtIFB1bGwgdHlwZSBEb3duCisgKiBQVFUgIC0gUHVsbCB0eXBlIFVwCisgKiBESVMgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBpbmFjdGl2ZQorICogRU4gICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgYWN0aXZlCisgKiBNMCAgIC0gTW9kZSAwCisgKiBUaGUgY29tbWVudGVkIHN0cmluZyBnaXZlcyB0aGUgZmluYWwgbXV4IGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcGluCisgKi8KKyNkZWZpbmUgTVVYX0RFRkFVTFQoKVwKKwlNVVhfVkFMKENQKFNEUkNfRDApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDYpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENiovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q4KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDkpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTYpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjcpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMzApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMzEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19DTEspLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0NMSyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMxKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMzKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzMqL1wKKwlNVVhfVkFMKENQKHNkcmNfY2tlMCksICAgICAgKE0wKSkgLypTRFJDX0NLRTAqL1wKKwlNVVhfVkFMKENQKHNkcmNfY2tlMSksICAgICAgKE0wKSkgLypTRFJDX0NLRTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTEpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EyKi9cCisJTVVYX1ZBTChDUChHUE1DX0EzKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTQpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E2KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTYqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTcpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOCksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E5KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTkqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxKi9cCisJTVVYX1ZBTChDUChHUE1DX0QyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDUqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDYpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENiovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q4KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDgqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDkpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EOSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MwKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzAqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMSksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MxKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzMqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M0Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M2KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzYqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0NMSyksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQ0xLKi9cCisJTVVYX1ZBTChDUChHUE1DX05BRFZfQUxFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkFEVl9BTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OT0UqL1wKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OV0UqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLCAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQkUwX0NMRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYxKi9cCisJTVVYX1ZBTChDUChHUE1DX05XUCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldQKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDEpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19XQUlUMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMiksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzY0Ki9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTQpKSAvKkdQSU9fNjUqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTgpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184OCovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzg5Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOTAqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMjEpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT185MSovXAorCU1VWF9WQUwoQ1AoQ0FNX1dFTiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2NyovXAorCU1VWF9WQUwoQ1AoVUFSVDNfVFhfSVJUWCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1RYKi9cCisJTVVYX1ZBTChDUChVQVJUM19SVFNfU0QpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDNfQ1RTX1JDVFgpLCAgICAgIChJRU4gfCBQVFUgfCBESVMgfCBNMCkpIC8qVUFSVDFfQ1RTKi9cCisJTVVYX1ZBTChDUChVQVJUM19SWF9JUlJYKSwgICAgICAgKElFTiB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SWCovXAorCS8qRXhwYW5zaW9uIGNhcmQgICovXAorCU1VWF9WQUwoQ1AoTU1DMV9DTEspLCAgICAgICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypNTUMxX0NMSyovXAorCU1VWF9WQUwoQ1AoTU1DMV9DTUQpLCAgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0NNRCovXAorCU1VWF9WQUwoQ1AoTU1DMV9EQVQwKSwgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0RBVDAqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUMSksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQxKi9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDIpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUMiovXAorCU1VWF9WQUwoQ1AoTU1DMV9EQVQzKSwgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0RBVDMqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUNCksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQ0Ki9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDUpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUNSovXAorCU1VWF9WQUwoQ1AoTU1DMV9EQVQ2KSwgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0RBVDYqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUNyksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQ3Ki9cCisJTVVYX1ZBTChDUChNY0JTUDFfRFgpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTU4Ki9cCisJTVVYX1ZBTChDUChTWVNfMzJLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNZU18zMksqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzMgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNCAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT181ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184ICovXAorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzE4NiovXAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX25UUlNUKi9cCisJTVVYX1ZBTChDUChKVEFHX1RDSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVENLKi9cCisJTVVYX1ZBTChDUChKVEFHX1RNUyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVE1TKi9cCisJTVVYX1ZBTChDUChKVEFHX1RESSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVERJKi9cCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfRU1VMCovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTEqL1wKKwlNVVhfVkFMKENQKEVUS19DTEspLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMiovXAorCU1VWF9WQUwoQ1AoRVRLX0NUTCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzEzKi9cCisJTVVYX1ZBTChDUChFVEtfRDAgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTQqL1wKKwlNVVhfVkFMKENQKEVUS19EMSApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QyICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjQqL1wKKwlNVVhfVkFMKENQKEVUS19EMTEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjcqL1wKKwlNVVhfVkFMKENQKEVUS19EMTQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxNSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI5Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNldF9tdXhjb25mX3JlZ3MKKyAqIERlc2NyaXB0aW9uOiBTZXR0aW5nIHVwIHRoZSBjb25maWd1cmF0aW9uIE11eCByZWdpc3RlcnMKKyAqICAgICAgICAgICAgICBzcGVjaWZpYyB0byB0aGUgaGFyZHdhcmUuIE1hbnkgcGlucyBuZWVkCisgKiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQgZnJvbSBwcm90ZWN0IHRvIHByaW1hcnkgbW9kZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwlNVVhfREVGQVVMVCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbmFuZCtfaW5pdAorICogRGVzY3JpcHRpb246IFNldCB1cCBuYW5kIGZvciBuYW5kIGFuZCBqZmZzMiBjb21tYW5kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG5hbmRfaW5pdCh2b2lkKQoreworCS8qIGdsb2JhbCBzZXR0aW5ncyAqLworCV9fcmF3X3dyaXRlbCgweDEwLCBHUE1DX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBHUE1DX0lSUUVOQUJMRSk7CS8qIGlzcidzIHNvdXJjZXMgbWFza2VkICovCisJX19yYXdfd3JpdGVsKDAsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsvKiB0aW1lb3V0IGRpc2FibGUgKi8KKworCS8qIFNldCB0aGUgR1BNQyBWYWxzIC4gRm9yIE5BTkQgYm9vdCBvbiAzNDMwU0RQLCBOQU5EIGlzIG1hcHBlZCBhdCBDUzAKKyAgICAgICAgICogICwgTk9SIGF0IENTMSBhbmQgTVBEQiBhdCBDUzMuIEFuZCBvbmVOQU5EIGJvb3QsIHdlIG1hcCBvbmVOQU5EIGF0IENTMC4KKwkgKiAgV2UgY29uZmlndXJlIG9ubHkgR1BNQyBDUzAgd2l0aCByZXF1aXJlZCB2YWx1ZXMuIENvbmZpZ2lyaW5nIG90aGVyIGRldmljZXMKKwkgKiAgYXQgb3RoZXIgQ1MgaW4gZG9uZSBpbiB1LWJvb3QgYW55d2F5LiBTbyB3ZSBkb24ndCBoYXZlIHRvIGJvdGhlciBkb2luZyBpdCBoZXJlLgorICAgICAgICAgKi8KKwlfX3Jhd193cml0ZWwoMCAsIEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCk7CisJZGVsYXkoMTAwMCk7CisKKwlpZiAoKGdldF9tZW1fdHlwZSgpID09IEdQTUNfTkFORCkgfHwgKGdldF9tZW1fdHlwZSgpID09IE1NQ19OQU5EKSl7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHMyArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNiArIEdQTUNfQ09ORklHX0NTMCk7CisKKyAgICAgICAgCS8qIEVuYWJsZSB0aGUgR1BNQyBNYXBwaW5nICovCisgICAgICAgIAlfX3Jhd193cml0ZWwoKCAoKE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgJiAweEYpPDw4KSB8CisgICAgICAgIAkJICAgICAoKE5BTkRfQkFTRV9BRFI+PjI0KSAmIDB4M0YpIHwKKyAgICAgICAgCQkgICAgICgxPDw2KSApLCAgKEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCkpOworICAgICAgICAJZGVsYXkoMjAwMCk7CisKKyAgICAgICAgIAlpZiAobmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKyAgICAgICAgCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKyNlbmRpZgorICAgICAgICAJCXJldHVybiAxOworICAgICAgICAJfQorCisJfQorCisJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX09ORU5BTkQpIHx8IChnZXRfbWVtX3R5cGUoKSA9PSBNTUNfT05FTkFORCkpeworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0ICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworCisgICAgICAgIAkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworICAgICAgICAJX19yYXdfd3JpdGVsKCggKChPTUFQMzRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorICAgICAgICAJCSAgICAgKChPTkVOQU5EX0JBU0U+PjI0KSAmIDB4M0YpIHwKKyAgICAgICAgCQkgICAgICgxPDw2KSApLCAgKEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCkpOworICAgICAgICAJZGVsYXkoMjAwMCk7CisKKyAgICAgICAgCWlmIChvbmVuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorICAgICAgICAJCXByaW50ZigiT25lTkFORCBVbnN1cHBvcnRlZCAhXG4iKTsKKyNlbmRpZgorICAgICAgICAJCXJldHVybiAxOworICAgICAgICAJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCit0eXBlZGVmIGludCAobW1jX2Jvb3RfYWRkcikgKHZvaWQpOworaW50IG1tY19ib290KHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKworICAgICAgIGxvbmcgc2l6ZSA9IDA7CisjaWZkZWYgQ0ZHX0NNRF9GQVQKKyAgICAgICBibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyA9IE5VTEw7CisgICAgICAgdW5zaWduZWQgY2hhciByZXQgPSAwOworCisgICAgICAgcHJpbnRmKCJTdGFydGluZyBYLWxvYWRlciBvbiBNTUMgXG4iKTsKKworICAgICAgIHJldCA9IG1tY19pbml0KDEpOworICAgICAgIGlmKHJldCA9PSAwKXsKKyAgICAgICAgICAgICAgIHByaW50ZigiXG4gTU1DIGluaXQgZmFpbGVkIFxuIik7CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisKKyAgICAgICBkZXZfZGVzYyA9IG1tY19nZXRfZGV2KDApOworICAgICAgIGZhdF9yZWdpc3Rlcl9kZXZpY2UoZGV2X2Rlc2MsIDEpOworICAgICAgIHNpemUgPSBmaWxlX2ZhdF9yZWFkKCJ1LWJvb3QuYmluIiwgYnVmLCAwKTsKKyAgICAgICBpZiAoc2l6ZSA9PSAtMSkgeworICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorICAgICAgIHByaW50ZigiXG4lbGQgQnl0ZXMgUmVhZCBmcm9tIE1NQyBcbiIsIHNpemUpOworCisgICAgICAgcHJpbnRmKCJTdGFydGluZyBPUyBCb290bG9hZGVyIGZyb20gTU1DLi4uXG4iKTsKKyNlbmRpZgorICAgICAgIHJldHVybiBzaXplOworfQorCisvKiBvcHRpb25hbGx5IGRvIHNvbWV0aGluZyBsaWtlIGJsaW5raW5nIExFRCAqLwordm9pZCBib2FyZF9oYW5nICh2b2lkKQoreyB3aGlsZSAoMCkge307fQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyMTJhNAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9jb25maWcubWsKQEAgLTAsMCArMSwxOSBAQAorIyAoQykgQ29weXJpZ2h0IDIwMDkKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBPTUFQM0VWTSBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzIworIworIyBPTUFQM0VWTSBoYXMgMSBiYW5rIG9mIDEyOE1CIG1QT1AtU0RSQU0gb24gQ1MwCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisKKyMgRm9yIHVzZSBpZiB5b3Ugd2FudCBYLUxvYWRlciB0byByZWxvY2F0ZSBmcm9tIFNSQU0gdG8gRERSCisjVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCitURVhUX0JBU0UgPSAweDQwMjAwODAwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OGY2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vcGxhdGZvcm0uUwpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDkKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIE1hbmlrYW5kYW4gUGlsbGFpIDxtYW5pLnBpbGxhaUB0aS5jb20+CisgKiBUaGlzIGZpbGUgaXMgY29waWVkIGZyb20gYm9hcmQvb21hcDNldm0vcGxhdGZvcm0uUworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8KKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IDM0MzAgWC1sb2FkZXIgY3VycmVudGx5IGRvZXMgbm90IHVzZSB0aGlzIGNvZGUuCisqICAgSXQgY291bGQgYmUgcmVtb3ZlZCBpdHMgaXMga2VwdCBmb3IgY29tcGF0YWJpbHkgd2l0aCB1LWJvb3QuCisgKgorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gQ01fQ0xLRU5fUExMLWJ5cGFzcyB2YWx1ZQorICogIFIxID0gQ01fQ0xLU0VMMV9QTEwtbSwgbiwgYW5kIGRpdmlkZXIgdmFsdWVzCisgKiAgUjIgPSBDTV9DTEtTRUxfQ09SRS1kaXZpZGVyIHZhbHVlcworICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoKKyAqICBOb3RlOiBJZiBjb3JlIHVubG9ja3MvcmVsb2NrcyBhbmQgU0RSQU0gaXMgcnVubmluZyBmYXN0IGFscmVhZHkgaXQgZ2V0cworICogICAgICAgIGNvbmZ1c2VkLiAgQSByZXNldCBvZiB0aGUgY29udHJvbGxlciBnZXRzIGl0IGJhY2suICBUYWtpbmcgYXdheSBpdHMKKyAqICAgICAgICBMMyB3aGVuIGl0cyBub3QgaW4gc2VsZiByZWZyZXNoIHNlZW1zIGJhZCBmb3IgaXQuICBOb3JtYWxseSwgdGhpcyBjb2RlCisgKiAgICAgICAgcnVucyBmcm9tIGZsYXNoIGJlZm9yZSBTRFIgaXMgaW5pdCBzbyB0aGF0IHNob3VsZCBiZSBvay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN0bWZkIHNwISwge3I0LXI2fQorCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByNCwgcGxsX2N0bF9hZGQKKyAgICAgICAgc3RyICAgICByMCwgW3I0XQord2FpdDE6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJlcSAgICAgd2FpdDEgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNSwgcGxsX2Rpdl9hZGQxCisgICAgICAgIHN0ciAgICAgcjEsIFtyNV0gICAgICAgICAgLyogc2V0IG0sIG4sIG0yICovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMgorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIC8qIHNldCBsMy9sNC8uLiBkaXZpZGVycyovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMyAgLyogd2t1cCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDMgIC8qIHJzbSB2YWwgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDUgIC8qIGVtdSAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDUKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzVfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIFtyNV0KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbG9jayBEUExMMyBhbmQgd2FpdCBhIGJpdCAqLworICAgICAgICBvcnIgICAgIHIwLCByMCwgIzB4NyAgIC8qIHNldCB1cCBmb3IgbG9jayBtb2RlICovCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8KKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKy8qIFRoZSBOb3IgaGFzIHRvIGJlIGluIHRoZSBGbGFzaCBCYXNlIENTMCBmb3IgdGhpcyBjb25kaXRpb24gdG8gaGFwcGVuICovCitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHMSkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHMykKK2ZsYXNoX2NmZzNfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc0KQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzUpCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisKKyNlbmRpZgorCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4KKyAqIFRoZSB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBzeXNjbGsgYW5kIGZvciBFUzEgYW5kIEVTMi4KKyAqLworCittcHVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZFCisud29yZCAweDA3Cisud29yZCAweDA1Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MUY0Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxNzkKKy53b3JkIDB4MTIKKy53b3JkIDB4MDQKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MTkKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQQorLndvcmQgMHgzMgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfbXB1X2RwbGxfcGFyYW0KK2dldF9tcHVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIG1wdV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitpdmFfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTY4Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MEIKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDEzRgorLndvcmQgMHgzMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgxNworLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitjb3JlX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgwRQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgxMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE0QworLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDIxCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxCisud29yZCAweDEzCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0veC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTBjZTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0veC1sb2FkLmxkcwpAQCAtMCwwICsxLDUyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA5CisgKiBNYW5pa2FuZGFuIFBpbGxhaTxtYW5pLnBpbGxhaUB0aS5jb20+CisgKiBUaGlzIGZpbGUgaXMgY29waWVkIGZyb20gYm9hcmQvb21hcDNldm0veC1sb2FkLmxkcworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjY3OTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDYyIEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorIyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyAgICBEZXNjcmlwdGlvbjoKKyMgICAgICBUaGlzIGZpbGUgaXMgdGhlIG1ha2UgZmlsZSBmb3IgcG9ydGlvbnMgb2YgWC1Mb2FkZXIgc3BlY2lmaWMKKyMgICAgICB0byB0aGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorIworCisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk6PSBkaWFtb25kLm8gbXV4Lm8gcHJjbS5vCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKK0NQUEZMQUdTICs9IC1JJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpCisKK1NSQ1MgICAgOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMgICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKFNPQkpTKSAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKFNPQkpTKSAkKE9CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOiAgY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0ZTQ1OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL2NvbmZpZy5tawpAQCAtMCwwICsxLDIyIEBACisKKworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBPTUFQM0VWTSBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzIworIworIyBPTUFQM0VWTSBoYXMgMSBiYW5rIG9mIDEyOE1CIG1QT1AtU0RSQU0gb24gQ1MwCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisKKyMgRm9yIHVzZSBpZiB5b3Ugd2FudCBYLUxvYWRlciB0byByZWxvY2F0ZSBmcm9tIFNSQU0gdG8gRERSCisjVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCitURVhUX0JBU0UgPSAweDQwMjAwMDAwCitTVEFDS19CQVNFID0gMHg0MDIwRkNCMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvZGlhbW9uZC5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvZGlhbW9uZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTc3OTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9kaWFtb25kLmMKQEAgLTAsMCArMSwxMDQ3IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogICAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0FDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBvbiBHUElPLCBSQU0gYW5kIGZsYXNoIGluaXRpYWxpemF0aW9uLgorICoKKyAqICAgICAgVGhpcyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgT01BUDMgRVZNIGVxdWl2YWxlbnQgZmlsZS4KKyAqCisgKiAgICAgIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG9yZGVyIGlzIHJvdWdobHk6CisgKgorICogICAgICAgIDEpIHNfaW5pdAorICogICAgICAgIDIpIGJvYXJkX2luaXQKKyAqICAgICAgICAzKSBtaXNjX2luaXRfcgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjZGVmaW5lIE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUyAoMykKKworCit2b2lkCit1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykgeworCWRlbGF5KHVzZWNzKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2dldF9jcHVfaWQodm9pZCkKK3sKKwl1MzIgY3B1aWQgPSAwOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisKKwlyZXR1cm4gKGNwdWlkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlpZiAoKGNwdWlkICAmIDB4ZikgPT0gMHgwKSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMxKTsKKworCX0gZWxzZSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMyKTsKKworCX0KKworfQorCit1MzIKK2lzX2NwdV9mYW1pbHkodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisJdTMyIGNwdV9mYW1pbHkgPSAwLCBvbWFwMzR4eF9pZCA9IDA7CisJdTE2IGhhd2tleWU7CisKKwlpZiAoKGNwdWlkICYgMHhmKSA9PSAweDApIHsKKwkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKworCX0gZWxzZSB7CisJCW9tYXAzNHh4X2lkID0gX19yYXdfcmVhZGwoT01BUDM0WFhfQ09OVFJPTF9JRCk7CisJCWhhd2tleWUgID0gKG9tYXAzNHh4X2lkID4+IEhBV0tFWUVfU0hJRlQpICYgMHhmZmZmOworCisJCXN3aXRjaCAoaGF3a2V5ZSkgeworCisJCWNhc2UgSEFXS0VZRV9BTTM1WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX0FNMzVYWDsKKwkJCWJyZWFrOworCisJCWNhc2UgSEFXS0VZRV9PTUFQMzZYWDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM2WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM0WFg6CisJCWRlZmF1bHQ6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCQkJYnJlYWs7CisKKwkJfQorCX0KKworCXJldHVybiAoY3B1X2ZhbWlseSk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorY3B1X2lzXzM0MTAodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCWlmKGdldF9jcHVfcmV2KCkgPCBDUFVfMzQzMF9FUzIpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogcmVhZCBzY2FsYWJpbGl0eSBzdGF0dXMgYW5kIHJldHVybiAxIGZvciAzNDEwKi8KKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX1NUQVRVUyk7CisJCS8qIENoZWNrIHdoZXRoZXIgTVBVIGZyZXF1ZW5jeSBpcyBzZXQgdG8gMjY2IE1IeiB3aGljaAorCQkgKiBpcyBub21pbmFsIGZvciAzNDEwLiBJZiB5ZXMgcmV0dXJuIHRydWUgZWxzZSBmYWxzZQorCQkgKi8KKwkJaWYgKCgoc3RhdHVzID4+IDgpICYgMHgzKSA9PSAweDIpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogIHZvaWQgc3IzMigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGNsZWFycyBhbmQgc2V0cyBhIHZhbHVlIGluIGEgYml0IGV4dGVudCBmb3IgYQorICogICAgMzItYml0IHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyBhdCB3aGljaCB0byBjbGVhciBhbmQgc2V0IHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICAgICAgICAgIHNwZWNpZmllZCAzMi1iaXQgdmFsdWUuCisgKiAgICBzdGFydF9iaXQgLSBUaGUgZmlyc3QgYml0IG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgbnVtX2JpdHMgIC0gVGhlIHJhbmdlIG9mIGJpdHMgb2YgdGhlIDMyLWJpdCBkYXRhIHRvIGNsZWFyIGFuZCBzZXQuCisgKiAgICB2YWx1ZSAgICAgLSBUaGUgdmFsdWUgdG8gc2V0LgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyB3aXRoIHRoZSBzcGVjaWZpZWQgYml0IGV4dGVudCBjbGVhcmVkIGFuZAorICogICAgICAgICAgICAgICAgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisKKwltc2sgPSAoMSA8PCBudW1fYml0cyk7CisJLS1tc2s7CisJdG1wID0gX19yYXdfcmVhZGwoYWRkcikgJiB+KG1zayA8PCBzdGFydF9iaXQpOworCXRtcCB8PSAgdmFsdWUgPDwgc3RhcnRfYml0OworCV9fcmF3X3dyaXRlbCh0bXAsIGFkZHIpOworfQorCisvKgorICogIHUzMiB3YWl0X29uX3ZhbHVlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmVhZHMgdGhlIHJlZ2lzdGVyIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBhbmQKKyAqICAgIGJ1c3kgd2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCBtYXRjaCB2YWx1ZSBpcyByZWFkIG9yIHVudGlsIHRoZQorICogICAgYm91bmRlZCBudW1iZXIgb2YgbG9vcHMgaGF2ZSBiZWVuIHJlYWNoZWQuCisgKgorICogIElucHV0KHMpOgorICogICAgcmVhZF9iaXRfbWFzayAtIFRoZSBiaXQgbWFzayB0byBhcHBseSBhZnRlciByZWFkaW5nIHRoZSByZWdpc3Rlci4KKyAqICAgIG1hdGNoX3ZhbHVlICAgLSBUaGUgdmFsdWUgdG8gbWF0Y2ggb24gYWZ0ZXIgcmVhZGluZyBhbmQgbWFza2luZy4KKyAqICAgIHJlYWRfYWRkciAgICAgLSBUaGUgcmVnaXN0ZXIgYWRkcmVzcyB0byByZWFkLgorICogICAgYm91bmQgICAgICAgICAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0byByZWFkIGJlZm9yZSBnaXZpbmcKKyAqICAgICAgICAgICAgICAgICAgICB1cC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUcnVlICgxKSBpZiB0aGUgbWF0Y2hfdmFsdWUgd2FzIHJlYWNoZWQ7IG90aGVyd2lzZSwgZmFsc2UgKDApLgorICoKKyAqLwordTMyCit3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit0cnlfdW5sb2NrX21lbW9yeSh2b2lkKQoreworCWNvbnN0IGludCB0eXBlID0gZ2V0X2RldmljZV90eXBlKCk7CisKKwkvKgorCSAqIElmIHRoZSBwcm9jZXNzb3IgaXMgYSBHUCBkZXZpY2UsIHVubG9jayB0aGUgZGV2aWNlIFNSQU0gZm9yCisJICogZ2VuZXJhbCB1c2UuCisJICovCisKKwlpZiAodHlwZSA9PSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0dQKSB7CisJCXNlY3VyZV91bmxvY2soKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKyNpZiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBTRFJDIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChTRFJDX1JFVklTSU9OKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNDT05GSUcpOworCURVTVBfUkVHTChTRFJDX1NZU1NUQVRVUyk7CisJRFVNUF9SRUdMKFNEUkNfQ1NfQ0ZHKTsKKwlEVU1QX1JFR0woU0RSQ19TSEFSSU5HKTsKKwlEVU1QX1JFR0woU0RSQ19FUlJfQUREUik7CisJRFVNUF9SRUdMKFNEUkNfRVJSX1RZUEUpOworCURVTVBfUkVHTChTRFJDX0RMTEFfQ1RSTCk7CisJRFVNUF9SRUdMKFNEUkNfRExMQV9TVEFUVVMpOworCURVTVBfUkVHTChTRFJDX1BPV0VSX1JFRyk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18wKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8wKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzApOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzApOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQ0ZHXzEpOworCURVTVBfUkVHTChTRFJDX01SXzEpOworCURVTVBfUkVHTChTRFJDX0VNUjJfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEFfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEJfMSk7CisJRFVNUF9SRUdMKFNEUkNfUkZSX0NUUkxfMSk7CisJRFVNUF9SRUdMKFNEUkNfTUFOVUFMXzEpOworfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykgKi8KKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgR1BNQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woR1BNQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKEdQTUNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUVNUQVRVUyk7CisJRFVNUF9SRUdMKEdQTUNfSVJRRU5BQkxFKTsKKwlEVU1QX1JFR0woR1BNQ19USU1FT1VUX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX0VSUl9BRERSRVNTKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfVFlQRSApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRyApOworCURVTVBfUkVHTChHUE1DX1NUQVRVUyApOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18wKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMSk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzIpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18zKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNCk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM181KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzUpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN182KTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNyk7CisKKyNpZiAwCisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF83KTsKKworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU182KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV81KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzcpOworCisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMSk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMik7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfU1RBVFVTKTsKKworCURVTVBfUkVHTChHUE1DX0VDQ19DT05GSUcpOworCURVTVBfUkVHTChHUE1DX0VDQ19DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfU0laRV9DT05GSUcpOworCisJRFVNUF9SRUdMKEdQTUNfRUNDMV9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzJfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MzX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNF9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzVfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M2X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDN19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzhfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M5X1JFU1VMVCk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM180KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM181KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM182KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM183KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9TV0RBVEEpOworI2VuZGlmCit9CisjZWxzZQorIyBkZWZpbmUgb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19QUkNNX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIFBSQ00gUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKFBSQ01fUFJNX0NDUl9DTEtTRUwpOworCURVTVBfUkVHTChQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwzX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0NBTSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DT1JFKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0RTUyk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfRU1VKTsKK30KKyNlbHNlCisjZGVmaW5lIG9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDRkdfUFJDTV9ERUJVRyAqLworCisvKgorICogIHZvaWQgY29uZmlnX2RpYW1vbmRfc2RyYW0oKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgcHJvY2Vzc29yJ3MgU0RSQU0gQ29udHJvbGxlciAoU0RSQykKKyAqICAgIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgMzIgTWIgeCAxNiBiICg2NAorICogICAgTWlCKSBERFIgU0RSQU0gb24gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2NvbmZpZ19kaWFtb25kX3NkcmFtKHZvaWQpCit7CisJdTMyIHZhbHVlLCBhY3RpbV9jdHJsYSwgYWN0aW1fY3RybGI7CisKKwkvKgorCSAqIFN0ZXAgMTogUmVzZXQgdGhlIFNEUkMgY29udHJvbGxlciBhbmQgdGhlbiB3YWl0IGZvciB0aGUgcmVzZXQKKwkgKiBldmVudCB0byBjbGVhci4KKwkgKi8KKworICAgIF9fcmF3X3dyaXRlbChTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfU0VULCBTRFJDX1NZU0NPTkZJRyk7CisgICAgd2FpdF9vbl92YWx1ZShTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NUQVRVUywKKwkJCQkgIDEyMDAwMDAwKTsKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX0NMRUFSLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKgorCSAqIFN0ZXAgMjogU2V0dXAgdGhlIHBvc2l0aW9uIGFuZCBnZW9tZXRyeSBvZiB0aGUgU0RSQU0gZGV2aWNlIG9uCisJICogdGhlIGNvbnRyb2xsZXIncyBidXMuCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1NIQVJJTkdfTE9DS19PRkYgCQkJCQkJCQkJCQkJfAorCQkgU0RSQ19TSEFSSU5HX0NTMU1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTMU1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX0NTME1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTME1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX1NEUkNUUklTVEFURV9PRkYpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19TSEFSSU5HKTsKKworCS8qCisJICogU3RlcCAzOiBTZXR1cCB0aGUgbWVtb3J5IGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBSQVMgd2lkdGgsCisJICogQ0FTIHdpZHRoLCBhZGRyZXNzIG11bHRpcGxleGluZywgc2l6ZSwgYmFuayBtYXBwaW5nLCBidXMgd2lkdGgsCisJICogcG93ZXIgbW9kZSwgRERSIHR5cGUgYW5kIG1lbW9yeSB0eXBlLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19NQ0ZHX0xPQ0tTVEFUVVNfUlcJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfUkFTV0lEVEhfMTRfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQ0FTV0lEVEhfRU5DT0RFKFNEUkNfTUNGR19DQVNXSURUSF8xMF9CSVRTKQkJCXwKKwkJIFNEUkNfTUNGR19BRERSTVVYTEVHQUNZX0ZMRVhJQkxFCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfUkFNU0laRV9FTkNPREUoQ0ZHX1NEUkFNX1NJWkVfTUIpCQkJCQl8CisJCSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fRU5DT0RFKFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9SX0JfQyl8CisJCSBTRFJDX01DRkdfQjMyTk9UMTZfT0ZGCQkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfREVFUFBEX1NVUFBPUlRFRAkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfRERSVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX0REUlRZUEVfTU9CSUxFX0REUikJCQl8CisJCSBTRFJDX01DRkdfUkFNVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX1JBTVRZUEVfRERSKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01DRkdfMCk7CisKKwkvKgorCSAqIFN0ZXAgNDogRXN0YWJsaXNoIHRoZSBBQyBmaW5lIHR1bmluZyB0aW1pbmcgY2hhcmFjdGVyaXN0aWNzLgorCSAqLworCisJYWN0aW1fY3RybGEKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQV9UUkZDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkFTX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkFTKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkNEX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkNEKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJSRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1REUExfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1REUEwpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UREFMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UREFMKSk7CisKKwlhY3RpbV9jdHJsYgorCQk9IChTRFJDX0FDVElNX0NUUkxCX1RXVFJfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RXVFIpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UWFNSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFNSKSk7CisKKwlfX3Jhd193cml0ZWwoYWN0aW1fY3RybGEsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxiLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJLyoKKwkgKiBTdGVwIDU6IEVzdGFibGlzaCB0aGUgbWVtb3J5IGF1dG9yZWZyZXNoIGNvbnRyb2wKKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfUkZSX0NUUkxfQVJDVl9FTkNPREUoMTI0NCkJCQkJCQl8CisJCSBTRFJDX1JGUl9DVFJMX0FSRV9FTkNPREUoU0RSQ19SRlJfQ1RSTF9BUkVfMV9BUkNWKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1JGUl9DVFJMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19QT1dFUl9SRUdfV0FLRVVQX0RFTEFZRUQJCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQVVUT0NPVU5UX0VOQ09ERSgwKQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fUlNUX0VOQUJMRQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fSURMRV9ESVNBQkxFCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX0VOQ09ERShTRFJDX1BPV0VSX1JFR19DTEtDVFJMX05PTkUpCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfUEFHRVBPTElDWV9IUEhCKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfUE9XRVJfUkVHKTsKKworCS8qCisJICogU3RlcCA2OiBFc3RhYmxpc2ggdGhlIEpFREVDLWRlZmluZWQgbW9kZSBhbmQgRExMIHBhcmFtZXRlcnMuCisJICovCisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJZGVsYXkoNTAwMCk7CisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9QUkVDSEFSR0VfQUxMKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19NUl9aRVJPXzEJCQkJCQkJfAorCQkgU0RSQ19NUl9XQlNUX0VOQUJMRQkJCQkJfAorCQkgU0RSQ19NUl9aRVJPXzAJCQkJCQkJfAorCQkgU0RSQ19NUl9DQVNMX0VOQ09ERShTRFJDX01SX0NBU0xfMykJfAorCQkgU0RSQ19NUl9TSUxfU0VSSUFMCQkJCQkJfAorCQkgU0RSQ19NUl9CTF9FTkNPREUoU0RSQ19NUl9CTF80KSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01SXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19ETExBX0NUUkxfRklYRURfREVMQVlfRU5DT0RFKDApCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfSU5JVF9MQVRfRU5DT0RFKDApCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9FTkNPREUoU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX1BXRCkgfAorCQkgU0RSQ19ETExBX0NUUkxfRExMX0VOQUJMRQkJCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0xPQ0tfVFJBQ0tJTkdERUxBWSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX0RMTEFfQ1RSTCk7CisKKwkvKgorCSAqIERlbGF5IGZvciBhICJyZWFzb25hYmx5IGxvbmciIHBlcmlvZCBvZiB0aW1lIHRvIGFsbG93IHRoZQorCSAqIHJlcXVlc3RlZCBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LgorCSAqLworCisJZGVsYXkoMHgyMDAwMCk7Cit9CisKKy8qCisgKiAgdm9pZCBzX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyB2ZXJ5IGVhcmx5IHN5c3RlbSBpbml0aWFsaXphdGlvbiBvZiBjaGlwCisgKiAgICBwaW4gbXVsdGlwbGV4aW5nIGFuZCBjbG9ja3MgYW5kIGlzIGNhbGxlZCB3aGVuIE9OTFkgYW4KKyAqICAgIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKworCWRlbGF5KDEwMCk7CisKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ19kaWFtb25kX3NkcmFtKCk7Cit9CisKKy8qCisgKiAgaW50IGJvYXJkX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgZWFybHksIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisgKiAgICBmb2xsb3dpbmcgY29yZSBDUFUgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50Citib2FyZF9pbml0KHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X2RldmljZV90eXBlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZCwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICogICAgZGV2aWNlIGlzIG9mIFRTVCwgRU1VLCBIUyBvciBHUCB0eXBlLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQuCisgKgorICovCit1MzIKK2dldF9kZXZpY2VfdHlwZSh2b2lkKQoreworCWNvbnN0IGludCB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9ERUNPREUodmFsdWUpKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLCBpbmRpY2F0aW5nIHRoZQorICogICAgb3JkZXIgb2YgbWVtb3J5IGludGVyZmFjZXMgZnJvbSB3aGljaCB0aGUgcHJvY2Vzc29yIHdpbGwgYXR0ZW1wdAorICogICAgdG8gYm9vdCBpdHNlbGYuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKyNpZiAwCisJY29uc3QgdTMyIHZhbHVlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpOworCWNvbnN0IHUzMiBwZXJpcGhlcmFsX3R5cGUgPSBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfUEVSSVBIRVJBTDsKKworCS8qCisJICogVGhpcyByb3V0aW5lIGFuZCBjYWxsZXJzIG9mIGl0IGFyZSBpbXBsaWNpdGx5IGV4cGVjdGluZyB0aGUKKwkgKiBNRU1PUlkgaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDApIG5vdCB0aGUgUEVSSElQSEVSQUwKKwkgKiBpbnRlcmZhY2UgKFNZU0JPT1RbNV0gPT0gMSkgYm9vdCBvcmRlciwgc28gY2hlY2sgdGhhdCBpcworCSAqIGFjdHVhbGx5IHRoZSBjYXNlLgorCSAqLworCisJaWYgKENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9ERUNPREUodmFsdWUpID09IHBlcmlwaGVyYWxfdHlwZSkgeworCQloYW5nKCk7CisJfQorCisJcmV0dXJuIChDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX0RFQ09ERSh2YWx1ZSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIDB4M2Y7CisjZW5kaWYKK30KKworLyoKKyAqICBpbnQgZ2V0X2Jvb3RfZGV2aWNlX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlX2xpc3QpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgYSBjb25zdGFudCBsaXN0IGluZGljYXRpbmcgdGhlIHByZWZlcnJlZAorICogICAgZGV2aWNlIGJvb3QgbGlzdC4KKyAqICAgIEl0IGdldHMgY2FsbGVkIGZyb20gc3RhcnRfYXJtYm9vdCBpbiBib2FyZC5jCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHByZWZlcnJlZCBmaXJzdCBwcm9jZXNzb3IgbWVtb3J5IGJvb3QgaW50ZXJmYWNlLgorICoKKyAqLworCitpbnQKK2dldF9ib290X2RldmljZXNfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VzX2xpc3QpCit7CisJc3RhdGljIHUzMiBsaXN0W01BWF9ESUFNT05EX0JPT1RfREVWSUNFU107CisJY29uc3QgdTMyIG1lbV9vcmRlciA9IGdldF9zeXNib290X3ZhbHVlKCk7CisKKwkvLyBzZXQgZGVmYXVsdHMKKwlpbnQgbnVtYmVyX29mX2RldmljZXMgPSAwOworCSpkZXZpY2VzX2xpc3QgPSAmbGlzdFswXTsKKworCXN3aXRjaCAobWVtX29yZGVyKSB7CisJY2FzZSAxNToKKwkJbGlzdFswXSA9IEdQTUNfTkFORDsKKwkJbGlzdFsxXSA9IFVTQl9QRVJJUEhFUkFMOworCQlsaXN0WzJdID0gTU1DX05BTkQ7CisJCW51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworCQlicmVhazsKKwljYXNlIDQ3OgorCQlsaXN0WzBdID0gVVNCX1BFUklQSEVSQUw7CisJCWxpc3RbMV0gPSBNTUNfTkFORDsKKwkJbGlzdFsyXSA9IEdQTUNfTkFORDsKKwkJbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKyAgICByZXR1cm4gbnVtYmVyX29mX2RldmljZXM7Cit9CisKKy8qCisgKiAgaW50IG1pc2NfaW5pdF9yKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IG1pc2NlbGxhbmVvdXMsIGJvYXJkLXNwZWNpZmljCisgKiAgICBpbml0aWFsaXphdGlvbiBmb2xsb3dpbmcgQ1BVLCBlYXJseSBib2FyZCwgc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gbG9hZGluZyB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyCisgKiAgICB0byBSQU0uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50CittaXNjX2luaXRfcih2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAord2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCS8qIFRoZXJlIGFyZSAzIHdhdGNoIGRvZ3MgV0QxPVNlY3VyZSwgV0QyPU1QVSwgV0QzPUlWQS4gV0QxIGlzCisJICogZWl0aGVyIHRha2VuIGNhcmUgb2YgYnkgUk9NIChIUy9FTVUpIG9yIG5vdCBhY2Nlc3NpYmxlIChHUCkuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgV0QyLU1QVSBvciB0YWtlIGEgUFJDTSByZXNldC4gIFdEMworCSAqIHNob3VsZCBub3QgYmUgcnVubmluZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBQUkNNIHJlc2V0LgorCSAqLworCXNyMzIoQ01fRkNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXNyMzIoQ01fSUNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXdhaXRfb25fdmFsdWUoQklUNSwgMHgyMCwgQ01fSURMRVNUX1dLVVAsIDUpOyAvKiBzb21lIGlzc3VlIGhlcmUgKi8KKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxLCBXRDJfQkFTRSArIFdTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syLCBXRDJfQkFTRSArIFdTUFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgdm9pZCBmb29iYXIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZS4uLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTUMKKwkvKiBFbmFibGUgTU1DMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dwbWNfY29uZmlnXzAodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkKKwkvKgorCSAqIEZpcnN0LCBkaXNhYmxlIHRoZSBpbnRlcmZhY2UgYW5kIHdhaXQuCisJICovCisJX19yYXdfd3JpdGVsKEdQTUNfQ09ORklHN19DU1ZBTElEX0RJU0FCTEVELCBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgxMDAwKTsKKworCS8qCisJICogTmV4dCwgcHJvZ3JhbSB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCSAqLworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcxXzAsIEdQTUNfQ09ORklHMV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMl8wLCBHUE1DX0NPTkZJRzJfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzNfMCwgR1BNQ19DT05GSUczXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc0XzAsIEdQTUNfQ09ORklHNF8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNV8wLCBHUE1DX0NPTkZJRzVfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzZfMCwgR1BNQ19DT05GSUc2XzApOworCisJLyoKKwkgKiBGaW5hbGx5LCBlbmFibGUgdGhlIEdQTUMgbWFwcGluZyBhbmQgc3BpbiBmb3IgdGhlIHBhcmFtZXRlcnMgdG8KKwkgKiBiZWNvbWUgYWN0aXZlLgorCSAqLworCV9fcmF3X3dyaXRlbCgoQ0ZHX0dQTUNfQ09ORklHN18wIHwgR1BNQ19DT05GSUc3X0NTVkFMSURfRU5BQkxFRCksCisJCQkJIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDIwMDApOworCisJaWYgKG5hbmRfY2hpcCgpKXsKKwkJcmV0dXJuICgxKTsKKwl9CisjZW5kaWYgLyogZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApICovCisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIGludCBuYW5kX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyCisgKiAgICAoR1BNQykgc3VjaCB0aGF0IG9uLWJvYXJkIE5BTkQgZGV2aWNlcyBtYXkgYmUgYWNjZXNzZWQgZm9yCisgKiAgICBzZWNvbmQtc3RhZ2UgYm9vdC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE5BTkQgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZDsgb3RoZXJ3aXNlLCAxLgorICoKKyAqLworaW50CituYW5kX2luaXQodm9pZCkKK3sKKwlpbnQgc3RhdHVzID0gMTsKKworCS8qCisJICogRXN0YWJsaXNoIEdQTUMgZ2xvYmFsIHNldHRpbmdzLgorCSAqLworCisJX19yYXdfd3JpdGVsKEdQTUNfU1lTQ09ORklHX0lETEVNT0RFX1NNQVJULCBHUE1DX1NZU0NPTkZJRyk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19JUlFFTkFCTEVfQUxMX0RJU0FCTEUsIEdQTUNfSVJRRU5BQkxFKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX1RJTUVPVVRFTkFCTEVfT0ZGLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7CisKKwlpZiAoZ3BtY19jb25maWdfMCgpKSB7CisJCXB1dHMoIlVuc3VwcG9ydGVkIE5BTkQgZGV2aWNlIEAgR1BNQzAhXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCXN0YXR1cyA9IDA7CisKKyBkb25lOgorCS8qIER1bXAgR1BNQyBhbmQgU0RSQyByZWdpc3RlcnMgaWYgc28gY29uZmlndXJlZC4gKi8KKworCW9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpOworCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKgorICogIHZvaWQgYm9hcmRfaGFuZygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBib2FyZC1zcGVjaWZpYyBhY3Rpb25zIHdoZW4gdGhlIHN5c3RlbQorICogICAgaGFuZ3MgYnkgZXhlY3V0aW5nIGhhbmcoKS4gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyB0byBkbzsKKyAqICAgIGhvd2V2ZXIsIHdlIG1pZ2h0IGxhdGVyIGRyaXZlIHRoZSBwaWV6byBvciBhIExFRC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2JvYXJkX2hhbmcgKHZvaWQpCit7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvbXV4LmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmY5MmY5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvbXV4LmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBJL08gcGFkIG11bHRpcGxleGVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHZvaWQgc2V0X211eGNvbmZfcmVncygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lcyBzZXRzIHRoZSBJL08gcGFkIG11bHRpcGxleGVycyBmb3IgVUFSVCwgR1BNQywgU0RSQywKKyAqICAgIEdQSU8uCisgKgorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICovCit2b2lkCitzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJLyoKKwkgKiBUaGUgYml0IGZpZWxkcyBmb3IgdGhlc2Ugc2V0dGluZ3MgYXJlIGFzIGZvbGxvd3M6CisJICoKKwkgKiAgIEl7RU4sRElTfQkgCS0gSW5wdXQgRW5hYmxlL0Rpc2FibGUKKwkgKiAgIFBUW0RVXQkJIAktIFB1bGwtZG93biwgLXVwCisJICogICBESVMsRU4JCSAgCS0gUHVsbC1kb3duLCAtdXAgZGlzYWJsZWQvZW5hYmxlZAorCSAqICAgTVswMTIzNDU2N10JLSBDb25maWd1cmF0aW9uIG1vZGUgMC03CisJICovCisKKwkvKgorCSAqIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisJICoKKwkgKiBNb3N0IG9mIHRoZSBTRFJDIHNpZ25hbHMgYXJlIHVzZWQgdG8gZHJpdmUgdGhlIFNhbXN1bmcKKwkgKiBLNFg1MTE2M1BJLUZDRzYgNTEyIE1iIHggMTYtYml0ICg2NCBNaUIpIEREUiBTRFJBTS4gQmVjYXVzZSB3ZQorCSAqIGludGVyZmFjZSBpbiAxNi1iaXQgcmF0aGVyIHRoYW4gMzItYml0IG1vZGUsIHdlIHBsYWNlIHRoZQorCSAqIHVudXNlZCBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKwkgKi8KKworCU1VWF9WQUwoQ1AoU0RSQ19EMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDAKKwlNVVhfVkFMKENQKFNEUkNfRDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxCisJTVVYX1ZBTChDUChTRFJDX0QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMgorCU1VWF9WQUwoQ1AoU0RSQ19EMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDMKKwlNVVhfVkFMKENQKFNEUkNfRDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q0CisJTVVYX1ZBTChDUChTRFJDX0Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENQorCU1VWF9WQUwoQ1AoU0RSQ19ENiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDYKKwlNVVhfVkFMKENQKFNEUkNfRDcpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q3CisJTVVYX1ZBTChDUChTRFJDX0Q4KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDkKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTAKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTEKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTIKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTMKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTQKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTUKKworCS8vIEJlY2F1c2Ugd2UgaW50ZXJmYWNlIFNEUkFNIGluIDE2LWJpdCBtb2RlLCBwbGFjZQorCS8vIFNEUkNfREFUQVszMToxNl0gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0QxNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJTVVYX1ZBTChDUChTRFJDX0NMSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfQ0xLCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzAKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMQorCisJLy8gUGxhY2UgdW51c2VkIERRIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoR1BNQ19BMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTEKKwlNVVhfVkFMKENQKEdQTUNfQTIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EyCisJTVVYX1ZBTChDUChHUE1DX0EzKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMworCU1VWF9WQUwoQ1AoR1BNQ19BNCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTQKKwlNVVhfVkFMKENQKEdQTUNfQTUpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E1CisJTVVYX1ZBTChDUChHUE1DX0E2KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNgorCU1VWF9WQUwoQ1AoR1BNQ19BNyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTcKKworCS8vIFBsYWNlIHRoZSB1bnVzZWQgR1BNQ19BOCBwaW4gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChHUE1DX0E4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gR1BNQ19BOSB0byBHUElPXzQyIHVzZWQgYXMgYSBwdXNoLXB1bGwsIGFjdGl2ZSBsb3cgaW5wdXQKKwkvLyBmcm9tIHRoZSBVU0IgUEhZIGZvciBVU0Igc3VzcGVuZCBub3RpZmljYXRpb24uCisKKwlNVVhfVkFMKENQKEdQTUNfQTkpLAkJKElFTiAgfCBQVFUgfCBESVMgfCBNNCkpOwkvLyBHUElPXzQyCisKKyNpZiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKQorCS8vIEFzc2lnbiBHUE1DX0ExMCB0byBHUElPXzQzIHVzZWQgYXMgcHVzaC1wdWxsLCBhY3RpdmUgbG93IG91dHB1dAorCS8vIExDRF9uRU5CVUZGRVIgZm9yIHRoZSAxLjhWIHRvIDMuM1YgTENEIGJ1ZmZlciBlbmFibGUuCisKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT180MworI2Vsc2UKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkgKi8KKworCU1VWF9WQUwoQ1AoR1BNQ19EMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDAKKwlNVVhfVkFMKENQKEdQTUNfRDEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxCisJTVVYX1ZBTChDUChHUE1DX0QyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMgorCU1VWF9WQUwoQ1AoR1BNQ19EMyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDMKKwlNVVhfVkFMKENQKEdQTUNfRDQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q0CisJTVVYX1ZBTChDUChHUE1DX0Q1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENQorCU1VWF9WQUwoQ1AoR1BNQ19ENiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDYKKwlNVVhfVkFMKENQKEdQTUNfRDcpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q3CisJTVVYX1ZBTChDUChHUE1DX0Q4KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDkKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTAKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTEKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTIKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTMKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTQKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTUKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MxCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzIKKyNpZiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKQorCS8vIEFzc2lnbiB0byBHUE1DX05DUzMgZm9yIFNhbXN1bmcgSzlGNEcwOFUwQyA1MTIgTWlCIFNMQyBOQU5ECisJLy8gRmxhc2gKKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MzCisjZWxzZQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkgKi8KKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorI2lmIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpCisJLy8gQXNzaWduIHRvIEdQTUNfTkNTNSBmb3IgU01TQyBMQU45MjIwIDEwLzEwMCBNYml0IEV0aGVybmV0IE1BQworCS8vIGFuZCBQSFkKKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1M1CisjZWxzZQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkgKi8KKworCS8vIEFzc2lnbiBHUE1DX05DUzYgdG8gR1BUMTFfUFdNX0VWVCB1c2VkIGFzIGEgcHVzaC1wdWxsIHB1bHNlIHdpZHRoCisJLy8gbW9kdWxhdGVkIChQV00pIHNpZ25hbCBmb3IgdGhlIHBpZXpvLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMykpOwkvLyBHUFQxMV9QV01fRVZUCisKKwkvLyBBc3NpZ24gR1BNQ19OQ1M3IHRvIEdQSU9fNTggdXNlZCBhcyBhIHB1c2gtcHVsbCBvdXRwdXQKKwkvLyBQSUVaT19ORU5BQkxFIHRvIHRoZSBUSSBTTjc0TFZDMkcyNDAgRHVhbCBCdWZmZXIvRHJpdmVyIFdpdGgKKwkvLyAzLVN0YXRlIE91dHB1dHMgaW5wdXRzLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzU4CisKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19DTEsKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLAkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbkFEVl9BTEUKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uT0UKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV0UKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLAkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkJFMF9DTEUKKworCS8vIEFzc2lnbiBHUE1DX05CRTEgdG8gR1BJT182MSB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dCB0byB0aGUKKwkvLyBaaWdCZWUgYWN0aXZlLWxvdyByZXNldC4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182MQorCisJTVVYX1ZBTChDUChHUE1DX05XUCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbldQCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfV0FJVDEKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbmF2YWlsYWJsZQorCisJLy8gQXNzaWduIEdQTUNfV0FJVDMgdG8gR1BJT182NSB1c2VkIGFzIGFuIGFjdGl2ZS1oaWdoLCBwdXNoLXB1bGwKKwkvLyBiYWNrcGxhdGUgZGV0ZWN0IGlucHV0LgorCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182NQorCisJLyoKKwkgKiBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKQorCSAqCisJICogQWxsIERTUyBzaWduYWxzIGFyZSB1c2VkIGluIHRoZWlyIG5vcm1hbCwgZGVmYXVsdCBtb2RlIChNb2RlIDApCisJICogdG8gZHJpdmUgdGhlIFNhbXN1bmcgTE1TMzUwREYwWzEzXSBMQ0QgZGlzcGxheSBwYW5lbC4KKwkgKi8KKworCU1VWF9WQUwoQ1AoRFNTX1BDTEspLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfUENMSworCU1VWF9WQUwoQ1AoRFNTX0hTWU5DKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0hTWU5DCisJTVVYX1ZBTChDUChEU1NfVlNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfVlNZTkMKKwlNVVhfVkFMKENQKERTU19BQ0JJQVMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfQUNCSUFTCisJTVVYX1ZBTChDUChEU1NfREFUQTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTAKKwlNVVhfVkFMKENQKERTU19EQVRBMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyCisJTVVYX1ZBTChDUChEU1NfREFUQTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTMKKwlNVVhfVkFMKENQKERTU19EQVRBNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE1CisJTVVYX1ZBTChDUChEU1NfREFUQTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTYKKwlNVVhfVkFMKENQKERTU19EQVRBNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNworCU1VWF9WQUwoQ1AoRFNTX0RBVEE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE4CisJTVVYX1ZBTChDUChEU1NfREFUQTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTkKKwlNVVhfVkFMKENQKERTU19EQVRBMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEwCisJTVVYX1ZBTChDUChEU1NfREFUQTExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTIKKwlNVVhfVkFMKENQKERTU19EQVRBMTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEzCisJTVVYX1ZBTChDUChEU1NfREFUQTE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTUKKwlNVVhfVkFMKENQKERTU19EQVRBMTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE2CisJTVVYX1ZBTChDUChEU1NfREFUQTE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNworCU1VWF9WQUwoQ1AoRFNTX0RBVEExOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTgKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE5CisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjEKKwlNVVhfVkFMKENQKERTU19EQVRBMjIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIyCisJTVVYX1ZBTChDUChEU1NfREFUQTIzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMworCisJTVVYX1ZBTChDUChDQU1fV0VOKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvKgorCSAqIFVuaXZlcnNhbCBBc3luY2hyb25vdXMgUmVjZWl2ZXIgLyBUcmFuc21pdHRlciAoVUFSVCkKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChVQVJUMV9UWCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1RYCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9SVFMKKwlNVVhfVkFMKENQKFVBUlQxX0NUUyksCQkoSUVOICB8IFBUVSB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX0NUUworCU1VWF9WQUwoQ1AoVUFSVDFfUlgpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9SWAorCS8qCisJICogQ29udHJvbCBhbmQgRGVidWcKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChTWVNfMzJLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTXzMySworCU1VWF9WQUwoQ1AoU1lTX0JPT1QwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QwCisJTVVYX1ZBTChDUChTWVNfQk9PVDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDEKKwlNVVhfVkFMKENQKFNZU19CT09UMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMgorCU1VWF9WQUwoQ1AoU1lTX0JPT1QzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QzCisJTVVYX1ZBTChDUChTWVNfQk9PVDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDQKKwlNVVhfVkFMKENQKFNZU19CT09UNSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNQorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q2KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q2CisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMSksICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gU1lTX0NMS09VVDEKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX25UUlNUCisJTVVYX1ZBTChDUChKVEFHX1RDSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVENLCisJTVVYX1ZBTChDUChKVEFHX1RNUyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVE1TCisJTVVYX1ZBTChDUChKVEFHX1RESSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVERJCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX0VNVTAKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMQorCU1VWF9WQUwoQ1AoRVRLX0NMS19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0NUTF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QwX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QyX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QzX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q0X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q1X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q2X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q3X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q4X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q5X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMV9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMl9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxM19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEVUS19EMVs0NV0gYXMgTU0yX1JYUkNWIGFuZCBNTTJfVFhTRTAgVVNCIEZTL0xTIEhvc3QKKwkvLyAoTW9kZSA1KQorCisJTVVYX1ZBTChDUChFVEtfRDE0X0VTMiksCShJRU4gIHwgUFREIHwgRElTIHwgTTUpKTsJLy8gTU0yX1JYUkNWCisJTVVYX1ZBTChDUChFVEtfRDE1X0VTMiksCShJRU4gIHwgUFREIHwgRElTIHwgTTUpKTsJLy8gTU0yX1RYU0UwCit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQ5ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0dXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogICAgICBJdCBpbmhlcml0cyBlbnRpcmVseSBmcm9tIHRoZSBlcXVpdmFsZW50IFRJIE9NQVAzIEVWTQorICoJZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLgorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLworICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzFfMCkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHM18wKQorZmxhc2hfY2ZnM192YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzRfMCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUc1XzApCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisjZW5kaWYgLyogIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgKi8KKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRQorLndvcmQgMHgwNworLndvcmQgMHgwNQorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDFGNAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5Cisud29yZCAweDEyCisud29yZCAweDA0Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDE5Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEKKy53b3JkIDB4MzIKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE2OAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDBCCisud29yZCAweDA2Cisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YKKy53b3JkIDB4MzAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MEUKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MTAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNEMKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgyMQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgxMworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyoKKyAqIFRhYmxlcyBmb3IgMzZ4LzM3eCBkZXZpY2VzCisgKgorICogKFBvcHVsYXRlZCBmb3IgMTNNSHogb25seSkKKyAqLworbXB1XzM2eF9kcGxsX3BhcmFtOgorLy8gICAgTSAgICBOICAgRlMgTTIKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfMzAwTUhaKQorLndvcmQgMTUwLCAgNSwgMCwgMSAJLy8gMTIgICBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDEzICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAxOS4yIE1IegorLndvcmQgMTUwLCAxMiwgMCwgMSAJLy8gMjYgICBNSHoKKy53b3JkIDEyNSwgMTUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopCisud29yZCAzMDAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgNjAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDMsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAzMDAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAgNywgMCwgMSAJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJNUFUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopICovCisKK2l2YV8zNnhfZHBsbF9wYXJhbToKKy8vICAgICBNICAgTiAgIEZTIE0yCisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE2LjggTUh6CisKK2NvcmVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfMjAwTUhaKQorLndvcmQgMTAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMTAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCA3MSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8zMzJNSFopCisud29yZCAxNjYsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAzMzIsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCA0MTUsIDIzLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxNjYsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCA0MTUsIDQ3LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikKKy53b3JkIDIwMCwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDQwMCwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDM3NSwgMTcsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDIwMCwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDM3NSwgMzUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJDb3JlIERQTEwgc2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkISIKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikgKi8KKworLyoKKyAqIEZvciB0aGUgcGVyaXBoZXJhbCAoUEVSKSAoYWthIERQTEw0KSBjbG9jayBzZXR0aW5ncywgdGhlcmUgYXJlIG9ubHkKKyAqIGVmZmVjdGl2ZWx5IHR3byBjbG9jayBjaG9pY2VzLCA5NiBNSHogb3IgMTkyIE1Iei4gSG93ZXZlciwgdGhlIG9ubHkKKyAqIHRpbWUgMTkyIE1IeiBpcyBhcHQgdG8gYmUgdXNlZCBpbiBhbiBhcHBsaWNhdGlvbiBpcyBpZiBib3RoIFNHWCBhbmQKKyAqIFRWIG91dHB1dCBhcmUgdXNlZC4KKyAqCisgKiAgIEZvciBhbnkgZ2l2ZW4gc3lzdGVtIGNsb2NrLCB0aGUgZGl2aWRlcnMgYXJlIGNvbmZpZ3VyZWQgdGh1cyAocGVyCisgKiAgIFNlY3Rpb24gMy41LjMuMy4zLjIgIlR5cGUgQiBEUExMIChMb3ctSml0dGVyKSIgb2YgdGhlIE9NQVAzIFRSTSk6CisgKgorICogICAgIFBFUltjbGtvdXRdID0gKFNZU1tjbGtvdXRdICogTSkgLyAoTiArIDEpCisgKgorICogICAgICAgTTJbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMiAgICAgICAgICAgdXNlZCBieSBVQVJULCBNTUMsIEkyQywgZXRjLgorICogICAgICAgTTNbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMyAgICAgICAgICAgdXNlZCBieSBUViBvdXQuCisgKiAgICAgICBNNFtjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE00ICAgICAgICAgICB1c2VkIGJ5IERTUy4KKyAqICAgICAgIE01W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTUgICAgICAgICAgIHVzZWQgYnkgY2FtZXJhLgorICogICAgICAgTTZbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNiAgICAgICAgICAgdXNlZCBieSBlbXVsYXRpb24uCisgKgorICogIFNvLCBmb3IgYSAxOS4yIE1IeiBzeXN0ZW0gY2xvY2sgYW5kIHRoZSBzY2FsYXIgZW50cmllcyBiZWxvdzoKKyAqCisgKiAgICAgICBQRVJbY2xrb3V0XSA9ICgxOS4yICogNTQwKSAvICgxMSArIDEpID0gODY0CisgKgorICogICAgICAgTTJbY2xrb3V0XTogODY0IC8gIDkgPSAgOTYgICBNSHoKKyAqICAgICAgIE0zW2Nsa291dF06IDg2NCAvIDE2ID0gIDU0ICAgTUh6CisgKiAgICAgICBNNFtjbGtvdXRdOiA4NjQgLyAgNSA9IDE3Mi44IE1IegorICogICAgICAgTTVbY2xrb3V0XTogODY0IC8gIDQgPSAyMTYgICBNSHoKKyAqICAgICAgIE02W2Nsa291dF06IDg2NCAvICAzID0gMjg4ICAgTUh6CisgKi8KK3Blcl8zNnhfZHBsbF9wYXJhbToKKy8vICAgIFNZU19DTEsgICAgTSAgICAgIE4gICAgICBNMiAgICAgIE0zICAgICAgTTQgICAgIE01ICAgICAgTTYgICAgICBtMkRJVgorLndvcmQgMTIwMDAsICAgIDQzMiwgICAgNSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDEyICAgTUh6Cisud29yZCAxMzAwMCwgICAgODY0LCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTMgICBNSHoKKy53b3JkIDE5MjAwLCAgICA1NDAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxOS4yIE1IegorLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDI2ICAgTUh6Cisud29yZCAzODQwMCwgICAgMjcwLCAgIDExLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMzguNCBNSHoKKy53b3JkIDE2ODAwLCAgICAzNjAsICAgIDYsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxNi44IE1IegorCisuZ2xvYmwgZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbQorZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIG1wdV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0KK2dldF8zNnhfaXZhX2RwbGxfcGFyYW06CisJYWRyCXIwLCBpdmFfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbQorZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW06CisJYWRyCXIwLCBjb3JlXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbQorZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbToKKwlhZHIJcjAsIHBlcl8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3BsYXRmb3JtLmggYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvcgorICogICAgICBhY2Nlc3NpbmcgRGlnaXRhbCBQaGFzZWQgTG9jayBMb29wIChEUExMKSBwYXJhbWV0ZXJzIGFuZAorICogICAgICBzZXR0aW5ncy4KKyAqCisgKi8KKworI2lmbmRlZiBfTkVTVF9ESUFNT05EX1BMQVRGT1JNX0hfCisjZGVmaW5lIF9ORVNUX0RJQU1PTkRfUExBVEZPUk1fSF8KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qCisgKiBUeXBlIERlZmluaXRpb25zCisgKi8KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisJdTMyIG07CisJdTMyIG47CisJdTMyIGZzZWw7CisJdTMyIG0yOworfTsKKworc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSB7CisJdTMyIHN5c19jbGs7CisJdTMyIG07CisJdTMyIG47CisJdTMyIG0yOworCXUzMiBtMzsKKwl1MzIgbTQ7CisJdTMyIG01OworCXUzMiBtNjsKKwl1MzIgbTJkaXY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcGxsX3BhcmFtIGRwbGxfcGFyYW07CisKKy8qCisgKiBJbmxpbmUgRnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBwbGF0Zm9ybS5TLgorICovCisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9ORVNUX0RJQU1PTkRfUExBVEZPUk1fSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3ByY20uYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3ByY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI1YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvcHJjbS5jCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgY2xvY2sgc2V0LXVwIGZvciB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZAorICogICAgICBDbG9jayBNYW5hZ2VyIChQUkNNKQorICoKKyAqICAgICAgVGhpcyBpcyBvcmlnaW5hbGx5IGluaGVyaXRlZCBhbmQgc3BsaXQgZnJvbSB0aGUgT01BUDMgRVZNCisgKiAgICAgIGJvYXJkIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoKKyAqICB1MzIgZ2V0X29zY19jbGtfc3BlZWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBkZXRlcm1pbmVzIHRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZCBiYXNlZCBvbgorICogICAgYSBrbm93biAzMiBrSHogY2xvY2sgYW5kIGdlbmVyYWwgcHVycG9zZSB0aW1lci4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgcmVmZXJlbmNlIG9zY2lsbGF0b3IgY2xvY2sgc3BlZWQuCisgKgorICovCitzdGF0aWMgdTMyCitnZXRfb3NjX2Nsa19zcGVlZCh2b2lkKQoreworCXUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgY2RpdiwgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJNX0NMS1NSQ19DVFJMKTsKKworCWlmICh2YWwgJiBCSVQ3KQorCQljZGl2ID0gMjsKKwllbHNlIGlmICh2YWwgJiBCSVQ2KQorCQljZGl2ID0gMTsKKwllbHNlCisJCS8qCisJCSAqIFNob3VsZCBuZXZlciByZWFjaCBoZXJlIQorCQkgKiBUQkQ6IEFkZCBhIFdBUk4oKS9CVUcoKQorCQkgKiAgICAgIEZvciBub3csIGFzc3VtZSBkaXZpZGVyIGFzIDEuCisJCSAqLworCQljZGl2ID0gMTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwlpZiAoY2RpdiA9PSAyKQorCXsKKwkJY2RpZmYgKj0gMjsKKwl9CisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoKKyAqICB2b2lkIGdldF9zeXNfY2xraW5fc2VsKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBQUkNNIFBSTSBzeXN0ZW0gY2xvY2sKKyAqICAgIGZyZXF1ZW5jeSBzZWxlY3Rvciwgd2hpY2ggc2hvdWxkIGJlIHdyaXR0ZW4gdG8gUFJNX0NMS1NFTC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBoZXJ0eiAgLSBUaGUgc3BlZWQsIGluIE1IeiwgdGhhdCB0aGUgc3lzdGVtIGNsb2NrIGlzIGJlbGlldmVkCisgKiAgICAgICAgICAgICAgIHRvIGJlIHJ1bm5pbmcgYXQuCisgKiAgICBzeXNfY2xraW5fc2VsIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBpbmRleCB1c2VkIHRvIGFjY2VzcyB0aGUKKyAqICAgICAgICAgICAgICAgZGlnaXRhbCBQTEwgc2V0dGluZ3MuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IGZvciB0aGUgZGlnaXRhbCBQTEwgc2V0dGluZ3MKKyAqICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBzcGVjaWZpZWQgc3lzdGVtIGNsb2NrIHJhdGUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitnZXRfc3lzX2Nsa2luX3NlbCh1MzIgaGVydHosIHUzMiAqc3lzX2Nsa2luX3NlbCkKK3sKKwlzd2l0Y2ggKGhlcnR6KSB7CisKKwljYXNlIFMzOF80TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMzhfNF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMjZNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8yNl8wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxOV8yTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTZfOE06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE2XzhfTUhaOworCQlicmVhazsKKworCWNhc2UgUzEzTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTNfMF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTJNOgorCWRlZmF1bHQ6CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEyXzBfTUhaOworCQlicmVhazsKKworCX0KK30KKworLyoKKyAqIE9NQVAzNHgvMzV4IHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNFgpOwkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciA9IHB0ciArIGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CQkvKiBzZXQgTTUgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDUsIFBFUl9NNFgyKTsJCS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkJLyogc2V0IE0zICovCisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChQRVJJUEhfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzIwOjIzXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAyMCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpIDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoTVBVX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfTVBVWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIHB0ci0+ZnNlbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChJVkEyX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfSVZBMls0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqIE9NQVAzNjMwIHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNlgpOwkJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorZHBsbDRfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqcHRyOworCisJcHRyID0gKHN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKilnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBNNiAoRElWX0RQTEw0KTogQ01fQ0xLU0VMMV9FTVVbMjQ6MjldICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDYsIHB0ci0+bTYpOworCisJLyogTTUgKENMS1NFTF9DQU0pOiBDTV9DTEtTRUwxX0VNVVswOjVdICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA2LCBwdHItPm01KTsKKworCS8qIE00IChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNiwgcHRyLT5tNCk7CisKKwkvKiBNMyAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzg6MTNdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA2LCBwdHItPm0zKTsKKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MTldICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTIsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIE0yRElWIChDTEtTRUxfOTZNKTogQ01fQ0xLU0VMX0NPUkVbMTI6MTNdICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMTIsIDIsIHB0ci0+bTJkaXYpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCk6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK21wdV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fTVBVX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiAgdm9pZCBwcmNtX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyBjbG9ja3MgaW4gYSBib2FyZC1zcGVjaWZpYyBtYW5uZXIgZm9yCisgKiAgICB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZCBDbG9jayBNYW5hZ2VyIChQUkNNKSBhbmQgaXMKKyAqICAgIGNhbGxlZCBvbmx5IHdoZW4gYW4gU1JBTS1iYXNlZCBzdGFjayBpcyBhdmFpbGFibGUgKGkuZS4gbm8KKyAqICAgIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3ByY21faW5pdCh2b2lkKQoreworCXUzMiBzeXNfY2xrX3JhdGUgPSAwLCBzeXNfY2xraW5fc2VsLCBzeXNfY2xrX2RpdjsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJc3lzX2Nsa19yYXRlID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChzeXNfY2xrX3JhdGUsICZzeXNfY2xraW5fc2VsKTsKKworCS8qIFNldCB0aGUgUFJNX0NMS1NFTF9TWVNfQ0xLSU5fU0VMIHZhbHVlIGluIHRoZSBwcm9jZXNzb3IuICovCisKKwlzcjMyKFBSQ01fUFJNX0NDUl9DTEtTRUwsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfU1RBUlQsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfQklUUywKKwkJIHN5c19jbGtpbl9zZWwpOworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlIGJ5IHR3by4KKwkgKgorCSAqIE9uIE9NQVAzNjMwLCBERFIgZGF0YSBjb3JydXB0aW9uIGhhcyBiZWVuIG9ic2VydmVkIG9uIE9GRiBtb2RlCisJICogZXhpdCBpZiB0aGUgc3lzIGNsb2NrIHdhcyBsb3dlciB0aGFuIDI2TS4gQXMgYSB3b3JrIGFyb3VuZCwKKwkgKiBPTUFQMzYzMCBpcyBvcGVyYXRlZCBhdCAyNk0gc3lzIGNsb2NrIGFuZCB0aGlzIGludGVybmFsIGRpdmlzaW9uCisJICogaXMgbm90IHBlcmZvcm1lZC4KKwkgKi8KKworCWlmKChpc19jcHVfZmFtaWx5KCkgIT0gQ1BVX09NQVAzNlhYKSAmJgorCSAgIChzeXNfY2xraW5fc2VsID4gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaKSkgeworCQlzeXNfY2xrX2RpdiA9IFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8yOworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsIC8gMjsKKworCX0gZWxzZSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzE7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAxOworCisJfQorCisJc3IzMihQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9TVEFSVCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CSVRTLAorCQkgc3lzX2Nsa19kaXYpOworCisJaWYgKGlzX2NwdV9mYW1pbHkoKSA9PSBDUFVfT01BUDM2WFgpIHsKKwkJZHBsbDNfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKworCX0gZWxzZSB7CisJCXNpbF9pbmRleCA9IGdldF9jcHVfcmV2KCkgLSAxOworCisJCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCQkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCQkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUKKwkJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuCisJCSAqLworCisJCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJCWRwbGwzX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKworCQkvKiBMb2NrIE1QVSBEUExMIHRvIHNldCBmcmVxdWVuY3kgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisJfQorCisJLyogU2V0IHVwIEdQVGltZXJzIHRvIHN5c19jbGsgc291cmNlIG9ubHkgKi8KKyAJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCA4LCAweGZmKTsKKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAwLCAxLCAxKTsKKworCWRlbGF5KDUwMDApOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MDNhMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgWC1Mb2FkZXIgbGlua2VyIHNjYXR0ZXIgZmlsZSBmb3IgdGhlIE5lc3QKKyAqICAgICAgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKi8KKworLyoKKyAqIE5vdmVtYmVyIDIwMDYgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgMzQzMHNkcCBkZXZpY2UKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvb21hcDMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWI2Nzk1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL01ha2VmaWxlCkBAIC0wLDAgKzEsNjIgQEAKKyMKKyMgICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisjICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjICAgIERlc2NyaXB0aW9uOgorIyAgICAgIFRoaXMgZmlsZSBpcyB0aGUgbWFrZSBmaWxlIGZvciBwb3J0aW9ucyBvZiBYLUxvYWRlciBzcGVjaWZpYworIyAgICAgIHRvIHRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisjCisKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9IGRpYW1vbmQubyBtdXgubyBwcmNtLm8KK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworQ1BQRkxBR1MgKz0gLUkkKFRPUERJUikvYm9hcmQvJChCT0FSRERJUikKKworU1JDUyAgICA6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUyAgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTT0JKUyAgIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOiAkKG9iaikuZGVwZW5kICQoU09CSlMpICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoU09CSlMpICQoT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46ICBjbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTM4MGMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjEgQEAKKworCisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIE9NQVAzRVZNIGJvYXJkIHVzZXMgT01BUDM0MzAgKEFSTS1Db3J0ZXhBOCkgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMjCisjCisjIE9NQVAzRVZNIGhhcyAxIGJhbmsgb2YgMTI4TUIgbVBPUC1TRFJBTSBvbiBDUzAKKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIChiYW5rMCkKKworIyBGb3IgdXNlIGlmIHlvdSB3YW50IFgtTG9hZGVyIHRvIHJlbG9jYXRlIGZyb20gU1JBTSB0byBERFIKKyNURVhUX0JBU0UgPSAweDgwZTgwMDAwCisKKyMgRm9yIFhJUCBpbiA2NEsgb2YgU1JBTSBvciBkZWJ1ZyAoR1AgZGV2aWNlIGhhcyBpdCBhbGwgYXZhaWxhYmUpCisjIFNSQU0gNDAyMDAwMDAtNDAyMEZGRkYgYmFzZQorIyBpbml0aWFsIHN0YWNrIGF0IDB4NDAyMGZmZmMgdXNlZCBpbiBzX2luaXQgKGJlbG93IHhsb2FkZXIpLgorIyBUaGUgcnVuIHRpbWUgc3RhY2sgaXMgKGFib3ZlIHhsb2FkZXIsIDJrIGJlbG93KQorIyBJZiBhbnkgZ2xvYmFscyBleGlzdCB0aGVyZSBuZWVkcyB0byBiZSByb29tIGZvciB0aGVtIGFsc28KK1RFWFRfQkFTRSA9IDB4NDAyMDA4MDAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9kaWFtb25kLmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvZGlhbW9uZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDZmNjcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvZGlhbW9uZC5jCkBAIC0wLDAgKzEsMTA3NSBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNgorICogICAgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogICAgSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNBQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgb24gR1BJTywgUkFNIGFuZCBmbGFzaCBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgaXMgaW5oZXJpdGVkIGZyb20gdGhlIE9NQVAzIEVWTSBlcXVpdmFsZW50IGZpbGUuCisgKgorICogICAgICBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBvcmRlciBpcyByb3VnaGx5OgorICoKKyAqICAgICAgICAxKSBzX2luaXQKKyAqICAgICAgICAyKSBib2FyZF9pbml0CisgKiAgICAgICAgMykgbWlzY19pbml0X3IKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2RlZmluZSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVMgKDEpCisKKwordm9pZAordWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpIHsKKwlkZWxheSh1c2Vjcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitnZXRfY3B1X2lkKHZvaWQpCit7CisJdTMyIGNwdWlkID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChjcHVpZCkpOworCisJcmV0dXJuIChjcHVpZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2dldF9jcHVfcmV2KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJaWYgKChjcHVpZCAgJiAweGYpID09IDB4MCkgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMSk7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMik7CisKKwl9CisKK30KKwordTMyCitpc19jcHVfZmFtaWx5KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCXUzMiBjcHVfZmFtaWx5ID0gMCwgb21hcDM0eHhfaWQgPSAwOworCXUxNiBoYXdrZXllOworCisJaWYgKChjcHVpZCAmIDB4ZikgPT0gMHgwKSB7CisJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisKKwl9IGVsc2UgeworCQlvbWFwMzR4eF9pZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0NPTlRST0xfSUQpOworCQloYXdrZXllICA9IChvbWFwMzR4eF9pZCA+PiBIQVdLRVlFX1NISUZUKSAmIDB4ZmZmZjsKKworCQlzd2l0Y2ggKGhhd2tleWUpIHsKKworCQljYXNlIEhBV0tFWUVfQU0zNVhYOgorCQkJY3B1X2ZhbWlseSA9IENQVV9BTTM1WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM2WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNlhYOworCQkJYnJlYWs7CisKKwkJY2FzZSBIQVdLRVlFX09NQVAzNFhYOgorCQlkZWZhdWx0OgorCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKwkJCWJyZWFrOworCisJCX0KKwl9CisKKwlyZXR1cm4gKGNwdV9mYW1pbHkpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B1X2lzXzM0MTAodm9pZCkgLSByZXR1cm5zIHRydWUgZm9yIDM0MTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2NwdV9pc18zNDEwKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpZihnZXRfY3B1X3JldigpIDwgQ1BVXzM0MzBfRVMyKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHJlYWQgc2NhbGFiaWxpdHkgc3RhdHVzIGFuZCByZXR1cm4gMSBmb3IgMzQxMCovCisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMpOworCQkvKiBDaGVjayB3aGV0aGVyIE1QVSBmcmVxdWVuY3kgaXMgc2V0IHRvIDI2NiBNSHogd2hpY2gKKwkJICogaXMgbm9taW5hbCBmb3IgMzQxMC4gSWYgeWVzIHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkJICovCisJCWlmICgoKHN0YXR1cyA+PiA4KSAmIDB4MykgPT0gMHgyKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqICB2b2lkIHNyMzIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBjbGVhcnMgYW5kIHNldHMgYSB2YWx1ZSBpbiBhIGJpdCBleHRlbnQgZm9yIGEKKyAqICAgIDMyLWJpdCB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgKgorICogIElucHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3MgYXQgd2hpY2ggdG8gY2xlYXIgYW5kIHNldCB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgICAgICAgICBzcGVjaWZpZWQgMzItYml0IHZhbHVlLgorICogICAgc3RhcnRfYml0IC0gVGhlIGZpcnN0IGJpdCBvZiB0aGUgMzItYml0IGRhdGEgdG8gY2xlYXIgYW5kIHNldC4KKyAqICAgIG51bV9iaXRzICAtIFRoZSByYW5nZSBvZiBiaXRzIG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgdmFsdWUgICAgIC0gVGhlIHZhbHVlIHRvIHNldC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdCBleHRlbnQgY2xlYXJlZCBhbmQKKyAqICAgICAgICAgICAgICAgIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgdG1wLCBtc2sgPSAwOworCisJbXNrID0gKDEgPDwgbnVtX2JpdHMpOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoKKyAqICB1MzIgd2FpdF9vbl92YWx1ZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJlYWRzIHRoZSByZWdpc3RlciBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYW5kCisgKiAgICBidXN5IHdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgbWF0Y2ggdmFsdWUgaXMgcmVhZCBvciB1bnRpbCB0aGUKKyAqICAgIGJvdW5kZWQgbnVtYmVyIG9mIGxvb3BzIGhhdmUgYmVlbiByZWFjaGVkLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIHJlYWRfYml0X21hc2sgLSBUaGUgYml0IG1hc2sgdG8gYXBwbHkgYWZ0ZXIgcmVhZGluZyB0aGUgcmVnaXN0ZXIuCisgKiAgICBtYXRjaF92YWx1ZSAgIC0gVGhlIHZhbHVlIHRvIG1hdGNoIG9uIGFmdGVyIHJlYWRpbmcgYW5kIG1hc2tpbmcuCisgKiAgICByZWFkX2FkZHIgICAgIC0gVGhlIHJlZ2lzdGVyIGFkZHJlc3MgdG8gcmVhZC4KKyAqICAgIGJvdW5kICAgICAgICAgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdG8gcmVhZCBiZWZvcmUgZ2l2aW5nCisgKiAgICAgICAgICAgICAgICAgICAgdXAuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVHJ1ZSAoMSkgaWYgdGhlIG1hdGNoX3ZhbHVlIHdhcyByZWFjaGVkOyBvdGhlcndpc2UsIGZhbHNlICgwKS4KKyAqCisgKi8KK3UzMgord2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNlY3VyZV91bmxvY2sKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCBzZWN1cml0eSByZWdpc3RlcnMgZm9yIGFjY2VzcworICogKEdQIERldmljZSBvbmx5KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3NlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAordHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwljb25zdCBpbnQgdHlwZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCisJLyoKKwkgKiBJZiB0aGUgcHJvY2Vzc29yIGlzIGEgR1AgZGV2aWNlLCB1bmxvY2sgdGhlIGRldmljZSBTUkFNIGZvcgorCSAqIGdlbmVyYWwgdXNlLgorCSAqLworCisJaWYgKHR5cGUgPT0gQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9HUCkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCisJcmV0dXJuOworfQorCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgU0RSQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woU0RSQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKFNEUkNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChTRFJDX0NTX0NGRyk7CisJRFVNUF9SRUdMKFNEUkNfU0hBUklORyk7CisJRFVNUF9SRUdMKFNEUkNfRVJSX0FERFIpOworCURVTVBfUkVHTChTRFJDX0VSUl9UWVBFKTsKKwlEVU1QX1JFR0woU0RSQ19ETExBX0NUUkwpOworCURVTVBfUkVHTChTRFJDX0RMTEFfU1RBVFVTKTsKKwlEVU1QX1JFR0woU0RSQ19QT1dFUl9SRUcpOworCURVTVBfUkVHTChTRFJDX01DRkdfMCk7CisJRFVNUF9SRUdMKFNEUkNfTVJfMCk7CisJRFVNUF9SRUdMKFNEUkNfRU1SMl8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlEVU1QX1JFR0woU0RSQ19SRlJfQ1RSTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQU5VQUxfMCk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18xKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8xKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzEpOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzEpOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8xKTsKK30KKyNlbHNlCisjIGRlZmluZSBvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIEdQTUMgUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKEdQTUNfUkVWSVNJT04pOworCURVTVBfUkVHTChHUE1DX1NZU0NPTkZJRyk7CisJRFVNUF9SRUdMKEdQTUNfU1lTU1RBVFVTKTsKKwlEVU1QX1JFR0woR1BNQ19JUlFTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUUVOQUJMRSk7CisJRFVNUF9SRUdMKEdQTUNfVElNRU9VVF9DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfQUREUkVTUyk7CisJRFVNUF9SRUdMKEdQTUNfRVJSX1RZUEUgKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcgKTsKKwlEVU1QX1JFR0woR1BNQ19TVEFUVVMgKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMCk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzEpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18yKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMyk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM180KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzQpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN181KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNik7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM183KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzcpOworCisjaWYgMAorCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF82KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU181KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzcpOworCisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV83KTsKKworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzEpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzIpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX1NUQVRVUyk7CisKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDX1NJWkVfQ09ORklHKTsKKworCURVTVBfUkVHTChHUE1DX0VDQzFfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MyX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDM19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzRfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M1X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNl9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzdfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M4X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDOV9SRVNVTFQpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfU1dEQVRBKTsKKyNlbmRpZgorfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX0RFQlVHKSAqLworCisjaWYgZGVmaW5lZChDRkdfUFJDTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBQUkNNIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChQUkNNX1BSTV9DQ1JfQ0xLU0VMKTsKKwlEVU1QX1JFR0woUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMM19QTEwpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DQU0pOworCURVTVBfUkVHTChDTV9DTEtTRUxfQ09SRSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9EU1MpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX0VNVSk7Cit9CisjZWxzZQorI2RlZmluZSBvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ0ZHX1BSQ01fREVCVUcgKi8KKworLyoKKyAqICB2b2lkIGNvbmZpZ19kaWFtb25kX3NkcmFtKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIHByb2Nlc3NvcidzIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisgKiAgICBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDMyIE1iIHggMTYgYiAoNjQKKyAqICAgIE1pQikgRERSIFNEUkFNIG9uIHRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitjb25maWdfZGlhbW9uZF9zZHJhbSh2b2lkKQoreworCXUzMiB2YWx1ZSwgYWN0aW1fY3RybGEsIGFjdGltX2N0cmxiOworCisJLyoKKwkgKiBTdGVwIDE6IFJlc2V0IHRoZSBTRFJDIGNvbnRyb2xsZXIgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIHJlc2V0CisJICogZXZlbnQgdG8gY2xlYXIuCisJICovCisKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX1NFVCwgU0RSQ19TWVNDT05GSUcpOworICAgIHdhaXRfb25fdmFsdWUoU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TVEFUVVMsCisJCQkJICAxMjAwMDAwMCk7CisgICAgX19yYXdfd3JpdGVsKFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9DTEVBUiwgU0RSQ19TWVNDT05GSUcpOworCisJLyoKKwkgKiBTdGVwIDI6IFNldHVwIHRoZSBwb3NpdGlvbiBhbmQgZ2VvbWV0cnkgb2YgdGhlIFNEUkFNIGRldmljZSBvbgorCSAqIHRoZSBjb250cm9sbGVyJ3MgYnVzLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19TSEFSSU5HX0xPQ0tfT0ZGIAkJCQkJCQkJCQkJCXwKKwkJIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzFNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzBNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19TRFJDVFJJU1RBVEVfT0ZGKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfU0hBUklORyk7CisKKwkvKgorCSAqIFN0ZXAgMzogU2V0dXAgdGhlIG1lbW9yeSBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgUkFTIHdpZHRoLAorCSAqIENBUyB3aWR0aCwgYWRkcmVzcyBtdWx0aXBsZXhpbmcsIHNpemUsIGJhbmsgbWFwcGluZywgYnVzIHdpZHRoLAorCSAqIHBvd2VyIG1vZGUsIEREUiB0eXBlIGFuZCBtZW1vcnkgdHlwZS4KKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfTUNGR19MT0NLU1RBVFVTX1JXCQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19SQVNXSURUSF9FTkNPREUoU0RSQ19NQ0ZHX1JBU1dJRFRIXzE0X0JJVFMpCQkJfAorCQkgU0RSQ19NQ0ZHX0NBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfQ0FTV0lEVEhfMTBfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQUREUk1VWExFR0FDWV9GTEVYSUJMRQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVNJWkVfRU5DT0RFKENGR19TRFJBTV9TSVpFX01CKQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX0VOQ09ERShTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fUl9CX0MpfAorCQkgU0RSQ19NQ0ZHX0IzMk5PVDE2X09GRgkJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0RFRVBQRF9TVVBQT1JURUQJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0REUlRZUEVfRU5DT0RFKFNEUkNfTUNGR19ERFJUWVBFX01PQklMRV9ERFIpCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVRZUEVfRU5DT0RFKFNEUkNfTUNGR19SQU1UWVBFX0REUikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NQ0ZHXzApOworCisJLyoKKwkgKiBTdGVwIDQ6IEVzdGFibGlzaCB0aGUgQUMgZmluZSB0dW5pbmcgdGltaW5nIGNoYXJhY3RlcmlzdGljcy4KKwkgKi8KKworCWFjdGltX2N0cmxhCisJCT0gKFNEUkNfQUNUSU1fQ1RSTEFfVFJGQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJGQykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJBU19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJBUykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUkRfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSUkQpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9URFBMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9URFBMKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVERBTF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTCkpOworCisJYWN0aW1fY3RybGIKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQl9UV1RSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UV1RSKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVENLRV9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVENLRSkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RYUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhTUl9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhTUikpOworCisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxhLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChhY3RpbV9jdHJsYiwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCS8qCisJICogU3RlcCA1OiBFc3RhYmxpc2ggdGhlIG1lbW9yeSBhdXRvcmVmcmVzaCBjb250cm9sCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1JGUl9DVFJMX0FSQ1ZfRU5DT0RFKDEyNDQpCQkJCQkJfAorCQkgU0RSQ19SRlJfQ1RSTF9BUkVfRU5DT0RFKFNEUkNfUkZSX0NUUkxfQVJFXzFfQVJDVikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19SRlJfQ1RSTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfUE9XRVJfUkVHX1dBS0VVUF9ERUxBWUVECQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX0FVVE9DT1VOVF9FTkNPREUoMCkJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX1JTVF9FTkFCTEUJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX0lETEVfRElTQUJMRQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9FTkNPREUoU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9OT05FKQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1BBR0VQT0xJQ1lfSFBIQik7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1BPV0VSX1JFRyk7CisKKwkvKgorCSAqIFN0ZXAgNjogRXN0YWJsaXNoIHRoZSBKRURFQy1kZWZpbmVkIG1vZGUgYW5kIERMTCBwYXJhbWV0ZXJzLgorCSAqLworCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCWRlbGF5KDUwMDApOwkgICAgICAgICAgICAgICAgIAorCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfUFJFQ0hBUkdFX0FMTCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfTVJfWkVST18xCQkJCQkJCXwKKwkJIFNEUkNfTVJfV0JTVF9FTkFCTEUJCQkJCXwKKwkJIFNEUkNfTVJfWkVST18wCQkJCQkJCXwKKwkJIFNEUkNfTVJfQ0FTTF9FTkNPREUoU0RSQ19NUl9DQVNMXzMpCXwKKwkJIFNEUkNfTVJfU0lMX1NFUklBTAkJCQkJCXwKKwkJIFNEUkNfTVJfQkxfRU5DT0RFKFNEUkNfTVJfQkxfNCkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NUl8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfRExMQV9DVFJMX0ZJWEVEX0RFTEFZX0VOQ09ERSgwKQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0lOSVRfTEFUX0VOQ09ERSgwKQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfRU5DT0RFKFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9QV0QpIHwgCisJCSBTRFJDX0RMTEFfQ1RSTF9ETExfRU5BQkxFCQkJCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfTE9DS19UUkFDS0lOR0RFTEFZKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfRExMQV9DVFJMKTsKKworCS8qCisJICogRGVsYXkgZm9yIGEgInJlYXNvbmFibHkgbG9uZyIgcGVyaW9kIG9mIHRpbWUgdG8gYWxsb3cgdGhlCisJICogcmVxdWVzdGVkIGNoYW5nZXMgdG8gdGFrZSBlZmZlY3QuCisJICovCisKKyAJZGVsYXkoMHgyMDAwMCk7Cit9CisKKy8qCisgKiAgdm9pZCBzX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyB2ZXJ5IGVhcmx5IHN5c3RlbSBpbml0aWFsaXphdGlvbiBvZiBjaGlwCisgKiAgICBwaW4gbXVsdGlwbGV4aW5nIGFuZCBjbG9ja3MgYW5kIGlzIGNhbGxlZCB3aGVuIE9OTFkgYW4KKyAqICAgIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKworCWRlbGF5KDEwMCk7CisKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ19kaWFtb25kX3NkcmFtKCk7Cit9CisKKy8qCisgKiAgaW50IGJvYXJkX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgZWFybHksIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisgKiAgICBmb2xsb3dpbmcgY29yZSBDUFUgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50Citib2FyZF9pbml0KHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X2RldmljZV90eXBlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZCwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICogICAgZGV2aWNlIGlzIG9mIFRTVCwgRU1VLCBIUyBvciBHUCB0eXBlLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQuCisgKgorICovCit1MzIKK2dldF9kZXZpY2VfdHlwZSh2b2lkKQoreworCWNvbnN0IGludCB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9ERUNPREUodmFsdWUpKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLCBpbmRpY2F0aW5nIHRoZQorICogICAgb3JkZXIgb2YgbWVtb3J5IGludGVyZmFjZXMgZnJvbSB3aGljaCB0aGUgcHJvY2Vzc29yIHdpbGwgYXR0ZW1wdAorICogICAgdG8gYm9vdCBpdHNlbGYuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKwljb25zdCB1MzIgdmFsdWUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUyk7CisJY29uc3QgdTMyIHBlcmlwaGVyYWxfdHlwZSA9IENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9QRVJJUEhFUkFMOworCisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgYW5kIGNhbGxlcnMgb2YgaXQgYXJlIGltcGxpY2l0bHkgZXhwZWN0aW5nIHRoZQorCSAqIE1FTU9SWSBpbnRlcmZhY2UgKFNZU0JPT1RbNV0gPT0gMCkgbm90IHRoZSBQRVJISVBIRVJBTAorCSAqIGludGVyZmFjZSAoU1lTQk9PVFs1XSA9PSAxKSBib290IG9yZGVyLCBzbyBjaGVjayB0aGF0IGlzCisJICogYWN0dWFsbHkgdGhlIGNhc2UuCisJICovCisKKwlpZiAoQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX0RFQ09ERSh2YWx1ZSkgPT0gcGVyaXBoZXJhbF90eXBlKSB7CisJCWhhbmcoKTsKKwl9CisKKwlyZXR1cm4gKENPTlRST0xfU1RBVFVTX1NZU0JPT1RfT1JERVJfREVDT0RFKHZhbHVlKSk7Cit9CisKKy8qCisgKiAgaW50IGdldF9ib290X2RldmljZV9saXN0KGNvbnN0IHUzMioqIGRldmljZV9saXN0KQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIGEgY29uc3RhbnQgbGlzdCBpbmRpY2F0aW5nIHRoZSBwcmVmZXJyZWQKKyAqICAgIGRldmljZSBib290IGxpc3QuCisgKiAgICBJdCBnZXRzIGNhbGxlZCBmcm9tIHN0YXJ0X2FybWJvb3QgaW4gYm9hcmQuYworICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBwcmVmZXJyZWQgZmlyc3QgcHJvY2Vzc29yIG1lbW9yeSBib290IGludGVyZmFjZS4KKyAqCisgKi8KKworaW50CitnZXRfYm9vdF9kZXZpY2VzX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlc19saXN0KQoreworCXN0YXRpYyB1MzIgbGlzdFtNQVhfRElBTU9ORF9CT09UX0RFVklDRVNdOworCWNvbnN0IHUzMiBtZW1fb3JkZXIgPSBnZXRfc3lzYm9vdF92YWx1ZSgpOworCisJLy8gc2V0IGRlZmF1bHRzCisJaW50IG51bWJlcl9vZl9kZXZpY2VzID0gMDsKKwkqZGV2aWNlc19saXN0ID0gJmxpc3RbMF07CisKKwlzd2l0Y2ggKG1lbV9vcmRlcikgeworCisJY2FzZSAwOgorCWNhc2UgMjoKKwljYXNlIDQ6CisJY2FzZSAxNjoKKwljYXNlIDIyOgorICAgICAgICBsaXN0WzBdID0gR1BNQ19PTkVOQU5EOworICAgICAgICBudW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUzsKKyAgICAgICAgYnJlYWs7CisJY2FzZSAxOgorCWNhc2UgMTI6CisJY2FzZSAxNToKKwljYXNlIDIxOgorCWNhc2UgMjc6CisgICAgICAgIGxpc3RbMF0gPSBHUE1DX05BTkQ7CisgICAgICAgIG51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworICAgICAgICBicmVhazsKKwljYXNlIDM6CisJY2FzZSA2OgorICAgICAgICBsaXN0WzBdID0gTU1DX09ORU5BTkQ7CisgICAgICAgIG51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworICAgICAgICBicmVhazsKKwljYXNlIDg6CisJY2FzZSAxMToKKwljYXNlIDE0OgorCWNhc2UgMjA6CisJY2FzZSAyNjoKKyAgICAgICAgbGlzdFswXSA9IEdQTUNfTURPQzsKKyAgICAgICAgbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisgICAgICAgIGJyZWFrOworCWNhc2UgMTc6CisJY2FzZSAxODoKKwljYXNlIDI0OgorICAgICAgICBsaXN0WzBdID0gTU1DX05BTkQ7CisgICAgICAgIG51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworICAgICAgICBicmVhazsKKwljYXNlIDc6CisJY2FzZSAxMDoKKwljYXNlIDEzOgorCWNhc2UgMTk6CisJY2FzZSAyNToKKworCWRlZmF1bHQ6CisgICAgICAgIGxpc3RbMF0gPSBHUE1DX05PUjsKKyAgICAgICAgbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisgICAgICAgIGJyZWFrOworCX0KKyAgICByZXR1cm4gbnVtYmVyX29mX2RldmljZXM7Cit9CisKKy8qCisgKiAgaW50IG1pc2NfaW5pdF9yKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IG1pc2NlbGxhbmVvdXMsIGJvYXJkLXNwZWNpZmljCisgKiAgICBpbml0aWFsaXphdGlvbiBmb2xsb3dpbmcgQ1BVLCBlYXJseSBib2FyZCwgc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gbG9hZGluZyB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyCisgKiAgICB0byBSQU0uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50CittaXNjX2luaXRfcih2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAord2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCS8qIFRoZXJlIGFyZSAzIHdhdGNoIGRvZ3MgV0QxPVNlY3VyZSwgV0QyPU1QVSwgV0QzPUlWQS4gV0QxIGlzCisJICogZWl0aGVyIHRha2VuIGNhcmUgb2YgYnkgUk9NIChIUy9FTVUpIG9yIG5vdCBhY2Nlc3NpYmxlIChHUCkuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgV0QyLU1QVSBvciB0YWtlIGEgUFJDTSByZXNldC4gIFdEMworCSAqIHNob3VsZCBub3QgYmUgcnVubmluZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBQUkNNIHJlc2V0LgorCSAqLworCXNyMzIoQ01fRkNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXNyMzIoQ01fSUNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXdhaXRfb25fdmFsdWUoQklUNSwgMHgyMCwgQ01fSURMRVNUX1dLVVAsIDUpOyAvKiBzb21lIGlzc3VlIGhlcmUgKi8KKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxLCBXRDJfQkFTRSArIFdTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syLCBXRDJfQkFTRSArIFdTUFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgdm9pZCBmb29iYXIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZS4uLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTUMKKwkvKiBFbmFibGUgTU1DMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dwbWNfY29uZmlnXzAodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkKKwkvKgorCSAqIEZpcnN0LCBkaXNhYmxlIHRoZSBpbnRlcmZhY2UgYW5kIHdhaXQuCisJICovCisJX19yYXdfd3JpdGVsKEdQTUNfQ09ORklHN19DU1ZBTElEX0RJU0FCTEVELCBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgxMDAwKTsKKworCS8qCisJICogTmV4dCwgcHJvZ3JhbSB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCSAqLworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcxXzAsIEdQTUNfQ09ORklHMV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMl8wLCBHUE1DX0NPTkZJRzJfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzNfMCwgR1BNQ19DT05GSUczXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc0XzAsIEdQTUNfQ09ORklHNF8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNV8wLCBHUE1DX0NPTkZJRzVfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzZfMCwgR1BNQ19DT05GSUc2XzApOworCisJLyoKKwkgKiBGaW5hbGx5LCBlbmFibGUgdGhlIEdQTUMgbWFwcGluZyBhbmQgc3BpbiBmb3IgdGhlIHBhcmFtZXRlcnMgdG8KKwkgKiBiZWNvbWUgYWN0aXZlLgorCSAqLworCV9fcmF3X3dyaXRlbCgoQ0ZHX0dQTUNfQ09ORklHN18wIHwgR1BNQ19DT05GSUc3X0NTVkFMSURfRU5BQkxFRCksCisJCQkJIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDIwMDApOworCisJaWYgKG5hbmRfY2hpcCgpKXsKKwkJcmV0dXJuICgxKTsKKwl9CisjZW5kaWYgLyogZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApICovCisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIGludCBuYW5kX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyCisgKiAgICAoR1BNQykgc3VjaCB0aGF0IG9uLWJvYXJkIE5BTkQgZGV2aWNlcyBtYXkgYmUgYWNjZXNzZWQgZm9yCisgKiAgICBzZWNvbmQtc3RhZ2UgYm9vdC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE5BTkQgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZDsgb3RoZXJ3aXNlLCAxLgorICoKKyAqLworaW50CituYW5kX2luaXQodm9pZCkKK3sKKwlpbnQgc3RhdHVzID0gMTsKKworCS8qCisJICogRXN0YWJsaXNoIEdQTUMgZ2xvYmFsIHNldHRpbmdzLgorCSAqLworCisJX19yYXdfd3JpdGVsKEdQTUNfU1lTQ09ORklHX0lETEVNT0RFX1NNQVJULCBHUE1DX1NZU0NPTkZJRyk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19JUlFFTkFCTEVfQUxMX0RJU0FCTEUsIEdQTUNfSVJRRU5BQkxFKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX1RJTUVPVVRFTkFCTEVfT0ZGLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7CisKKwlpZiAoZ3BtY19jb25maWdfMCgpKSB7CisJCXB1dHMoIlVuc3VwcG9ydGVkIE5BTkQgZGV2aWNlIEAgR1BNQzAhXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCXN0YXR1cyA9IDA7CisKKyBkb25lOgorCS8qIER1bXAgR1BNQyBhbmQgU0RSQyByZWdpc3RlcnMgaWYgc28gY29uZmlndXJlZC4gKi8KKworCW9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpOworCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKgorICogIHZvaWQgYm9hcmRfaGFuZygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBib2FyZC1zcGVjaWZpYyBhY3Rpb25zIHdoZW4gdGhlIHN5c3RlbQorICogICAgaGFuZ3MgYnkgZXhlY3V0aW5nIGhhbmcoKS4gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyB0byBkbzsKKyAqICAgIGhvd2V2ZXIsIHdlIG1pZ2h0IGxhdGVyIGRyaXZlIHRoZSBwaWV6byBvciBhIExFRC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2JvYXJkX2hhbmcgKHZvaWQpCit7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL211eC5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL211eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjkyZjkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvbXV4LmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBJL08gcGFkIG11bHRpcGxleGVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHZvaWQgc2V0X211eGNvbmZfcmVncygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lcyBzZXRzIHRoZSBJL08gcGFkIG11bHRpcGxleGVycyBmb3IgVUFSVCwgR1BNQywgU0RSQywKKyAqICAgIEdQSU8uCisgKgorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICovCit2b2lkCitzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJLyoKKwkgKiBUaGUgYml0IGZpZWxkcyBmb3IgdGhlc2Ugc2V0dGluZ3MgYXJlIGFzIGZvbGxvd3M6CisJICoKKwkgKiAgIEl7RU4sRElTfQkgCS0gSW5wdXQgRW5hYmxlL0Rpc2FibGUKKwkgKiAgIFBUW0RVXQkJIAktIFB1bGwtZG93biwgLXVwCisJICogICBESVMsRU4JCSAgCS0gUHVsbC1kb3duLCAtdXAgZGlzYWJsZWQvZW5hYmxlZAorCSAqICAgTVswMTIzNDU2N10JLSBDb25maWd1cmF0aW9uIG1vZGUgMC03CisJICovCisKKwkvKgorCSAqIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisJICoKKwkgKiBNb3N0IG9mIHRoZSBTRFJDIHNpZ25hbHMgYXJlIHVzZWQgdG8gZHJpdmUgdGhlIFNhbXN1bmcKKwkgKiBLNFg1MTE2M1BJLUZDRzYgNTEyIE1iIHggMTYtYml0ICg2NCBNaUIpIEREUiBTRFJBTS4gQmVjYXVzZSB3ZQorCSAqIGludGVyZmFjZSBpbiAxNi1iaXQgcmF0aGVyIHRoYW4gMzItYml0IG1vZGUsIHdlIHBsYWNlIHRoZQorCSAqIHVudXNlZCBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKwkgKi8KKworCU1VWF9WQUwoQ1AoU0RSQ19EMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDAKKwlNVVhfVkFMKENQKFNEUkNfRDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxCisJTVVYX1ZBTChDUChTRFJDX0QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMgorCU1VWF9WQUwoQ1AoU0RSQ19EMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDMKKwlNVVhfVkFMKENQKFNEUkNfRDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q0CisJTVVYX1ZBTChDUChTRFJDX0Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENQorCU1VWF9WQUwoQ1AoU0RSQ19ENiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDYKKwlNVVhfVkFMKENQKFNEUkNfRDcpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q3CisJTVVYX1ZBTChDUChTRFJDX0Q4KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDkKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTAKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTEKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTIKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTMKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTQKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTUKKworCS8vIEJlY2F1c2Ugd2UgaW50ZXJmYWNlIFNEUkFNIGluIDE2LWJpdCBtb2RlLCBwbGFjZQorCS8vIFNEUkNfREFUQVszMToxNl0gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0QxNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJTVVYX1ZBTChDUChTRFJDX0NMSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfQ0xLCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzAKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMQorCisJLy8gUGxhY2UgdW51c2VkIERRIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoR1BNQ19BMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTEKKwlNVVhfVkFMKENQKEdQTUNfQTIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EyCisJTVVYX1ZBTChDUChHUE1DX0EzKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMworCU1VWF9WQUwoQ1AoR1BNQ19BNCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTQKKwlNVVhfVkFMKENQKEdQTUNfQTUpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E1CisJTVVYX1ZBTChDUChHUE1DX0E2KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNgorCU1VWF9WQUwoQ1AoR1BNQ19BNyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTcKKworCS8vIFBsYWNlIHRoZSB1bnVzZWQgR1BNQ19BOCBwaW4gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChHUE1DX0E4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gR1BNQ19BOSB0byBHUElPXzQyIHVzZWQgYXMgYSBwdXNoLXB1bGwsIGFjdGl2ZSBsb3cgaW5wdXQKKwkvLyBmcm9tIHRoZSBVU0IgUEhZIGZvciBVU0Igc3VzcGVuZCBub3RpZmljYXRpb24uCisKKwlNVVhfVkFMKENQKEdQTUNfQTkpLAkJKElFTiAgfCBQVFUgfCBESVMgfCBNNCkpOwkvLyBHUElPXzQyCisKKyNpZiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKQorCS8vIEFzc2lnbiBHUE1DX0ExMCB0byBHUElPXzQzIHVzZWQgYXMgcHVzaC1wdWxsLCBhY3RpdmUgbG93IG91dHB1dAorCS8vIExDRF9uRU5CVUZGRVIgZm9yIHRoZSAxLjhWIHRvIDMuM1YgTENEIGJ1ZmZlciBlbmFibGUuCisKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT180MworI2Vsc2UKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkgKi8KKworCU1VWF9WQUwoQ1AoR1BNQ19EMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDAKKwlNVVhfVkFMKENQKEdQTUNfRDEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxCisJTVVYX1ZBTChDUChHUE1DX0QyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMgorCU1VWF9WQUwoQ1AoR1BNQ19EMyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDMKKwlNVVhfVkFMKENQKEdQTUNfRDQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q0CisJTVVYX1ZBTChDUChHUE1DX0Q1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENQorCU1VWF9WQUwoQ1AoR1BNQ19ENiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDYKKwlNVVhfVkFMKENQKEdQTUNfRDcpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q3CisJTVVYX1ZBTChDUChHUE1DX0Q4KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDkKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTAKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTEKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTIKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTMKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTQKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTUKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MxCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzIKKyNpZiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKQorCS8vIEFzc2lnbiB0byBHUE1DX05DUzMgZm9yIFNhbXN1bmcgSzlGNEcwOFUwQyA1MTIgTWlCIFNMQyBOQU5ECisJLy8gRmxhc2gKKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MzCisjZWxzZQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkgKi8KKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorI2lmIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpCisJLy8gQXNzaWduIHRvIEdQTUNfTkNTNSBmb3IgU01TQyBMQU45MjIwIDEwLzEwMCBNYml0IEV0aGVybmV0IE1BQworCS8vIGFuZCBQSFkKKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1M1CisjZWxzZQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkgKi8KKworCS8vIEFzc2lnbiBHUE1DX05DUzYgdG8gR1BUMTFfUFdNX0VWVCB1c2VkIGFzIGEgcHVzaC1wdWxsIHB1bHNlIHdpZHRoCisJLy8gbW9kdWxhdGVkIChQV00pIHNpZ25hbCBmb3IgdGhlIHBpZXpvLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMykpOwkvLyBHUFQxMV9QV01fRVZUCisKKwkvLyBBc3NpZ24gR1BNQ19OQ1M3IHRvIEdQSU9fNTggdXNlZCBhcyBhIHB1c2gtcHVsbCBvdXRwdXQKKwkvLyBQSUVaT19ORU5BQkxFIHRvIHRoZSBUSSBTTjc0TFZDMkcyNDAgRHVhbCBCdWZmZXIvRHJpdmVyIFdpdGgKKwkvLyAzLVN0YXRlIE91dHB1dHMgaW5wdXRzLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzU4CisKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19DTEsKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLAkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbkFEVl9BTEUKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uT0UKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV0UKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLAkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkJFMF9DTEUKKworCS8vIEFzc2lnbiBHUE1DX05CRTEgdG8gR1BJT182MSB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dCB0byB0aGUKKwkvLyBaaWdCZWUgYWN0aXZlLWxvdyByZXNldC4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182MQorCisJTVVYX1ZBTChDUChHUE1DX05XUCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbldQCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfV0FJVDEKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbmF2YWlsYWJsZQorCisJLy8gQXNzaWduIEdQTUNfV0FJVDMgdG8gR1BJT182NSB1c2VkIGFzIGFuIGFjdGl2ZS1oaWdoLCBwdXNoLXB1bGwKKwkvLyBiYWNrcGxhdGUgZGV0ZWN0IGlucHV0LgorCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182NQorCisJLyoKKwkgKiBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKQorCSAqCisJICogQWxsIERTUyBzaWduYWxzIGFyZSB1c2VkIGluIHRoZWlyIG5vcm1hbCwgZGVmYXVsdCBtb2RlIChNb2RlIDApCisJICogdG8gZHJpdmUgdGhlIFNhbXN1bmcgTE1TMzUwREYwWzEzXSBMQ0QgZGlzcGxheSBwYW5lbC4KKwkgKi8KKworCU1VWF9WQUwoQ1AoRFNTX1BDTEspLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfUENMSworCU1VWF9WQUwoQ1AoRFNTX0hTWU5DKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0hTWU5DCisJTVVYX1ZBTChDUChEU1NfVlNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfVlNZTkMKKwlNVVhfVkFMKENQKERTU19BQ0JJQVMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfQUNCSUFTCisJTVVYX1ZBTChDUChEU1NfREFUQTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTAKKwlNVVhfVkFMKENQKERTU19EQVRBMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyCisJTVVYX1ZBTChDUChEU1NfREFUQTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTMKKwlNVVhfVkFMKENQKERTU19EQVRBNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE1CisJTVVYX1ZBTChDUChEU1NfREFUQTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTYKKwlNVVhfVkFMKENQKERTU19EQVRBNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNworCU1VWF9WQUwoQ1AoRFNTX0RBVEE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE4CisJTVVYX1ZBTChDUChEU1NfREFUQTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTkKKwlNVVhfVkFMKENQKERTU19EQVRBMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEwCisJTVVYX1ZBTChDUChEU1NfREFUQTExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTIKKwlNVVhfVkFMKENQKERTU19EQVRBMTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEzCisJTVVYX1ZBTChDUChEU1NfREFUQTE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTUKKwlNVVhfVkFMKENQKERTU19EQVRBMTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE2CisJTVVYX1ZBTChDUChEU1NfREFUQTE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNworCU1VWF9WQUwoQ1AoRFNTX0RBVEExOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTgKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE5CisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjEKKwlNVVhfVkFMKENQKERTU19EQVRBMjIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIyCisJTVVYX1ZBTChDUChEU1NfREFUQTIzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMworCisJTVVYX1ZBTChDUChDQU1fV0VOKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvKgorCSAqIFVuaXZlcnNhbCBBc3luY2hyb25vdXMgUmVjZWl2ZXIgLyBUcmFuc21pdHRlciAoVUFSVCkKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChVQVJUMV9UWCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1RYCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9SVFMKKwlNVVhfVkFMKENQKFVBUlQxX0NUUyksCQkoSUVOICB8IFBUVSB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX0NUUworCU1VWF9WQUwoQ1AoVUFSVDFfUlgpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9SWAorCS8qCisJICogQ29udHJvbCBhbmQgRGVidWcKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChTWVNfMzJLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTXzMySworCU1VWF9WQUwoQ1AoU1lTX0JPT1QwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QwCisJTVVYX1ZBTChDUChTWVNfQk9PVDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDEKKwlNVVhfVkFMKENQKFNZU19CT09UMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMgorCU1VWF9WQUwoQ1AoU1lTX0JPT1QzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QzCisJTVVYX1ZBTChDUChTWVNfQk9PVDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDQKKwlNVVhfVkFMKENQKFNZU19CT09UNSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNQorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q2KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q2CisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMSksICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gU1lTX0NMS09VVDEKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX25UUlNUCisJTVVYX1ZBTChDUChKVEFHX1RDSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVENLCisJTVVYX1ZBTChDUChKVEFHX1RNUyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVE1TCisJTVVYX1ZBTChDUChKVEFHX1RESSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVERJCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX0VNVTAKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMQorCU1VWF9WQUwoQ1AoRVRLX0NMS19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0NUTF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QwX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QyX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QzX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q0X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q1X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q2X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q3X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q4X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q5X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMV9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMl9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxM19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEVUS19EMVs0NV0gYXMgTU0yX1JYUkNWIGFuZCBNTTJfVFhTRTAgVVNCIEZTL0xTIEhvc3QKKwkvLyAoTW9kZSA1KQorCisJTVVYX1ZBTChDUChFVEtfRDE0X0VTMiksCShJRU4gIHwgUFREIHwgRElTIHwgTTUpKTsJLy8gTU0yX1JYUkNWCisJTVVYX1ZBTChDUChFVEtfRDE1X0VTMiksCShJRU4gIHwgUFREIHwgRElTIHwgTTUpKTsJLy8gTU0yX1RYU0UwCit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDlkMjcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0dXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogICAgICBJdCBpbmhlcml0cyBlbnRpcmVseSBmcm9tIHRoZSBlcXVpdmFsZW50IFRJIE9NQVAzIEVWTQorICoJZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLgorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLworICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzFfMCkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHM18wKQorZmxhc2hfY2ZnM192YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzRfMCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUc1XzApCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisjZW5kaWYgLyogIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgKi8KKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRQorLndvcmQgMHgwNworLndvcmQgMHgwNQorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDFGNAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5Cisud29yZCAweDEyCisud29yZCAweDA0Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDE5Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEKKy53b3JkIDB4MzIKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE2OAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDBCCisud29yZCAweDA2Cisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YKKy53b3JkIDB4MzAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MEUKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MTAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNEMKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgyMQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgxMworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyoKKyAqIFRhYmxlcyBmb3IgMzZ4LzM3eCBkZXZpY2VzCisgKgorICogKFBvcHVsYXRlZCBmb3IgMTNNSHogb25seSkKKyAqLworbXB1XzM2eF9kcGxsX3BhcmFtOgorLy8gICAgTSAgICBOICAgRlMgTTIKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfMzAwTUhaKQorLndvcmQgMTUwLCAgNSwgMCwgMSAJLy8gMTIgICBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDEzICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAxOS4yIE1IegorLndvcmQgMTUwLCAxMiwgMCwgMSAJLy8gMjYgICBNSHoKKy53b3JkIDEyNSwgMTUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopCisud29yZCAzMDAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgNjAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDMsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAzMDAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAgNywgMCwgMSAJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJNUFUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopICovCisKK2l2YV8zNnhfZHBsbF9wYXJhbToKKy8vICAgICBNICAgTiAgIEZTIE0yCisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE2LjggTUh6CisKK2NvcmVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfMjAwTUhaKQorLndvcmQgMTAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMTAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCA3MSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8zMzJNSFopCisud29yZCAxNjYsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAzMzIsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCA0MTUsIDIzLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxNjYsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCA0MTUsIDQ3LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikKKy53b3JkIDIwMCwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDQwMCwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDM3NSwgMTcsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDIwMCwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDM3NSwgMzUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJDb3JlIERQTEwgc2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkISIKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikgKi8KKworLyoKKyAqIEZvciB0aGUgcGVyaXBoZXJhbCAoUEVSKSAoYWthIERQTEw0KSBjbG9jayBzZXR0aW5ncywgdGhlcmUgYXJlIG9ubHkKKyAqIGVmZmVjdGl2ZWx5IHR3byBjbG9jayBjaG9pY2VzLCA5NiBNSHogb3IgMTkyIE1Iei4gSG93ZXZlciwgdGhlIG9ubHkKKyAqIHRpbWUgMTkyIE1IeiBpcyBhcHQgdG8gYmUgdXNlZCBpbiBhbiBhcHBsaWNhdGlvbiBpcyBpZiBib3RoIFNHWCBhbmQKKyAqIFRWIG91dHB1dCBhcmUgdXNlZC4KKyAqCisgKiAgIEZvciBhbnkgZ2l2ZW4gc3lzdGVtIGNsb2NrLCB0aGUgZGl2aWRlcnMgYXJlIGNvbmZpZ3VyZWQgdGh1cyAocGVyCisgKiAgIFNlY3Rpb24gMy41LjMuMy4zLjIgIlR5cGUgQiBEUExMIChMb3ctSml0dGVyKSIgb2YgdGhlIE9NQVAzIFRSTSk6CisgKgorICogICAgIFBFUltjbGtvdXRdID0gKFNZU1tjbGtvdXRdICogTSkgLyAoTiArIDEpCisgKgorICogICAgICAgTTJbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMiAgICAgICAgICAgdXNlZCBieSBVQVJULCBNTUMsIEkyQywgZXRjLgorICogICAgICAgTTNbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMyAgICAgICAgICAgdXNlZCBieSBUViBvdXQuCisgKiAgICAgICBNNFtjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE00ICAgICAgICAgICB1c2VkIGJ5IERTUy4KKyAqICAgICAgIE01W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTUgICAgICAgICAgIHVzZWQgYnkgY2FtZXJhLgorICogICAgICAgTTZbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNiAgICAgICAgICAgdXNlZCBieSBlbXVsYXRpb24uCisgKgorICogIFNvLCBmb3IgYSAxOS4yIE1IeiBzeXN0ZW0gY2xvY2sgYW5kIHRoZSBzY2FsYXIgZW50cmllcyBiZWxvdzoKKyAqCisgKiAgICAgICBQRVJbY2xrb3V0XSA9ICgxOS4yICogNTQwKSAvICgxMSArIDEpID0gODY0CisgKgorICogICAgICAgTTJbY2xrb3V0XTogODY0IC8gIDkgPSAgOTYgICBNSHoKKyAqICAgICAgIE0zW2Nsa291dF06IDg2NCAvIDE2ID0gIDU0ICAgTUh6CisgKiAgICAgICBNNFtjbGtvdXRdOiA4NjQgLyAgNSA9IDE3Mi44IE1IegorICogICAgICAgTTVbY2xrb3V0XTogODY0IC8gIDQgPSAyMTYgICBNSHoKKyAqICAgICAgIE02W2Nsa291dF06IDg2NCAvICAzID0gMjg4ICAgTUh6CisgKi8KK3Blcl8zNnhfZHBsbF9wYXJhbToKKy8vICAgIFNZU19DTEsgICAgTSAgICAgIE4gICAgICBNMiAgICAgIE0zICAgICAgTTQgICAgIE01ICAgICAgTTYgICAgICBtMkRJVgorLndvcmQgMTIwMDAsICAgIDQzMiwgICAgNSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDEyICAgTUh6Cisud29yZCAxMzAwMCwgICAgODY0LCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTMgICBNSHoKKy53b3JkIDE5MjAwLCAgICA1NDAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxOS4yIE1IegorLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDI2ICAgTUh6Cisud29yZCAzODQwMCwgICAgMjcwLCAgIDExLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMzguNCBNSHoKKy53b3JkIDE2ODAwLCAgICAzNjAsICAgIDYsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxNi44IE1IegorCisuZ2xvYmwgZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbQorZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIG1wdV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0KK2dldF8zNnhfaXZhX2RwbGxfcGFyYW06CisJYWRyCXIwLCBpdmFfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbQorZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW06CisJYWRyCXIwLCBjb3JlXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbQorZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbToKKwlhZHIJcjAsIHBlcl8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wbGF0Zm9ybS5oIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzNmU1YQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvcgorICogICAgICBhY2Nlc3NpbmcgRGlnaXRhbCBQaGFzZWQgTG9jayBMb29wIChEUExMKSBwYXJhbWV0ZXJzIGFuZAorICogICAgICBzZXR0aW5ncy4KKyAqCisgKi8KKworI2lmbmRlZiBfTkVTVF9ESUFNT05EX1BMQVRGT1JNX0hfCisjZGVmaW5lIF9ORVNUX0RJQU1PTkRfUExBVEZPUk1fSF8KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qCisgKiBUeXBlIERlZmluaXRpb25zCisgKi8KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisJdTMyIG07CisJdTMyIG47CisJdTMyIGZzZWw7CisJdTMyIG0yOworfTsKKworc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSB7CisJdTMyIHN5c19jbGs7CisJdTMyIG07CisJdTMyIG47CisJdTMyIG0yOworCXUzMiBtMzsKKwl1MzIgbTQ7CisJdTMyIG01OworCXUzMiBtNjsKKwl1MzIgbTJkaXY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcGxsX3BhcmFtIGRwbGxfcGFyYW07CisKKy8qCisgKiBJbmxpbmUgRnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBwbGF0Zm9ybS5TLgorICovCisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9ORVNUX0RJQU1PTkRfUExBVEZPUk1fSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wcmNtLmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcHJjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjVhZDcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcHJjbS5jCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgY2xvY2sgc2V0LXVwIGZvciB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZAorICogICAgICBDbG9jayBNYW5hZ2VyIChQUkNNKQorICoKKyAqICAgICAgVGhpcyBpcyBvcmlnaW5hbGx5IGluaGVyaXRlZCBhbmQgc3BsaXQgZnJvbSB0aGUgT01BUDMgRVZNCisgKiAgICAgIGJvYXJkIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoKKyAqICB1MzIgZ2V0X29zY19jbGtfc3BlZWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBkZXRlcm1pbmVzIHRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZCBiYXNlZCBvbgorICogICAgYSBrbm93biAzMiBrSHogY2xvY2sgYW5kIGdlbmVyYWwgcHVycG9zZSB0aW1lci4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgcmVmZXJlbmNlIG9zY2lsbGF0b3IgY2xvY2sgc3BlZWQuCisgKgorICovCitzdGF0aWMgdTMyCitnZXRfb3NjX2Nsa19zcGVlZCh2b2lkKQoreworCXUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgY2RpdiwgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJNX0NMS1NSQ19DVFJMKTsKKworCWlmICh2YWwgJiBCSVQ3KQorCQljZGl2ID0gMjsKKwllbHNlIGlmICh2YWwgJiBCSVQ2KQorCQljZGl2ID0gMTsKKwllbHNlCisJCS8qCisJCSAqIFNob3VsZCBuZXZlciByZWFjaCBoZXJlIQorCQkgKiBUQkQ6IEFkZCBhIFdBUk4oKS9CVUcoKQorCQkgKiAgICAgIEZvciBub3csIGFzc3VtZSBkaXZpZGVyIGFzIDEuCisJCSAqLworCQljZGl2ID0gMTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwlpZiAoY2RpdiA9PSAyKQorCXsKKwkJY2RpZmYgKj0gMjsKKwl9CisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoKKyAqICB2b2lkIGdldF9zeXNfY2xraW5fc2VsKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBQUkNNIFBSTSBzeXN0ZW0gY2xvY2sKKyAqICAgIGZyZXF1ZW5jeSBzZWxlY3Rvciwgd2hpY2ggc2hvdWxkIGJlIHdyaXR0ZW4gdG8gUFJNX0NMS1NFTC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBoZXJ0eiAgLSBUaGUgc3BlZWQsIGluIE1IeiwgdGhhdCB0aGUgc3lzdGVtIGNsb2NrIGlzIGJlbGlldmVkCisgKiAgICAgICAgICAgICAgIHRvIGJlIHJ1bm5pbmcgYXQuCisgKiAgICBzeXNfY2xraW5fc2VsIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBpbmRleCB1c2VkIHRvIGFjY2VzcyB0aGUKKyAqICAgICAgICAgICAgICAgZGlnaXRhbCBQTEwgc2V0dGluZ3MuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IGZvciB0aGUgZGlnaXRhbCBQTEwgc2V0dGluZ3MKKyAqICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBzcGVjaWZpZWQgc3lzdGVtIGNsb2NrIHJhdGUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitnZXRfc3lzX2Nsa2luX3NlbCh1MzIgaGVydHosIHUzMiAqc3lzX2Nsa2luX3NlbCkKK3sKKwlzd2l0Y2ggKGhlcnR6KSB7CisKKwljYXNlIFMzOF80TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMzhfNF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMjZNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8yNl8wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxOV8yTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTZfOE06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE2XzhfTUhaOworCQlicmVhazsKKworCWNhc2UgUzEzTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTNfMF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTJNOgorCWRlZmF1bHQ6CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEyXzBfTUhaOworCQlicmVhazsKKworCX0KK30KKworLyoKKyAqIE9NQVAzNHgvMzV4IHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNFgpOwkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciA9IHB0ciArIGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CQkvKiBzZXQgTTUgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDUsIFBFUl9NNFgyKTsJCS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkJLyogc2V0IE0zICovCisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChQRVJJUEhfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzIwOjIzXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAyMCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpIDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoTVBVX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfTVBVWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIHB0ci0+ZnNlbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChJVkEyX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfSVZBMls0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqIE9NQVAzNjMwIHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNlgpOwkJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorZHBsbDRfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqcHRyOworCisJcHRyID0gKHN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKilnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBNNiAoRElWX0RQTEw0KTogQ01fQ0xLU0VMMV9FTVVbMjQ6MjldICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDYsIHB0ci0+bTYpOworCisJLyogTTUgKENMS1NFTF9DQU0pOiBDTV9DTEtTRUwxX0VNVVswOjVdICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA2LCBwdHItPm01KTsKKworCS8qIE00IChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNiwgcHRyLT5tNCk7CisKKwkvKiBNMyAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzg6MTNdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA2LCBwdHItPm0zKTsKKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MTldICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTIsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIE0yRElWIChDTEtTRUxfOTZNKTogQ01fQ0xLU0VMX0NPUkVbMTI6MTNdICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMTIsIDIsIHB0ci0+bTJkaXYpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCk6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK21wdV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fTVBVX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiAgdm9pZCBwcmNtX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyBjbG9ja3MgaW4gYSBib2FyZC1zcGVjaWZpYyBtYW5uZXIgZm9yCisgKiAgICB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZCBDbG9jayBNYW5hZ2VyIChQUkNNKSBhbmQgaXMKKyAqICAgIGNhbGxlZCBvbmx5IHdoZW4gYW4gU1JBTS1iYXNlZCBzdGFjayBpcyBhdmFpbGFibGUgKGkuZS4gbm8KKyAqICAgIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3ByY21faW5pdCh2b2lkKQoreworCXUzMiBzeXNfY2xrX3JhdGUgPSAwLCBzeXNfY2xraW5fc2VsLCBzeXNfY2xrX2RpdjsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJc3lzX2Nsa19yYXRlID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChzeXNfY2xrX3JhdGUsICZzeXNfY2xraW5fc2VsKTsKKworCS8qIFNldCB0aGUgUFJNX0NMS1NFTF9TWVNfQ0xLSU5fU0VMIHZhbHVlIGluIHRoZSBwcm9jZXNzb3IuICovCisKKwlzcjMyKFBSQ01fUFJNX0NDUl9DTEtTRUwsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfU1RBUlQsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfQklUUywKKwkJIHN5c19jbGtpbl9zZWwpOworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlIGJ5IHR3by4KKwkgKgorCSAqIE9uIE9NQVAzNjMwLCBERFIgZGF0YSBjb3JydXB0aW9uIGhhcyBiZWVuIG9ic2VydmVkIG9uIE9GRiBtb2RlCisJICogZXhpdCBpZiB0aGUgc3lzIGNsb2NrIHdhcyBsb3dlciB0aGFuIDI2TS4gQXMgYSB3b3JrIGFyb3VuZCwKKwkgKiBPTUFQMzYzMCBpcyBvcGVyYXRlZCBhdCAyNk0gc3lzIGNsb2NrIGFuZCB0aGlzIGludGVybmFsIGRpdmlzaW9uCisJICogaXMgbm90IHBlcmZvcm1lZC4KKwkgKi8KKworCWlmKChpc19jcHVfZmFtaWx5KCkgIT0gQ1BVX09NQVAzNlhYKSAmJgorCSAgIChzeXNfY2xraW5fc2VsID4gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaKSkgeworCQlzeXNfY2xrX2RpdiA9IFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8yOworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsIC8gMjsKKworCX0gZWxzZSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzE7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAxOworCisJfQorCisJc3IzMihQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9TVEFSVCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CSVRTLAorCQkgc3lzX2Nsa19kaXYpOworCisJaWYgKGlzX2NwdV9mYW1pbHkoKSA9PSBDUFVfT01BUDM2WFgpIHsKKwkJZHBsbDNfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKworCX0gZWxzZSB7CisJCXNpbF9pbmRleCA9IGdldF9jcHVfcmV2KCkgLSAxOworCisJCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCQkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCQkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUKKwkJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuCisJCSAqLworCisJCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJCWRwbGwzX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKworCQkvKiBMb2NrIE1QVSBEUExMIHRvIHNldCBmcmVxdWVuY3kgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisJfQorCisJLyogU2V0IHVwIEdQVGltZXJzIHRvIHN5c19jbGsgc291cmNlIG9ubHkgKi8KKyAJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCA4LCAweGZmKTsKKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAwLCAxLCAxKTsKKworCWRlbGF5KDUwMDApOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDYwM2EyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgWC1Mb2FkZXIgbGlua2VyIHNjYXR0ZXIgZmlsZSBmb3IgdGhlIE5lc3QKKyAqICAgICAgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKi8KKworLyoKKyAqIE5vdmVtYmVyIDIwMDYgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgMzQzMHNkcCBkZXZpY2UKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvb21hcDMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZTRhOTAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsNjIgQEAKKyMKKyMgICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisjICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjICAgIERlc2NyaXB0aW9uOgorIyAgICAgIFRoaXMgZmlsZSBpcyB0aGUgbWFrZSBmaWxlIGZvciBwb3J0aW9ucyBvZiBYLUxvYWRlciBzcGVjaWZpYworIyAgICAgIHRvIHRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisjCisKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9IGo0OS5vIG11eC5vIHByY20ubworU09CSlMJOj0gcGxhdGZvcm0ubworCitDUFBGTEFHUyArPSAtSSQoVE9QRElSKS9ib2FyZC8kKEJPQVJERElSKQorCitTUkNTICAgIDo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQorCiskKExJQik6ICQob2JqKS5kZXBlbmQgJChTT0JKUykgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChTT0JKUykgJChPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjogIGNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQ5NjBjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9jb25maWcubWsKQEAgLTAsMCArMSwyMSBAQAorCisKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgT01BUDNFVk0gYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cyMKKyMKKyMgT01BUDNFVk0gaGFzIDEgYmFuayBvZiAxMjhNQiBtUE9QLVNEUkFNIG9uIENTMAorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorCisKKyMgRm9yIFhJUCBpbiA2NEsgb2YgU1JBTSBvciBkZWJ1ZyAoR1AgZGV2aWNlIGhhcyBpdCBhbGwgYXZhaWxhYmUpCisjIFNSQU0gNDAyMDAwMDAtNDAyMEZGRkYgYmFzZQorIyBpbml0aWFsIHN0YWNrIGF0IDB4NDAyMGZmZmMgdXNlZCBpbiBzX2luaXQgKGJlbG93IHhsb2FkZXIpLgorIyBUaGUgcnVuIHRpbWUgc3RhY2sgaXMgKGFib3ZlIHhsb2FkZXIsIDJrIGJlbG93KQorIyBJZiBhbnkgZ2xvYmFscyBleGlzdCB0aGVyZSBuZWVkcyB0byBiZSByb29tIGZvciB0aGVtIGFsc28KKworVEVYVF9CQVNFID0gMHg0MDIwMDAwMAorU1RBQ0tfQkFTRSA9IDB4NDAyMEZDQjAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvajQ5LmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL2o0OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDliYmMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL2o0OS5jCkBAIC0wLDAgKzEsMTA0NiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNgorICogICAgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogICAgSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNBQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgb24gR1BJTywgUkFNIGFuZCBmbGFzaCBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgaXMgaW5oZXJpdGVkIGZyb20gdGhlIE9NQVAzIEVWTSBlcXVpdmFsZW50IGZpbGUuCisgKgorICogICAgICBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBvcmRlciBpcyByb3VnaGx5OgorICoKKyAqICAgICAgICAxKSBzX2luaXQKKyAqICAgICAgICAyKSBib2FyZF9pbml0CisgKiAgICAgICAgMykgbWlzY19pbml0X3IKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2RlZmluZSBNQVhfSjQ5X0JPT1RfREVWSUNFUyAoMykKKwordm9pZAordWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpIHsKKwlkZWxheSh1c2Vjcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitnZXRfY3B1X2lkKHZvaWQpCit7CisJdTMyIGNwdWlkID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChjcHVpZCkpOworCisJcmV0dXJuIChjcHVpZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2dldF9jcHVfcmV2KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJaWYgKChjcHVpZCAgJiAweGYpID09IDB4MCkgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMSk7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMik7CisKKwl9CisKK30KKwordTMyCitpc19jcHVfZmFtaWx5KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCXUzMiBjcHVfZmFtaWx5ID0gMCwgb21hcDM0eHhfaWQgPSAwOworCXUxNiBoYXdrZXllOworCisJaWYgKChjcHVpZCAmIDB4ZikgPT0gMHgwKSB7CisJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisKKwl9IGVsc2UgeworCQlvbWFwMzR4eF9pZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0NPTlRST0xfSUQpOworCQloYXdrZXllICA9IChvbWFwMzR4eF9pZCA+PiBIQVdLRVlFX1NISUZUKSAmIDB4ZmZmZjsKKworCQlzd2l0Y2ggKGhhd2tleWUpIHsKKworCQljYXNlIEhBV0tFWUVfQU0zNVhYOgorCQkJY3B1X2ZhbWlseSA9IENQVV9BTTM1WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM2WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNlhYOworCQkJYnJlYWs7CisKKwkJY2FzZSBIQVdLRVlFX09NQVAzNFhYOgorCQlkZWZhdWx0OgorCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKwkJCWJyZWFrOworCisJCX0KKwl9CisKKwlyZXR1cm4gKGNwdV9mYW1pbHkpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B1X2lzXzM0MTAodm9pZCkgLSByZXR1cm5zIHRydWUgZm9yIDM0MTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2NwdV9pc18zNDEwKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpZihnZXRfY3B1X3JldigpIDwgQ1BVXzM0MzBfRVMyKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHJlYWQgc2NhbGFiaWxpdHkgc3RhdHVzIGFuZCByZXR1cm4gMSBmb3IgMzQxMCovCisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMpOworCQkvKiBDaGVjayB3aGV0aGVyIE1QVSBmcmVxdWVuY3kgaXMgc2V0IHRvIDI2NiBNSHogd2hpY2gKKwkJICogaXMgbm9taW5hbCBmb3IgMzQxMC4gSWYgeWVzIHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkJICovCisJCWlmICgoKHN0YXR1cyA+PiA4KSAmIDB4MykgPT0gMHgyKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqICB2b2lkIHNyMzIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBjbGVhcnMgYW5kIHNldHMgYSB2YWx1ZSBpbiBhIGJpdCBleHRlbnQgZm9yIGEKKyAqICAgIDMyLWJpdCB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgKgorICogIElucHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3MgYXQgd2hpY2ggdG8gY2xlYXIgYW5kIHNldCB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgICAgICAgICBzcGVjaWZpZWQgMzItYml0IHZhbHVlLgorICogICAgc3RhcnRfYml0IC0gVGhlIGZpcnN0IGJpdCBvZiB0aGUgMzItYml0IGRhdGEgdG8gY2xlYXIgYW5kIHNldC4KKyAqICAgIG51bV9iaXRzICAtIFRoZSByYW5nZSBvZiBiaXRzIG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgdmFsdWUgICAgIC0gVGhlIHZhbHVlIHRvIHNldC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdCBleHRlbnQgY2xlYXJlZCBhbmQKKyAqICAgICAgICAgICAgICAgIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgdG1wLCBtc2sgPSAwOworCisJbXNrID0gKDEgPDwgbnVtX2JpdHMpOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoKKyAqICB1MzIgd2FpdF9vbl92YWx1ZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJlYWRzIHRoZSByZWdpc3RlciBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYW5kCisgKiAgICBidXN5IHdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgbWF0Y2ggdmFsdWUgaXMgcmVhZCBvciB1bnRpbCB0aGUKKyAqICAgIGJvdW5kZWQgbnVtYmVyIG9mIGxvb3BzIGhhdmUgYmVlbiByZWFjaGVkLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIHJlYWRfYml0X21hc2sgLSBUaGUgYml0IG1hc2sgdG8gYXBwbHkgYWZ0ZXIgcmVhZGluZyB0aGUgcmVnaXN0ZXIuCisgKiAgICBtYXRjaF92YWx1ZSAgIC0gVGhlIHZhbHVlIHRvIG1hdGNoIG9uIGFmdGVyIHJlYWRpbmcgYW5kIG1hc2tpbmcuCisgKiAgICByZWFkX2FkZHIgICAgIC0gVGhlIHJlZ2lzdGVyIGFkZHJlc3MgdG8gcmVhZC4KKyAqICAgIGJvdW5kICAgICAgICAgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdG8gcmVhZCBiZWZvcmUgZ2l2aW5nCisgKiAgICAgICAgICAgICAgICAgICAgdXAuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVHJ1ZSAoMSkgaWYgdGhlIG1hdGNoX3ZhbHVlIHdhcyByZWFjaGVkOyBvdGhlcndpc2UsIGZhbHNlICgwKS4KKyAqCisgKi8KK3UzMgord2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNlY3VyZV91bmxvY2sKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCBzZWN1cml0eSByZWdpc3RlcnMgZm9yIGFjY2VzcworICogKEdQIERldmljZSBvbmx5KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3NlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAordHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwljb25zdCBpbnQgdHlwZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCisJLyoKKwkgKiBJZiB0aGUgcHJvY2Vzc29yIGlzIGEgR1AgZGV2aWNlLCB1bmxvY2sgdGhlIGRldmljZSBTUkFNIGZvcgorCSAqIGdlbmVyYWwgdXNlLgorCSAqLworCisJaWYgKHR5cGUgPT0gQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9HUCkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCisJcmV0dXJuOworfQorCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgU0RSQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woU0RSQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKFNEUkNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChTRFJDX0NTX0NGRyk7CisJRFVNUF9SRUdMKFNEUkNfU0hBUklORyk7CisJRFVNUF9SRUdMKFNEUkNfRVJSX0FERFIpOworCURVTVBfUkVHTChTRFJDX0VSUl9UWVBFKTsKKwlEVU1QX1JFR0woU0RSQ19ETExBX0NUUkwpOworCURVTVBfUkVHTChTRFJDX0RMTEFfU1RBVFVTKTsKKwlEVU1QX1JFR0woU0RSQ19QT1dFUl9SRUcpOworCURVTVBfUkVHTChTRFJDX01DRkdfMCk7CisJRFVNUF9SRUdMKFNEUkNfTVJfMCk7CisJRFVNUF9SRUdMKFNEUkNfRU1SMl8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlEVU1QX1JFR0woU0RSQ19SRlJfQ1RSTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQU5VQUxfMCk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18xKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8xKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzEpOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzEpOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8xKTsKK30KKyNlbHNlCisjIGRlZmluZSBvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIEdQTUMgUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKEdQTUNfUkVWSVNJT04pOworCURVTVBfUkVHTChHUE1DX1NZU0NPTkZJRyk7CisJRFVNUF9SRUdMKEdQTUNfU1lTU1RBVFVTKTsKKwlEVU1QX1JFR0woR1BNQ19JUlFTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUUVOQUJMRSk7CisJRFVNUF9SRUdMKEdQTUNfVElNRU9VVF9DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfQUREUkVTUyk7CisJRFVNUF9SRUdMKEdQTUNfRVJSX1RZUEUgKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcgKTsKKwlEVU1QX1JFR0woR1BNQ19TVEFUVVMgKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMCk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzEpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18yKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMyk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM180KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzQpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN181KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNik7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM183KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzcpOworCisjaWYgMAorCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF82KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU181KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzcpOworCisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV83KTsKKworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzEpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzIpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX1NUQVRVUyk7CisKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDX1NJWkVfQ09ORklHKTsKKworCURVTVBfUkVHTChHUE1DX0VDQzFfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MyX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDM19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzRfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M1X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNl9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzdfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M4X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDOV9SRVNVTFQpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfU1dEQVRBKTsKKyNlbmRpZgorfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX0RFQlVHKSAqLworCisjaWYgZGVmaW5lZChDRkdfUFJDTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBQUkNNIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChQUkNNX1BSTV9DQ1JfQ0xLU0VMKTsKKwlEVU1QX1JFR0woUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMM19QTEwpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DQU0pOworCURVTVBfUkVHTChDTV9DTEtTRUxfQ09SRSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9EU1MpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX0VNVSk7Cit9CisjZWxzZQorI2RlZmluZSBvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ0ZHX1BSQ01fREVCVUcgKi8KKworLyoKKyAqICB2b2lkIGNvbmZpZ19kaWFtb25kX3NkcmFtKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIHByb2Nlc3NvcidzIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisgKiAgICBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDMyIE1iIHggMTYgYiAoNjQKKyAqICAgIE1pQikgRERSIFNEUkFNIG9uIHRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitjb25maWdfZGlhbW9uZF9zZHJhbSh2b2lkKQoreworCXUzMiB2YWx1ZSwgYWN0aW1fY3RybGEsIGFjdGltX2N0cmxiOworCisJLyoKKwkgKiBTdGVwIDE6IFJlc2V0IHRoZSBTRFJDIGNvbnRyb2xsZXIgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIHJlc2V0CisJICogZXZlbnQgdG8gY2xlYXIuCisJICovCisKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX1NFVCwgU0RSQ19TWVNDT05GSUcpOworICAgIHdhaXRfb25fdmFsdWUoU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TVEFUVVMsCisJCQkJICAxMjAwMDAwMCk7CisgICAgX19yYXdfd3JpdGVsKFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9DTEVBUiwgU0RSQ19TWVNDT05GSUcpOworCisJLyoKKwkgKiBTdGVwIDI6IFNldHVwIHRoZSBwb3NpdGlvbiBhbmQgZ2VvbWV0cnkgb2YgdGhlIFNEUkFNIGRldmljZSBvbgorCSAqIHRoZSBjb250cm9sbGVyJ3MgYnVzLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19TSEFSSU5HX0xPQ0tfT0ZGIAkJCQkJCQkJCQkJCXwKKwkJIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzFNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzBNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19TRFJDVFJJU1RBVEVfT0ZGKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfU0hBUklORyk7CisKKwkvKgorCSAqIFN0ZXAgMzogU2V0dXAgdGhlIG1lbW9yeSBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgUkFTIHdpZHRoLAorCSAqIENBUyB3aWR0aCwgYWRkcmVzcyBtdWx0aXBsZXhpbmcsIHNpemUsIGJhbmsgbWFwcGluZywgYnVzIHdpZHRoLAorCSAqIHBvd2VyIG1vZGUsIEREUiB0eXBlIGFuZCBtZW1vcnkgdHlwZS4KKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfTUNGR19MT0NLU1RBVFVTX1JXCQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19SQVNXSURUSF9FTkNPREUoU0RSQ19NQ0ZHX1JBU1dJRFRIXzE0X0JJVFMpCQkJfAorCQkgU0RSQ19NQ0ZHX0NBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfQ0FTV0lEVEhfMTBfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQUREUk1VWExFR0FDWV9GTEVYSUJMRQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVNJWkVfRU5DT0RFKENGR19TRFJBTV9TSVpFX01CKQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX0VOQ09ERShTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fUl9CX0MpfAorCQkgU0RSQ19NQ0ZHX0IzMk5PVDE2X09GRgkJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0RFRVBQRF9TVVBQT1JURUQJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0REUlRZUEVfRU5DT0RFKFNEUkNfTUNGR19ERFJUWVBFX01PQklMRV9ERFIpCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVRZUEVfRU5DT0RFKFNEUkNfTUNGR19SQU1UWVBFX0REUikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NQ0ZHXzApOworCisJLyoKKwkgKiBTdGVwIDQ6IEVzdGFibGlzaCB0aGUgQUMgZmluZSB0dW5pbmcgdGltaW5nIGNoYXJhY3RlcmlzdGljcy4KKwkgKi8KKworCWFjdGltX2N0cmxhCisJCT0gKFNEUkNfQUNUSU1fQ1RSTEFfVFJGQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJGQykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJBU19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJBUykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUkRfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSUkQpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9URFBMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9URFBMKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVERBTF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTCkpOworCisJYWN0aW1fY3RybGIKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQl9UV1RSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UV1RSKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVENLRV9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVENLRSkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RYUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhTUl9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhTUikpOworCisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxhLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChhY3RpbV9jdHJsYiwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCS8qCisJICogU3RlcCA1OiBFc3RhYmxpc2ggdGhlIG1lbW9yeSBhdXRvcmVmcmVzaCBjb250cm9sCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1JGUl9DVFJMX0FSQ1ZfRU5DT0RFKDEyNDQpCQkJCQkJfAorCQkgU0RSQ19SRlJfQ1RSTF9BUkVfRU5DT0RFKFNEUkNfUkZSX0NUUkxfQVJFXzFfQVJDVikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19SRlJfQ1RSTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfUE9XRVJfUkVHX1dBS0VVUF9ERUxBWUVECQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX0FVVE9DT1VOVF9FTkNPREUoMCkJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX1JTVF9FTkFCTEUJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX0lETEVfRElTQUJMRQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9FTkNPREUoU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9OT05FKQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1BBR0VQT0xJQ1lfSFBIQik7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1BPV0VSX1JFRyk7CisKKwkvKgorCSAqIFN0ZXAgNjogRXN0YWJsaXNoIHRoZSBKRURFQy1kZWZpbmVkIG1vZGUgYW5kIERMTCBwYXJhbWV0ZXJzLgorCSAqLworCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCWRlbGF5KDUwMDApOwkgICAgICAgICAgICAgICAgIAorCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfUFJFQ0hBUkdFX0FMTCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfTVJfWkVST18xCQkJCQkJCXwKKwkJIFNEUkNfTVJfV0JTVF9FTkFCTEUJCQkJCXwKKwkJIFNEUkNfTVJfWkVST18wCQkJCQkJCXwKKwkJIFNEUkNfTVJfQ0FTTF9FTkNPREUoU0RSQ19NUl9DQVNMXzMpCXwKKwkJIFNEUkNfTVJfU0lMX1NFUklBTAkJCQkJCXwKKwkJIFNEUkNfTVJfQkxfRU5DT0RFKFNEUkNfTVJfQkxfNCkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NUl8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfRExMQV9DVFJMX0ZJWEVEX0RFTEFZX0VOQ09ERSgwKQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0lOSVRfTEFUX0VOQ09ERSgwKQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfRU5DT0RFKFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9QV0QpIHwgCisJCSBTRFJDX0RMTEFfQ1RSTF9ETExfRU5BQkxFCQkJCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfTE9DS19UUkFDS0lOR0RFTEFZKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfRExMQV9DVFJMKTsKKworCS8qCisJICogRGVsYXkgZm9yIGEgInJlYXNvbmFibHkgbG9uZyIgcGVyaW9kIG9mIHRpbWUgdG8gYWxsb3cgdGhlCisJICogcmVxdWVzdGVkIGNoYW5nZXMgdG8gdGFrZSBlZmZlY3QuCisJICovCisKKyAJZGVsYXkoMHgyMDAwMCk7Cit9CisKKy8qCisgKiAgdm9pZCBzX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyB2ZXJ5IGVhcmx5IHN5c3RlbSBpbml0aWFsaXphdGlvbiBvZiBjaGlwCisgKiAgICBwaW4gbXVsdGlwbGV4aW5nIGFuZCBjbG9ja3MgYW5kIGlzIGNhbGxlZCB3aGVuIE9OTFkgYW4KKyAqICAgIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKworCWRlbGF5KDEwMCk7CisKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ19kaWFtb25kX3NkcmFtKCk7Cit9CisKKy8qCisgKiAgaW50IGJvYXJkX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgZWFybHksIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisgKiAgICBmb2xsb3dpbmcgY29yZSBDUFUgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50Citib2FyZF9pbml0KHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X2RldmljZV90eXBlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZCwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICogICAgZGV2aWNlIGlzIG9mIFRTVCwgRU1VLCBIUyBvciBHUCB0eXBlLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQuCisgKgorICovCit1MzIKK2dldF9kZXZpY2VfdHlwZSh2b2lkKQoreworCWNvbnN0IGludCB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9ERUNPREUodmFsdWUpKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLCBpbmRpY2F0aW5nIHRoZQorICogICAgb3JkZXIgb2YgbWVtb3J5IGludGVyZmFjZXMgZnJvbSB3aGljaCB0aGUgcHJvY2Vzc29yIHdpbGwgYXR0ZW1wdAorICogICAgdG8gYm9vdCBpdHNlbGYuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKyNpZiAwCisJY29uc3QgdTMyIHZhbHVlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpOworCWNvbnN0IHUzMiBwZXJpcGhlcmFsX3R5cGUgPSBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfUEVSSVBIRVJBTDsKKworCS8qCisJICogVGhpcyByb3V0aW5lIGFuZCBjYWxsZXJzIG9mIGl0IGFyZSBpbXBsaWNpdGx5IGV4cGVjdGluZyB0aGUKKwkgKiBNRU1PUlkgaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDApIG5vdCB0aGUgUEVSSElQSEVSQUwKKwkgKiBpbnRlcmZhY2UgKFNZU0JPT1RbNV0gPT0gMSkgYm9vdCBvcmRlciwgc28gY2hlY2sgdGhhdCBpcworCSAqIGFjdHVhbGx5IHRoZSBjYXNlLgorCSAqLworCisJaWYgKENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9ERUNPREUodmFsdWUpID09IHBlcmlwaGVyYWxfdHlwZSkgeworCQloYW5nKCk7CisJfQorCisJcmV0dXJuIChDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX0RFQ09ERSh2YWx1ZSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIDB4M2Y7CisjZW5kaWYKK30KKworLyoKKyAqICBpbnQgZ2V0X2Jvb3RfZGV2aWNlX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlX2xpc3QpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgYSBjb25zdGFudCBsaXN0IGluZGljYXRpbmcgdGhlIHByZWZlcnJlZAorICogICAgZGV2aWNlIGJvb3QgbGlzdC4KKyAqICAgIEl0IGdldHMgY2FsbGVkIGZyb20gc3RhcnRfYXJtYm9vdCBpbiBib2FyZC5jCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHByZWZlcnJlZCBmaXJzdCBwcm9jZXNzb3IgbWVtb3J5IGJvb3QgaW50ZXJmYWNlLgorICoKKyAqLworCitpbnQKK2dldF9ib290X2RldmljZXNfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VzX2xpc3QpCit7CisJc3RhdGljIHUzMiBsaXN0W01BWF9KNDlfQk9PVF9ERVZJQ0VTXTsKKwljb25zdCB1MzIgbWVtX29yZGVyID0gZ2V0X3N5c2Jvb3RfdmFsdWUoKTsKKworCS8vIHNldCBkZWZhdWx0cworCWludCBudW1iZXJfb2ZfZGV2aWNlcyA9IDA7CisJKmRldmljZXNfbGlzdCA9ICZsaXN0WzBdOworCisJc3dpdGNoIChtZW1fb3JkZXIpIHsKKwljYXNlIDE1OgorCQlsaXN0WzBdID0gR1BNQ19OQU5EOworCQlsaXN0WzFdID0gVVNCX1BFUklQSEVSQUw7CisJCWxpc3RbMl0gPSBNTUNfTkFORDsKKwkJbnVtYmVyX29mX2RldmljZXMgPSBNQVhfSjQ5X0JPT1RfREVWSUNFUzsKKwkJYnJlYWs7CisJY2FzZSA0NzoKKwkJbGlzdFswXSA9IFVTQl9QRVJJUEhFUkFMOworCQlsaXN0WzFdID0gTU1DX05BTkQ7CisJCWxpc3RbMl0gPSBHUE1DX05BTkQ7CisJCW51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0o0OV9CT09UX0RFVklDRVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbnVtYmVyX29mX2RldmljZXM7Cit9CisKKy8qCisgKiAgaW50IG1pc2NfaW5pdF9yKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IG1pc2NlbGxhbmVvdXMsIGJvYXJkLXNwZWNpZmljCisgKiAgICBpbml0aWFsaXphdGlvbiBmb2xsb3dpbmcgQ1BVLCBlYXJseSBib2FyZCwgc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gbG9hZGluZyB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyCisgKiAgICB0byBSQU0uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50CittaXNjX2luaXRfcih2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAord2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCS8qIFRoZXJlIGFyZSAzIHdhdGNoIGRvZ3MgV0QxPVNlY3VyZSwgV0QyPU1QVSwgV0QzPUlWQS4gV0QxIGlzCisJICogZWl0aGVyIHRha2VuIGNhcmUgb2YgYnkgUk9NIChIUy9FTVUpIG9yIG5vdCBhY2Nlc3NpYmxlIChHUCkuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgV0QyLU1QVSBvciB0YWtlIGEgUFJDTSByZXNldC4gIFdEMworCSAqIHNob3VsZCBub3QgYmUgcnVubmluZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBQUkNNIHJlc2V0LgorCSAqLworCXNyMzIoQ01fRkNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXNyMzIoQ01fSUNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXdhaXRfb25fdmFsdWUoQklUNSwgMHgyMCwgQ01fSURMRVNUX1dLVVAsIDUpOyAvKiBzb21lIGlzc3VlIGhlcmUgKi8KKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxLCBXRDJfQkFTRSArIFdTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syLCBXRDJfQkFTRSArIFdTUFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgdm9pZCBmb29iYXIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZS4uLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTUMKKwkvKiBFbmFibGUgTU1DMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dwbWNfY29uZmlnXzAodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkKKwkvKgorCSAqIEZpcnN0LCBkaXNhYmxlIHRoZSBpbnRlcmZhY2UgYW5kIHdhaXQuCisJICovCisJX19yYXdfd3JpdGVsKEdQTUNfQ09ORklHN19DU1ZBTElEX0RJU0FCTEVELCBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgxMDAwKTsKKworCS8qCisJICogTmV4dCwgcHJvZ3JhbSB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCSAqLworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcxXzAsIEdQTUNfQ09ORklHMV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMl8wLCBHUE1DX0NPTkZJRzJfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzNfMCwgR1BNQ19DT05GSUczXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc0XzAsIEdQTUNfQ09ORklHNF8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNV8wLCBHUE1DX0NPTkZJRzVfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzZfMCwgR1BNQ19DT05GSUc2XzApOworCisJLyoKKwkgKiBGaW5hbGx5LCBlbmFibGUgdGhlIEdQTUMgbWFwcGluZyBhbmQgc3BpbiBmb3IgdGhlIHBhcmFtZXRlcnMgdG8KKwkgKiBiZWNvbWUgYWN0aXZlLgorCSAqLworCV9fcmF3X3dyaXRlbCgoQ0ZHX0dQTUNfQ09ORklHN18wIHwgR1BNQ19DT05GSUc3X0NTVkFMSURfRU5BQkxFRCksCisJCQkJIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDIwMDApOworCisJaWYgKG5hbmRfY2hpcCgpKXsKKwkJcmV0dXJuICgxKTsKKwl9CisjZW5kaWYgLyogZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApICovCisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIGludCBuYW5kX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyCisgKiAgICAoR1BNQykgc3VjaCB0aGF0IG9uLWJvYXJkIE5BTkQgZGV2aWNlcyBtYXkgYmUgYWNjZXNzZWQgZm9yCisgKiAgICBzZWNvbmQtc3RhZ2UgYm9vdC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE5BTkQgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZDsgb3RoZXJ3aXNlLCAxLgorICoKKyAqLworaW50CituYW5kX2luaXQodm9pZCkKK3sKKwlpbnQgc3RhdHVzID0gMTsKKworCS8qCisJICogRXN0YWJsaXNoIEdQTUMgZ2xvYmFsIHNldHRpbmdzLgorCSAqLworCisJX19yYXdfd3JpdGVsKEdQTUNfU1lTQ09ORklHX0lETEVNT0RFX1NNQVJULCBHUE1DX1NZU0NPTkZJRyk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19JUlFFTkFCTEVfQUxMX0RJU0FCTEUsIEdQTUNfSVJRRU5BQkxFKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX1RJTUVPVVRFTkFCTEVfT0ZGLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7CisKKwlpZiAoZ3BtY19jb25maWdfMCgpKSB7CisJCXB1dHMoIlVuc3VwcG9ydGVkIE5BTkQgZGV2aWNlIEAgR1BNQzAhXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCXN0YXR1cyA9IDA7CisKKyBkb25lOgorCS8qIER1bXAgR1BNQyBhbmQgU0RSQyByZWdpc3RlcnMgaWYgc28gY29uZmlndXJlZC4gKi8KKworCW9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpOworCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKgorICogIHZvaWQgYm9hcmRfaGFuZygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBib2FyZC1zcGVjaWZpYyBhY3Rpb25zIHdoZW4gdGhlIHN5c3RlbQorICogICAgaGFuZ3MgYnkgZXhlY3V0aW5nIGhhbmcoKS4gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyB0byBkbzsKKyAqICAgIGhvd2V2ZXIsIHdlIG1pZ2h0IGxhdGVyIGRyaXZlIHRoZSBwaWV6byBvciBhIExFRC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2JvYXJkX2hhbmcgKHZvaWQpCit7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9tdXguYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjN2RmMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvbXV4LmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBJL08gcGFkIG11bHRpcGxleGVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHZvaWQgc2V0X211eGNvbmZfcmVncygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lcyBzZXRzIHRoZSBJL08gcGFkIG11bHRpcGxleGVycyBmb3IgVUFSVCwgR1BNQywgU0RSQywKKyAqICAgIEdQSU8uCisgKgorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICovCit2b2lkCitzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJLyoKKwkgKiBUaGUgYml0IGZpZWxkcyBmb3IgdGhlc2Ugc2V0dGluZ3MgYXJlIGFzIGZvbGxvd3M6CisJICoKKwkgKiAgIEl7RU4sRElTfQkgCS0gSW5wdXQgRW5hYmxlL0Rpc2FibGUKKwkgKiAgIFBUW0RVXQkJIAktIFB1bGwtZG93biwgLXVwCisJICogICBESVMsRU4JCSAgCS0gUHVsbC1kb3duLCAtdXAgZGlzYWJsZWQvZW5hYmxlZAorCSAqICAgTVswMTIzNDU2N10JLSBDb25maWd1cmF0aW9uIG1vZGUgMC03CisJICovCisKKwkvKgorCSAqIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisJICoKKwkgKiBNb3N0IG9mIHRoZSBTRFJDIHNpZ25hbHMgYXJlIHVzZWQgdG8gZHJpdmUgdGhlIFNhbXN1bmcKKwkgKiBLNFg1MTE2M1BJLUZDRzYgNTEyIE1iIHggMTYtYml0ICg2NCBNaUIpIEREUiBTRFJBTS4gQmVjYXVzZSB3ZQorCSAqIGludGVyZmFjZSBpbiAxNi1iaXQgcmF0aGVyIHRoYW4gMzItYml0IG1vZGUsIHdlIHBsYWNlIHRoZQorCSAqIHVudXNlZCBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKwkgKi8KKworCU1VWF9WQUwoQ1AoU0RSQ19EMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDAKKwlNVVhfVkFMKENQKFNEUkNfRDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxCisJTVVYX1ZBTChDUChTRFJDX0QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMgorCU1VWF9WQUwoQ1AoU0RSQ19EMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDMKKwlNVVhfVkFMKENQKFNEUkNfRDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q0CisJTVVYX1ZBTChDUChTRFJDX0Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENQorCU1VWF9WQUwoQ1AoU0RSQ19ENiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDYKKwlNVVhfVkFMKENQKFNEUkNfRDcpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q3CisJTVVYX1ZBTChDUChTRFJDX0Q4KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDkKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTAKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTEKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTIKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTMKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTQKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTUKKworCS8vIEJlY2F1c2Ugd2UgaW50ZXJmYWNlIFNEUkFNIGluIDE2LWJpdCBtb2RlLCBwbGFjZQorCS8vIFNEUkNfREFUQVszMToxNl0gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0QxNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJTVVYX1ZBTChDUChTRFJDX0NMSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfQ0xLCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzAKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMQorCisJLy8gUGxhY2UgdW51c2VkIERRIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoR1BNQ19BMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTEKKwlNVVhfVkFMKENQKEdQTUNfQTIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EyCisJTVVYX1ZBTChDUChHUE1DX0EzKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMworCU1VWF9WQUwoQ1AoR1BNQ19BNCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTQKKwlNVVhfVkFMKENQKEdQTUNfQTUpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E1CisJTVVYX1ZBTChDUChHUE1DX0E2KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNgorCU1VWF9WQUwoQ1AoR1BNQ19BNyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTcKKworCS8vIFBsYWNlIHRoZSB1bnVzZWQgR1BNQ19BOCBwaW4gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChHUE1DX0E4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gR1BNQ19BOSB0byBHUElPXzQyIHVzZWQgYXMgYSBwdXNoLXB1bGwsIGFjdGl2ZSBsb3cgaW5wdXQKKwkvLyBmcm9tIHRoZSBVU0IgUEhZIGZvciBVU0Igc3VzcGVuZCBub3RpZmljYXRpb24uCisKKwlNVVhfVkFMKENQKEdQTUNfQTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBHUElPXzQyCisJTVVYX1ZBTChDUChHUE1DX0ExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJTVVYX1ZBTChDUChHUE1DX0QwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMAorCU1VWF9WQUwoQ1AoR1BNQ19EMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEKKwlNVVhfVkFMKENQKEdQTUNfRDIpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QyCisJTVVYX1ZBTChDUChHUE1DX0QzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMworCU1VWF9WQUwoQ1AoR1BNQ19ENCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDQKKwlNVVhfVkFMKENQKEdQTUNfRDUpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q1CisJTVVYX1ZBTChDUChHUE1DX0Q2KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENgorCU1VWF9WQUwoQ1AoR1BNQ19ENyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDcKKwlNVVhfVkFMKENQKEdQTUNfRDgpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q4CisJTVVYX1ZBTChDUChHUE1DX0Q5KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOQorCU1VWF9WQUwoQ1AoR1BNQ19EMTApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMAorCU1VWF9WQUwoQ1AoR1BNQ19EMTEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMQorCU1VWF9WQUwoQ1AoR1BNQ19EMTIpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMgorCU1VWF9WQUwoQ1AoR1BNQ19EMTMpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMworCU1VWF9WQUwoQ1AoR1BNQ19EMTQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxNAorCU1VWF9WQUwoQ1AoR1BNQ19EMTUpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxNQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MwKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MwCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzEKKwlNVVhfVkFMKENQKEdQTUNfTkNTMiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMgorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEdQTUNfTkNTNiB0byBHUFQxMV9QV01fRVZUIHVzZWQgYXMgYSBwdXNoLXB1bGwgcHVsc2Ugd2lkdGgKKwkvLyBtb2R1bGF0ZWQgKFBXTSkgc2lnbmFsIGZvciB0aGUgcGllem8uCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0zKSk7CS8vIEdQVDExX1BXTV9FVlQKKworCS8vIEFzc2lnbiBHUE1DX05DUzcgdG8gR1BJT181OCB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dAorCS8vIFBJRVpPX05FTkFCTEUgdG8gdGhlIFRJIFNONzRMVkMyRzI0MCBEdWFsIEJ1ZmZlci9Ecml2ZXIgV2l0aAorCS8vIDMtU3RhdGUgT3V0cHV0cyBpbnB1dHMuCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNTgKKworCU1VWF9WQUwoQ1AoR1BNQ19DTEspLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0NMSworCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uQURWX0FMRQorCU1VWF9WQUwoQ1AoR1BNQ19OT0UpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25PRQorCU1VWF9WQUwoQ1AoR1BNQ19OV0UpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25XRQorCU1VWF9WQUwoQ1AoR1BNQ19OQkUwX0NMRSksCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQkUwX0NMRQorCisJLy8gQXNzaWduIEdQTUNfTkJFMSB0byBHUElPXzYxIHVzZWQgYXMgYSBwdXNoLXB1bGwgb3V0cHV0IHRvIHRoZQorCS8vIFppZ0JlZSBhY3RpdmUtbG93IHJlc2V0LgorCisJTVVYX1ZBTChDUChHUE1DX05CRTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzYxCisKKwlNVVhfVkFMKENQKEdQTUNfTldQKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV1AKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX1dBSVQwCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMQorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVuYXZhaWxhYmxlCisKKwkvLyBBc3NpZ24gR1BNQ19XQUlUMyB0byBHUElPXzY1IHVzZWQgYXMgYW4gYWN0aXZlLWhpZ2gsIHB1c2gtcHVsbAorCS8vIGJhY2twbGF0ZSBkZXRlY3QgaW5wdXQuCisKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzY1CisKKwkvKgorCSAqIERpc3BsYXkgU3Vic3lzdGVtIChEU1MpCisJICoKKwkgKiBBbGwgRFNTIHNpZ25hbHMgYXJlIHVzZWQgaW4gdGhlaXIgbm9ybWFsLCBkZWZhdWx0IG1vZGUgKE1vZGUgMCkKKwkgKiB0byBkcml2ZSB0aGUgU2Ftc3VuZyBMTVMzNTBERjBbMTNdIExDRCBkaXNwbGF5IHBhbmVsLgorCSAqLworCisJTVVYX1ZBTChDUChEU1NfUENMSyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19QQ0xLCisJTVVYX1ZBTChDUChEU1NfSFNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfSFNZTkMKKwlNVVhfVkFMKENQKERTU19WU1lOQyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19WU1lOQworCU1VWF9WQUwoQ1AoRFNTX0FDQklBUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19BQ0JJQVMKKwlNVVhfVkFMKENQKERTU19EQVRBMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExCisJTVVYX1ZBTChDUChEU1NfREFUQTIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIKKwlNVVhfVkFMKENQKERTU19EQVRBMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMworCU1VWF9WQUwoQ1AoRFNTX0RBVEE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE0CisJTVVYX1ZBTChDUChEU1NfREFUQTUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTUKKwlNVVhfVkFMKENQKERTU19EQVRBNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNgorCU1VWF9WQUwoQ1AoRFNTX0RBVEE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE3CisJTVVYX1ZBTChDUChEU1NfREFUQTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTgKKwlNVVhfVkFMKENQKERTU19EQVRBOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBOQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTAKKwlNVVhfVkFMKENQKERTU19EQVRBMTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTExCisJTVVYX1ZBTChDUChEU1NfREFUQTEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTMKKwlNVVhfVkFMKENQKERTU19EQVRBMTQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE0CisJTVVYX1ZBTChDUChEU1NfREFUQTE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTYKKwlNVVhfVkFMKENQKERTU19EQVRBMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE3CisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExOAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTkKKwlNVVhfVkFMKENQKERTU19EQVRBMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIwCisJTVVYX1ZBTChDUChEU1NfREFUQTIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjIKKwlNVVhfVkFMKENQKERTU19EQVRBMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIzCisKKwlNVVhfVkFMKENQKENBTV9XRU4pLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8qCisJICogVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlciAvIFRyYW5zbWl0dGVyIChVQVJUKQorCSAqCisJICovCisKKwlNVVhfVkFMKENQKFVBUlQxX1RYKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfVFgKKwlNVVhfVkFMKENQKFVBUlQxX1JUUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVBUlQxX1JUUworCU1VWF9WQUwoQ1AoVUFSVDFfQ1RTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVUFSVDFfQ1RTCisJTVVYX1ZBTChDUChVQVJUMV9SWCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1JYCisJLyoKKwkgKiBDb250cm9sIGFuZCBEZWJ1ZworCSAqCisJICovCisKKwlNVVhfVkFMKENQKFNZU18zMkspLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfMzJLCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDAKKwlNVVhfVkFMKENQKFNZU19CT09UMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMQorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QyCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDMKKwlNVVhfVkFMKENQKFNZU19CT09UNCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q1CisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDYKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQxKSwgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBTWVNfQ0xLT1VUMQorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfblRSU1QKKwlNVVhfVkFMKENQKEpUQUdfVENLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UQ0sKKwlNVVhfVkFMKENQKEpUQUdfVE1TKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UTVMKKwlNVVhfVkFMKENQKEpUQUdfVERJKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UREkKKwlNVVhfVkFMKENQKEpUQUdfRU1VMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19FTVUxCisJTVVYX1ZBTChDUChFVEtfQ0xLX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfQ1RMX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDBfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDFfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDJfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDNfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDRfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDVfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDZfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDdfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDhfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDlfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEwX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDExX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEyX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEzX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gRVRLX0QxWzQ1XSBhcyBNTTJfUlhSQ1YgYW5kIE1NMl9UWFNFMCBVU0IgRlMvTFMgSG9zdAorCS8vIChNb2RlIDUpCisKKwlNVVhfVkFMKENQKEVUS19EMTRfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBNTTJfUlhSQ1YKKwlNVVhfVkFMKENQKEVUS19EMTVfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBNTTJfVFhTRTAKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQ5ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqICAgIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXR1cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgICAgIEl0IGluaGVyaXRzIGVudGlyZWx5IGZyb20gdGhlIGVxdWl2YWxlbnQgVEkgT01BUDMgRVZNCisgKglmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8KKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IDM0MzAgWC1sb2FkZXIgY3VycmVudGx5IGRvZXMgbm90IHVzZSB0aGlzIGNvZGUuCisqICAgSXQgY291bGQgYmUgcmVtb3ZlZCBpdHMgaXMga2VwdCBmb3IgY29tcGF0YWJpbHkgd2l0aCB1LWJvb3QuCisgKgorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gQ01fQ0xLRU5fUExMLWJ5cGFzcyB2YWx1ZQorICogIFIxID0gQ01fQ0xLU0VMMV9QTEwtbSwgbiwgYW5kIGRpdmlkZXIgdmFsdWVzCisgKiAgUjIgPSBDTV9DTEtTRUxfQ09SRS1kaXZpZGVyIHZhbHVlcworICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoKKyAqICBOb3RlOiBJZiBjb3JlIHVubG9ja3MvcmVsb2NrcyBhbmQgU0RSQU0gaXMgcnVubmluZyBmYXN0IGFscmVhZHkgaXQgZ2V0cworICogICAgICAgIGNvbmZ1c2VkLiAgQSByZXNldCBvZiB0aGUgY29udHJvbGxlciBnZXRzIGl0IGJhY2suICBUYWtpbmcgYXdheSBpdHMKKyAqICAgICAgICBMMyB3aGVuIGl0cyBub3QgaW4gc2VsZiByZWZyZXNoIHNlZW1zIGJhZCBmb3IgaXQuICBOb3JtYWxseSwgdGhpcyBjb2RlCisgKiAgICAgICAgcnVucyBmcm9tIGZsYXNoIGJlZm9yZSBTRFIgaXMgaW5pdCBzbyB0aGF0IHNob3VsZCBiZSBvay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN0bWZkIHNwISwge3I0LXI2fQorCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByNCwgcGxsX2N0bF9hZGQKKyAgICAgICAgc3RyICAgICByMCwgW3I0XQord2FpdDE6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJlcSAgICAgd2FpdDEgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNSwgcGxsX2Rpdl9hZGQxCisgICAgICAgIHN0ciAgICAgcjEsIFtyNV0gICAgICAgICAgLyogc2V0IG0sIG4sIG0yICovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMgorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIC8qIHNldCBsMy9sNC8uLiBkaXZpZGVycyovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMyAgLyogd2t1cCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDMgIC8qIHJzbSB2YWwgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDUgIC8qIGVtdSAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDUKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzVfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIFtyNV0KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbG9jayBEUExMMyBhbmQgd2FpdCBhIGJpdCAqLworICAgICAgICBvcnIgICAgIHIwLCByMCwgIzB4NyAgIC8qIHNldCB1cCBmb3IgbG9jayBtb2RlICovCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8KKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKy8qIFRoZSBOb3IgaGFzIHRvIGJlIGluIHRoZSBGbGFzaCBCYXNlIENTMCBmb3IgdGhpcyBjb25kaXRpb24gdG8gaGFwcGVuICovCitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHMV8wKQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkICAoR1BNQ19DT05GSUczXzApCitmbGFzaF9jZmczX3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHNF8wKQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzVfMCkKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX2Rpdl9hZGQxOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMCitwbGxfZGl2X2FkZDI6CisgICAgLndvcmQgQ01fQ0xLU0VMX0NPUkUKK3BsbF9kaXZfYWRkMzoKKyAgICAud29yZCBDTV9DTEtTRUxfV0tVUAorcGxsX2Rpdl92YWwzOgorICAgIC53b3JkIChXS1VQX1JTTSA8PCAxKQorcGxsX2Rpdl9hZGQ0OgorICAgIC53b3JkIENNX0NMS1NFTF9HRlgKK3BsbF9kaXZfdmFsNDoKKyAgICAud29yZCAoR0ZYX0RJViA8PCAwKQorcGxsX2Rpdl9hZGQ1OgorICAgIC53b3JkIENNX0NMS1NFTDFfRU1VCitwbGxfZGl2X3ZhbDU6CisgICAgLndvcmQgQ0xTRUwxX0VNVV9WQUwKKyNlbmRpZiAvKiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAqLworCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4KKyAqIFRoZSB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBzeXNjbGsgYW5kIGZvciBFUzEgYW5kIEVTMi4KKyAqLworCittcHVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZFCisud29yZCAweDA3Cisud29yZCAweDA1Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MUY0Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxNzkKKy53b3JkIDB4MTIKKy53b3JkIDB4MDQKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MTkKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQQorLndvcmQgMHgzMgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfbXB1X2RwbGxfcGFyYW0KK2dldF9tcHVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIG1wdV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitpdmFfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTY4Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MEIKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDEzRgorLndvcmQgMHgzMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgxNworLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitjb3JlX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgwRQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgxMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE0QworLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDIxCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxCisud29yZCAweDEzCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKgorICogVGFibGVzIGZvciAzNngvMzd4IGRldmljZXMKKyAqCisgKiAoUG9wdWxhdGVkIGZvciAxM01IeiBvbmx5KQorICovCittcHVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF8zMDBNSFopCisud29yZCAxNTAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgMzAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDcsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAxNTAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAxNSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWikKKy53b3JkIDMwMCwgIDUsIDAsIDEgCS8vIDEyICAgTUh6Cisud29yZCA2MDAsIDEyLCAwLCAxIAkvLyAxMyAgIE1IegorLndvcmQgMTI1LCAgMywgMCwgMSAJLy8gMTkuMiBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDI2ICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2Vsc2UKKyMgZXJyb3IgIk1QVSBEUExMIHNldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEiCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWikgKi8KKworaXZhXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgIE0gICBOICAgRlMgTTIKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHoKKworY29yZV8zNnhfZHBsbF9wYXJhbToKKy8vICAgIE0gICAgTiAgIEZTIE0yCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8yMDBNSFopCisud29yZCAxMDAsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAyMDAsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAzNzUsIDM1LCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxMDAsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAzNzUsIDcxLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzMzMk1IWikKKy53b3JkIDE2NiwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDMzMiwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDQxNSwgMjMsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDE2NiwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDQxNSwgNDcsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaKQorLndvcmQgMjAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgNDAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAxNywgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2Vsc2UKKyMgZXJyb3IgIkNvcmUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaKSAqLworCisvKgorICogRm9yIHRoZSBwZXJpcGhlcmFsIChQRVIpIChha2EgRFBMTDQpIGNsb2NrIHNldHRpbmdzLCB0aGVyZSBhcmUgb25seQorICogZWZmZWN0aXZlbHkgdHdvIGNsb2NrIGNob2ljZXMsIDk2IE1IeiBvciAxOTIgTUh6LiBIb3dldmVyLCB0aGUgb25seQorICogdGltZSAxOTIgTUh6IGlzIGFwdCB0byBiZSB1c2VkIGluIGFuIGFwcGxpY2F0aW9uIGlzIGlmIGJvdGggU0dYIGFuZAorICogVFYgb3V0cHV0IGFyZSB1c2VkLgorICoKKyAqICAgRm9yIGFueSBnaXZlbiBzeXN0ZW0gY2xvY2ssIHRoZSBkaXZpZGVycyBhcmUgY29uZmlndXJlZCB0aHVzIChwZXIKKyAqICAgU2VjdGlvbiAzLjUuMy4zLjMuMiAiVHlwZSBCIERQTEwgKExvdy1KaXR0ZXIpIiBvZiB0aGUgT01BUDMgVFJNKToKKyAqCisgKiAgICAgUEVSW2Nsa291dF0gPSAoU1lTW2Nsa291dF0gKiBNKSAvIChOICsgMSkKKyAqCisgKiAgICAgICBNMltjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE0yICAgICAgICAgICB1c2VkIGJ5IFVBUlQsIE1NQywgSTJDLCBldGMuCisgKiAgICAgICBNM1tjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE0zICAgICAgICAgICB1c2VkIGJ5IFRWIG91dC4KKyAqICAgICAgIE00W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTQgICAgICAgICAgIHVzZWQgYnkgRFNTLgorICogICAgICAgTTVbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNSAgICAgICAgICAgdXNlZCBieSBjYW1lcmEuCisgKiAgICAgICBNNltjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE02ICAgICAgICAgICB1c2VkIGJ5IGVtdWxhdGlvbi4KKyAqCisgKiAgU28sIGZvciBhIDE5LjIgTUh6IHN5c3RlbSBjbG9jayBhbmQgdGhlIHNjYWxhciBlbnRyaWVzIGJlbG93OgorICoKKyAqICAgICAgIFBFUltjbGtvdXRdID0gKDE5LjIgKiA1NDApIC8gKDExICsgMSkgPSA4NjQKKyAqCisgKiAgICAgICBNMltjbGtvdXRdOiA4NjQgLyAgOSA9ICA5NiAgIE1IegorICogICAgICAgTTNbY2xrb3V0XTogODY0IC8gMTYgPSAgNTQgICBNSHoKKyAqICAgICAgIE00W2Nsa291dF06IDg2NCAvICA1ID0gMTcyLjggTUh6CisgKiAgICAgICBNNVtjbGtvdXRdOiA4NjQgLyAgNCA9IDIxNiAgIE1IegorICogICAgICAgTTZbY2xrb3V0XTogODY0IC8gIDMgPSAyODggICBNSHoKKyAqLworcGVyXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgU1lTX0NMSyAgICBNICAgICAgTiAgICAgIE0yICAgICAgTTMgICAgICBNNCAgICAgTTUgICAgICBNNiAgICAgIG0yRElWCisud29yZCAxMjAwMCwgICAgNDMyLCAgICA1LCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTIgICBNSHoKKy53b3JkIDEzMDAwLCAgICA4NjQsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxMyAgIE1IegorLndvcmQgMTkyMDAsICAgIDU0MCwgICAxMSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDE5LjIgTUh6Cisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMjYgICBNSHoKKy53b3JkIDM4NDAwLCAgICAyNzAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAzOC40IE1IegorLndvcmQgMTY4MDAsICAgIDM2MCwgICAgNiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDE2LjggTUh6CisKKy5nbG9ibCBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtCitnZXRfMzZ4X21wdV9kcGxsX3BhcmFtOgorCWFkcglyMCwgbXB1XzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbQorZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGl2YV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtCitnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGNvcmVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtCitnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtOgorCWFkcglyMCwgcGVyXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wbGF0Zm9ybS5oIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOGMxMmQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3BsYXRmb3JtLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yCisgKiAgICAgIGFjY2Vzc2luZyBEaWdpdGFsIFBoYXNlZCBMb2NrIExvb3AgKERQTEwpIHBhcmFtZXRlcnMgYW5kCisgKiAgICAgIHNldHRpbmdzLgorICoKKyAqLworCisjaWZuZGVmIF9ORVNUX0o0OV9QTEFURk9STV9IXworI2RlZmluZSBfTkVTVF9KNDlfUExBVEZPUk1fSF8KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qCisgKiBUeXBlIERlZmluaXRpb25zCisgKi8KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisJdTMyIG07CisJdTMyIG47CisJdTMyIGZzZWw7CisJdTMyIG0yOworfTsKKworc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSB7CisJdTMyIHN5c19jbGs7CisJdTMyIG07CisJdTMyIG47CisJdTMyIG0yOworCXUzMiBtMzsKKwl1MzIgbTQ7CisJdTMyIG01OworCXUzMiBtNjsKKwl1MzIgbTJkaXY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcGxsX3BhcmFtIGRwbGxfcGFyYW07CisKKy8qCisgKiBJbmxpbmUgRnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBwbGF0Zm9ybS5TLgorICovCisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9ORVNUX0o0OV9QTEFURk9STV9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wcmNtLmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3ByY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI1YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wcmNtLmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBjbG9jayBzZXQtdXAgZm9yIHRoZSBwcm9jZXNzb3IncyBQb3dlciwgUmVzZXQgYW5kCisgKiAgICAgIENsb2NrIE1hbmFnZXIgKFBSQ00pCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHUzMiBnZXRfb3NjX2Nsa19zcGVlZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGRldGVybWluZXMgdGhlIHJlZmVyZW5jZSBvc2NpbGxhdG9yIHNwZWVkIGJhc2VkIG9uCisgKiAgICBhIGtub3duIDMyIGtIeiBjbG9jayBhbmQgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBjbG9jayBzcGVlZC4KKyAqCisgKi8KK3N0YXRpYyB1MzIKK2dldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCBjZGl2LCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCisJaWYgKHZhbCAmIEJJVDcpCisJCWNkaXYgPSAyOworCWVsc2UgaWYgKHZhbCAmIEJJVDYpCisJCWNkaXYgPSAxOworCWVsc2UKKwkJLyoKKwkJICogU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUhCisJCSAqIFRCRDogQWRkIGEgV0FSTigpL0JVRygpCisJCSAqICAgICAgRm9yIG5vdywgYXNzdW1lIGRpdmlkZXIgYXMgMS4KKwkJICovCisJCWNkaXYgPSAxOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCWlmIChjZGl2ID09IDIpCisJeworCQljZGlmZiAqPSAyOworCX0KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKgorICogIHZvaWQgZ2V0X3N5c19jbGtpbl9zZWwoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIFBSQ00gUFJNIHN5c3RlbSBjbG9jaworICogICAgZnJlcXVlbmN5IHNlbGVjdG9yLCB3aGljaCBzaG91bGQgYmUgd3JpdHRlbiB0byBQUk1fQ0xLU0VMLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGhlcnR6ICAtIFRoZSBzcGVlZCwgaW4gTUh6LCB0aGF0IHRoZSBzeXN0ZW0gY2xvY2sgaXMgYmVsaWV2ZWQKKyAqICAgICAgICAgICAgICAgdG8gYmUgcnVubmluZyBhdC4KKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIGluZGV4IHVzZWQgdG8gYWNjZXNzIHRoZQorICogICAgICAgICAgICAgICBkaWdpdGFsIFBMTCBzZXR0aW5ncy4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgc3lzX2Nsa2luX3NlbCAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggZm9yIHRoZSBkaWdpdGFsIFBMTCBzZXR0aW5ncworICogICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBmb3IgdGhlIHNwZWNpZmllZCBzeXN0ZW0gY2xvY2sgcmF0ZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLworc3RhdGljIHZvaWQKK2dldF9zeXNfY2xraW5fc2VsKHUzMiBoZXJ0eiwgdTMyICpzeXNfY2xraW5fc2VsKQoreworCXN3aXRjaCAoaGVydHopIHsKKworCWNhc2UgUzM4XzRNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8zOF80X01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMyNk06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzI2XzBfTUhaOworCQlicmVhazsKKworCWNhc2UgUzE5XzJNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xOV8yX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxNl84TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTZfOF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTNNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xM18wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxMk06CisJZGVmYXVsdDoKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTJfMF9NSFo7CisJCWJyZWFrOworCisJfQorfQorCisvKgorICogT01BUDM0eC8zNXggc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkCitkcGxsM19pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM0WCk7CS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2RwbGw0X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyID0gcHRyICsgY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA1LCBQRVJfTTZYMik7CQkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJCS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkJLyogc2V0IE00ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA1LCBQRVJfTTNYMik7CQkvKiBzZXQgTTMgKi8KKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKFBFUklQSF9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbMjA6MjNdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCkgOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHVfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChNUFVfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9NUFVbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgNCwgNCwgcHRyLT5mc2VsKTsKK30KKworc3RhdGljIHZvaWQKK2l2YV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKElWQTJfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCA0LCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisvKgorICogT01BUDM2MzAgc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkCitkcGxsM19pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM2WCk7CQkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICpwdHI7CisKKwlwdHIgPSAoc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqKWdldF8zNnhfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIE02IChESVZfRFBMTDQpOiBDTV9DTEtTRUwxX0VNVVsyNDoyOV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNiwgcHRyLT5tNik7CisKKwkvKiBNNSAoQ0xLU0VMX0NBTSk6IENNX0NMS1NFTDFfRU1VWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDYsIHB0ci0+bTUpOworCisJLyogTTQgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1swOjVdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA2LCBwdHItPm00KTsKKworCS8qIE0zIChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbODoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDYsIHB0ci0+bTMpOworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOV0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMiwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogTTJESVYgKENMS1NFTF85Nk0pOiBDTV9DTEtTRUxfQ09SRVsxMjoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAxMiwgMiwgcHRyLT5tMmRpdik7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKTogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9NUFVfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2l2YV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqICB2b2lkIHByY21faW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGNsb2NrcyBpbiBhIGJvYXJkLXNwZWNpZmljIG1hbm5lciBmb3IKKyAqICAgIHRoZSBwcm9jZXNzb3IncyBQb3dlciwgUmVzZXQgYW5kIENsb2NrIE1hbmFnZXIgKFBSQ00pIGFuZCBpcworICogICAgY2FsbGVkIG9ubHkgd2hlbiBhbiBTUkFNLWJhc2VkIHN0YWNrIGlzIGF2YWlsYWJsZSAoaS5lLiBubworICogICAgU0RSQU0pLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcHJjbV9pbml0KHZvaWQpCit7CisJdTMyIHN5c19jbGtfcmF0ZSA9IDAsIHN5c19jbGtpbl9zZWwsIHN5c19jbGtfZGl2OworCXUzMiBjbGtfaW5kZXgsIHNpbF9pbmRleDsKKworCS8qIEdhdWdlIHRoZSBpbnB1dCBjbG9jayBzcGVlZCBhbmQgZmluZCBvdXQgdGhlIHN5c19jbGtpbl9zZWwKKwkgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBjbG9jay4KKwkgKi8KKwlzeXNfY2xrX3JhdGUgPSBnZXRfb3NjX2Nsa19zcGVlZCgpOworCWdldF9zeXNfY2xraW5fc2VsKHN5c19jbGtfcmF0ZSwgJnN5c19jbGtpbl9zZWwpOworCisJLyogU2V0IHRoZSBQUk1fQ0xLU0VMX1NZU19DTEtJTl9TRUwgdmFsdWUgaW4gdGhlIHByb2Nlc3Nvci4gKi8KKworCXNyMzIoUFJDTV9QUk1fQ0NSX0NMS1NFTCwKKwkJIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9TVEFSVCwKKwkJIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9CSVRTLAorCQkgc3lzX2Nsa2luX3NlbCk7CisKKwkvKiBJZiB0aGUgaW5wdXQgY2xvY2sgaXMgZ3JlYXRlciB0aGFuIDE5LjJNIGFsd2F5cyBkaXZpZGUgYnkgdHdvLgorCSAqCisJICogT24gT01BUDM2MzAsIEREUiBkYXRhIGNvcnJ1cHRpb24gaGFzIGJlZW4gb2JzZXJ2ZWQgb24gT0ZGIG1vZGUKKwkgKiBleGl0IGlmIHRoZSBzeXMgY2xvY2sgd2FzIGxvd2VyIHRoYW4gMjZNLiBBcyBhIHdvcmsgYXJvdW5kLAorCSAqIE9NQVAzNjMwIGlzIG9wZXJhdGVkIGF0IDI2TSBzeXMgY2xvY2sgYW5kIHRoaXMgaW50ZXJuYWwgZGl2aXNpb24KKwkgKiBpcyBub3QgcGVyZm9ybWVkLgorCSAqLworCisJaWYoKGlzX2NwdV9mYW1pbHkoKSAhPSBDUFVfT01BUDM2WFgpICYmCisJICAgKHN5c19jbGtpbl9zZWwgPiBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFopKSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzI7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAyOworCisJfSBlbHNlIHsKKwkJc3lzX2Nsa19kaXYgPSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMTsKKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbCAvIDE7CisKKwl9CisKKwlzcjMyKFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMLAorCQkgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX1NUQVJULAorCQkgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JJVFMsCisJCSBzeXNfY2xrX2Rpdik7CisKKwlpZiAoaXNfY3B1X2ZhbWlseSgpID09IENQVV9PTUFQMzZYWCkgeworCQlkcGxsM19pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCisJfSBlbHNlIHsKKwkJc2lsX2luZGV4ID0gZ2V0X2NwdV9yZXYoKSAtIDE7CisKKwkJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJCSAqIHNpbGljb24gcmV2aXNpb24uIFRoZSBjbGtfaW5kZXggdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGdldAorCQkgKiB0aGUgdmFsdWVzIGZvciB0aGF0IGlucHV0IHN5c2NsayBmcm9tIHRoZSBEUExMIHBhcmFtIHRhYmxlCisJCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZQorCQkgKiBhcHByb3ByaWF0ZSBzaWxpY29uIHJldi4KKwkJICovCisKKwkJLyogVW5sb2NrIE1QVSBEUExMIChzbG93cyB0aGluZ3MgZG93biwgYW5kIG5lZWRlZCBsYXRlcikgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9XX1BPV0VSX0JZUEFTUyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkJZHBsbDNfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCisJCS8qIExvY2sgTVBVIERQTEwgdG8gc2V0IGZyZXF1ZW5jeSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKwl9CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MDNhMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIveC1sb2FkLmxkcwpAQCAtMCwwICsxLDY1IEBACisvKgorICoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICogICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBYLUxvYWRlciBsaW5rZXIgc2NhdHRlciBmaWxlIGZvciB0aGUgTmVzdAorICogICAgICBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqLworCisvKgorICogTm92ZW1iZXIgMjAwNiAtIENoYW5nZWQgdG8gc3VwcG9ydCAzNDMwc2RwIGRldmljZQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2U0YTkwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvTWFrZWZpbGUKQEAgLTAsMCArMSw2MiBAQAorIworIyAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlIGZpbGUgZm9yIHBvcnRpb25zIG9mIFgtTG9hZGVyIHNwZWNpZmljCisjICAgICAgdG8gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyMKKworIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gajQ5Lm8gbXV4Lm8gcHJjbS5vCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKK0NQUEZMQUdTICs9IC1JJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpCisKK1NSQ1MgICAgOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMgICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKFNPQkpTKSAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKFNPQkpTKSAkKE9CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOiAgY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxMzgwYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L2NvbmZpZy5tawpAQCAtMCwwICsxLDIxIEBACisKKworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBPTUFQM0VWTSBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzIworIworIyBPTUFQM0VWTSBoYXMgMSBiYW5rIG9mIDEyOE1CIG1QT1AtU0RSQU0gb24gQ1MwCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisKKyMgRm9yIHVzZSBpZiB5b3Ugd2FudCBYLUxvYWRlciB0byByZWxvY2F0ZSBmcm9tIFNSQU0gdG8gRERSCisjVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCitURVhUX0JBU0UgPSAweDQwMjAwODAwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9qNDkuYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L2o0OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzRjNTAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9qNDkuYwpAQCAtMCwwICsxLDEwNDYgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDYKKyAqICAgIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqICAgIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiAgICBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQUNVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IG9uIEdQSU8sIFJBTSBhbmQgZmxhc2ggaW5pdGlhbGl6YXRpb24uCisgKgorICogICAgICBUaGlzIGlzIGluaGVyaXRlZCBmcm9tIHRoZSBPTUFQMyBFVk0gZXF1aXZhbGVudCBmaWxlLgorICoKKyAqICAgICAgSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gb3JkZXIgaXMgcm91Z2hseToKKyAqCisgKiAgICAgICAgMSkgc19pbml0CisgKiAgICAgICAgMikgYm9hcmRfaW5pdAorICogICAgICAgIDMpIG1pc2NfaW5pdF9yCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKyNkZWZpbmUgTUFYX0o0OV9CT09UX0RFVklDRVMgKDMpCisKK3ZvaWQKK3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKSB7CisJZGVsYXkodXNlY3MpOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorZ2V0X2NwdV9pZCh2b2lkKQoreworCXUzMiBjcHVpZCA9IDA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIiAoY3B1aWQpKTsKKworCXJldHVybiAoY3B1aWQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyCitnZXRfY3B1X3Jldih2b2lkKQoreworCWNvbnN0IHUzMiBjcHVpZCA9IGdldF9jcHVfaWQoKTsKKworCS8qIE9uIEVTMS4wIHRoZSBJRENPREUgcmVnaXN0ZXIgaXMgbm90IGV4cG9zZWQgb24gTDQKKwkgKiBzbyB1c2luZyBDUFUgSUQgdG8gZGlmZmVyZW50aWF0ZQorCSAqIGJldHdlZW4gRVMyLjAgYW5kIEVTMS4wLgorCSAqLworCWlmICgoY3B1aWQgICYgMHhmKSA9PSAweDApIHsKKwkJcmV0dXJuIChDUFVfMzQzMF9FUzEpOworCisJfSBlbHNlIHsKKwkJcmV0dXJuIChDUFVfMzQzMF9FUzIpOworCisJfQorCit9CisKK3UzMgoraXNfY3B1X2ZhbWlseSh2b2lkKQoreworCWNvbnN0IHUzMiBjcHVpZCA9IGdldF9jcHVfaWQoKTsKKwl1MzIgY3B1X2ZhbWlseSA9IDAsIG9tYXAzNHh4X2lkID0gMDsKKwl1MTYgaGF3a2V5ZTsKKworCWlmICgoY3B1aWQgJiAweGYpID09IDB4MCkgeworCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCisJfSBlbHNlIHsKKwkJb21hcDM0eHhfaWQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9DT05UUk9MX0lEKTsKKwkJaGF3a2V5ZSAgPSAob21hcDM0eHhfaWQgPj4gSEFXS0VZRV9TSElGVCkgJiAweGZmZmY7CisKKwkJc3dpdGNoIChoYXdrZXllKSB7CisKKwkJY2FzZSBIQVdLRVlFX0FNMzVYWDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfQU0zNVhYOworCQkJYnJlYWs7CisKKwkJY2FzZSBIQVdLRVlFX09NQVAzNlhYOgorCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzZYWDsKKwkJCWJyZWFrOworCisJCWNhc2UgSEFXS0VZRV9PTUFQMzRYWDoKKwkJZGVmYXVsdDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisJCQlicmVhazsKKworCQl9CisJfQorCisJcmV0dXJuIChjcHVfZmFtaWx5KTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNwdV9pc18zNDEwKHZvaWQpIC0gcmV0dXJucyB0cnVlIGZvciAzNDEwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyCitjcHVfaXNfMzQxMCh2b2lkKQoreworCWludCBzdGF0dXM7CisJaWYoZ2V0X2NwdV9yZXYoKSA8IENQVV8zNDMwX0VTMikgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiByZWFkIHNjYWxhYmlsaXR5IHN0YXR1cyBhbmQgcmV0dXJuIDEgZm9yIDM0MTAqLworCQlzdGF0dXMgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NDQUxBQkxFX09NQVBfU1RBVFVTKTsKKwkJLyogQ2hlY2sgd2hldGhlciBNUFUgZnJlcXVlbmN5IGlzIHNldCB0byAyNjYgTUh6IHdoaWNoCisJCSAqIGlzIG5vbWluYWwgZm9yIDM0MTAuIElmIHllcyByZXR1cm4gdHJ1ZSBlbHNlIGZhbHNlCisJCSAqLworCQlpZiAoKChzdGF0dXMgPj4gOCkgJiAweDMpID09IDB4MikKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiAgdm9pZCBzcjMyKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgY2xlYXJzIGFuZCBzZXRzIGEgdmFsdWUgaW4gYSBiaXQgZXh0ZW50IGZvciBhCisgKiAgICAzMi1iaXQgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGFkZHIgICAgICAtIFRoZSBhZGRyZXNzIGF0IHdoaWNoIHRvIGNsZWFyIGFuZCBzZXQgdGhlIHNwZWNpZmllZAorICogICAgICAgICAgICAgICAgc3BlY2lmaWVkIDMyLWJpdCB2YWx1ZS4KKyAqICAgIHN0YXJ0X2JpdCAtIFRoZSBmaXJzdCBiaXQgb2YgdGhlIDMyLWJpdCBkYXRhIHRvIGNsZWFyIGFuZCBzZXQuCisgKiAgICBudW1fYml0cyAgLSBUaGUgcmFuZ2Ugb2YgYml0cyBvZiB0aGUgMzItYml0IGRhdGEgdG8gY2xlYXIgYW5kIHNldC4KKyAqICAgIHZhbHVlICAgICAtIFRoZSB2YWx1ZSB0byBzZXQuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIGFkZHIgICAgICAtIFRoZSBhZGRyZXNzIHdpdGggdGhlIHNwZWNpZmllZCBiaXQgZXh0ZW50IGNsZWFyZWQgYW5kCisgKiAgICAgICAgICAgICAgICBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpCit7CisJdTMyIHRtcCwgbXNrID0gMDsKKworCW1zayA9ICgxIDw8IG51bV9iaXRzKTsKKwktLW1zazsKKwl0bXAgPSBfX3Jhd19yZWFkbChhZGRyKSAmIH4obXNrIDw8IHN0YXJ0X2JpdCk7CisJdG1wIHw9ICB2YWx1ZSA8PCBzdGFydF9iaXQ7CisJX19yYXdfd3JpdGVsKHRtcCwgYWRkcik7Cit9CisKKy8qCisgKiAgdTMyIHdhaXRfb25fdmFsdWUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZWFkcyB0aGUgcmVnaXN0ZXIgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGFuZAorICogICAgYnVzeSB3YWl0cyB1bnRpbCB0aGUgc3BlY2lmaWVkIG1hdGNoIHZhbHVlIGlzIHJlYWQgb3IgdW50aWwgdGhlCisgKiAgICBib3VuZGVkIG51bWJlciBvZiBsb29wcyBoYXZlIGJlZW4gcmVhY2hlZC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICByZWFkX2JpdF9tYXNrIC0gVGhlIGJpdCBtYXNrIHRvIGFwcGx5IGFmdGVyIHJlYWRpbmcgdGhlIHJlZ2lzdGVyLgorICogICAgbWF0Y2hfdmFsdWUgICAtIFRoZSB2YWx1ZSB0byBtYXRjaCBvbiBhZnRlciByZWFkaW5nIGFuZCBtYXNraW5nLgorICogICAgcmVhZF9hZGRyICAgICAtIFRoZSByZWdpc3RlciBhZGRyZXNzIHRvIHJlYWQuCisgKiAgICBib3VuZCAgICAgICAgIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRvIHJlYWQgYmVmb3JlIGdpdmluZworICogICAgICAgICAgICAgICAgICAgIHVwLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRydWUgKDEpIGlmIHRoZSBtYXRjaF92YWx1ZSB3YXMgcmVhY2hlZDsgb3RoZXJ3aXNlLCBmYWxzZSAoMCkuCisgKgorICovCit1MzIKK3dhaXRfb25fdmFsdWUodTMyIHJlYWRfYml0X21hc2ssIHUzMiBtYXRjaF92YWx1ZSwgdTMyIHJlYWRfYWRkciwgdTMyIGJvdW5kKQoreworCXUzMiBpID0gMCwgdmFsOworCWRvIHsKKwkJKytpOworCQl2YWwgPSBfX3Jhd19yZWFkbChyZWFkX2FkZHIpICYgcmVhZF9iaXRfbWFzazsKKwkJaWYgKHZhbCA9PSBtYXRjaF92YWx1ZSkKKwkJCXJldHVybiAoMSk7CisJCWlmIChpID09IGJvdW5kKQorCQkJcmV0dXJuICgwKTsKKwl9IHdoaWxlICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZWN1cmVfdW5sb2NrCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgc2VjdXJpdHkgcmVnaXN0ZXJzIGZvciBhY2Nlc3MKKyAqIChHUCBEZXZpY2Ugb25seSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitzZWN1cmVfdW5sb2NrKHZvaWQpCit7CisJLyogUGVybWlzc2lvbiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAtRnVsbCBmbGVkZ2VkIHBlcm1pc3Npb25zIHRvIGFsbCAqLworCSNkZWZpbmUgVU5MT0NLXzEgMHhGRkZGRkZGRgorCSNkZWZpbmUgVU5MT0NLXzIgMHgwMDAwMDAwMAorCSNkZWZpbmUgVU5MT0NLXzMgMHgwMDAwRkZGRgorCS8qIFByb3RlY3Rpb24gTW9kdWxlIFJlZ2lzdGVyIFRhcmdldCBBUEUgKFBNX1JUKSovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRVFfSU5GT19QRVJNSVNTSU9OXzEpOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIFJUX0FERFJfTUFUQ0hfMSk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIE9DTV9BRERSX01BVENIXzIpOworCisJLyogSVZBIENoYW5nZXMgKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBTTVNfUkdfQVRUMCk7IC8qIFNEUkMgcmVnaW9uIDAgcHVibGljICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB0cnlfdW5sb2NrX3NyYW0oKQorICogRGVzY3JpcHRpb246IElmIGNoaXAgaXMgR1AgdHlwZSwgdW5sb2NrIHRoZSBTUkFNIGZvcgorICogIGdlbmVyYWwgdXNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3RyeV91bmxvY2tfbWVtb3J5KHZvaWQpCit7CisJY29uc3QgaW50IHR5cGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKworCS8qCisJICogSWYgdGhlIHByb2Nlc3NvciBpcyBhIEdQIGRldmljZSwgdW5sb2NrIHRoZSBkZXZpY2UgU1JBTSBmb3IKKwkgKiBnZW5lcmFsIHVzZS4KKwkgKi8KKworCWlmICh0eXBlID09IENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfR1ApIHsKKwkJc2VjdXJlX3VubG9jaygpOworCX0KKworCXJldHVybjsKK30KKworI2lmIGRlZmluZWQoQ0ZHX1NEUkFNX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIFNEUkMgUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKFNEUkNfUkVWSVNJT04pOworCURVTVBfUkVHTChTRFJDX1NZU0NPTkZJRyk7CisJRFVNUF9SRUdMKFNEUkNfU1lTU1RBVFVTKTsKKwlEVU1QX1JFR0woU0RSQ19DU19DRkcpOworCURVTVBfUkVHTChTRFJDX1NIQVJJTkcpOworCURVTVBfUkVHTChTRFJDX0VSUl9BRERSKTsKKwlEVU1QX1JFR0woU0RSQ19FUlJfVFlQRSk7CisJRFVNUF9SRUdMKFNEUkNfRExMQV9DVFJMKTsKKwlEVU1QX1JFR0woU0RSQ19ETExBX1NUQVRVUyk7CisJRFVNUF9SRUdMKFNEUkNfUE9XRVJfUkVHKTsKKwlEVU1QX1JFR0woU0RSQ19NQ0ZHXzApOworCURVTVBfUkVHTChTRFJDX01SXzApOworCURVTVBfUkVHTChTRFJDX0VNUjJfMCk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJRFVNUF9SRUdMKFNEUkNfUkZSX0NUUkxfMCk7CisJRFVNUF9SRUdMKFNEUkNfTUFOVUFMXzApOworCURVTVBfUkVHTChTRFJDX01DRkdfMSk7CisJRFVNUF9SRUdMKFNEUkNfTVJfMSk7CisJRFVNUF9SRUdMKFNEUkNfRU1SMl8xKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQV8xKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQl8xKTsKKwlEVU1QX1JFR0woU0RSQ19SRlJfQ1RSTF8xKTsKKwlEVU1QX1JFR0woU0RSQ19NQU5VQUxfMSk7Cit9CisjZWxzZQorIyBkZWZpbmUgb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX1NEUkFNX0RFQlVHKSAqLworCisjaWYgZGVmaW5lZChDRkdfR1BNQ19ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBHUE1DIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChHUE1DX1JFVklTSU9OKTsKKwlEVU1QX1JFR0woR1BNQ19TWVNDT05GSUcpOworCURVTVBfUkVHTChHUE1DX1NZU1NUQVRVUyk7CisJRFVNUF9SRUdMKEdQTUNfSVJRU1RBVFVTKTsKKwlEVU1QX1JFR0woR1BNQ19JUlFFTkFCTEUpOworCURVTVBfUkVHTChHUE1DX1RJTUVPVVRfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfRVJSX0FERFJFU1MpOworCURVTVBfUkVHTChHUE1DX0VSUl9UWVBFICk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHICk7CisJRFVNUF9SRUdMKEdQTUNfU1RBVFVTICk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzApOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18xKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMik7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzMpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN180KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNSk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM182KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzYpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN183KTsKKworI2lmIDAKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF81KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzcpOworCisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU180KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU183KTsKKworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV82KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9DT05GSUcxKTsKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9DT05GSUcyKTsKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9TVEFUVVMpOworCisJRFVNUF9SRUdMKEdQTUNfRUNDX0NPTkZJRyk7CisJRFVNUF9SRUdMKEdQTUNfRUNDX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX0VDQ19TSVpFX0NPTkZJRyk7CisKKwlEVU1QX1JFR0woR1BNQ19FQ0MxX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDMl9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzNfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M0X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNV9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzZfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M3X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDOF9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzlfUkVTVUxUKTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1NXREFUQSk7CisjZW5kaWYKK30KKyNlbHNlCisjIGRlZmluZSBvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAoKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogZGVmaW5lZChDRkdfTkFORF9ERUJVRykgKi8KKworI2lmIGRlZmluZWQoQ0ZHX1BSQ01fREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgUFJDTSBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woUFJDTV9QUk1fQ0NSX0NMS1NFTCk7CisJRFVNUF9SRUdMKFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDNfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLRU5fUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLRU5fUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLRU5fUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtTRUxfQ0FNKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0NPUkUpOworCURVTVBfUkVHTChDTV9DTEtTRUxfRFNTKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9FTVUpOworfQorI2Vsc2UKKyNkZWZpbmUgb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIENGR19QUkNNX0RFQlVHICovCisKKy8qCisgKiAgdm9pZCBjb25maWdfZGlhbW9uZF9zZHJhbSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBwcm9jZXNzb3IncyBTRFJBTSBDb250cm9sbGVyIChTRFJDKQorICogICAgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBTYW1zdW5nIEs0WDUxMTYzUEktRkNHNiAzMiBNYiB4IDE2IGIgKDY0CisgKiAgICBNaUIpIEREUiBTRFJBTSBvbiB0aGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorY29uZmlnX2RpYW1vbmRfc2RyYW0odm9pZCkKK3sKKwl1MzIgdmFsdWUsIGFjdGltX2N0cmxhLCBhY3RpbV9jdHJsYjsKKworCS8qCisJICogU3RlcCAxOiBSZXNldCB0aGUgU0RSQyBjb250cm9sbGVyIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSByZXNldAorCSAqIGV2ZW50IHRvIGNsZWFyLgorCSAqLworCisgICAgX19yYXdfd3JpdGVsKFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9TRVQsIFNEUkNfU1lTQ09ORklHKTsKKyAgICB3YWl0X29uX3ZhbHVlKFNEUkNfU1lTU1RBVFVTX1JFU0VURE9ORSwKKwkJCQkgIFNEUkNfU1lTU1RBVFVTX1JFU0VURE9ORSwKKwkJCQkgIFNEUkNfU1RBVFVTLAorCQkJCSAgMTIwMDAwMDApOworICAgIF9fcmF3X3dyaXRlbChTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfQ0xFQVIsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qCisJICogU3RlcCAyOiBTZXR1cCB0aGUgcG9zaXRpb24gYW5kIGdlb21ldHJ5IG9mIHRoZSBTRFJBTSBkZXZpY2Ugb24KKwkgKiB0aGUgY29udHJvbGxlcidzIGJ1cy4KKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfU0hBUklOR19MT0NLX09GRiAJCQkJCQkJCQkJCQl8CisJCSBTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHX0VOQ09ERShTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHXzE2X0JJVF8xNl8wKQl8CisJCSBTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHX0VOQ09ERShTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHXzE2X0JJVF8xNl8wKQl8CisJCSBTRFJDX1NIQVJJTkdfU0RSQ1RSSVNUQVRFX09GRik7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1NIQVJJTkcpOworCisJLyoKKwkgKiBTdGVwIDM6IFNldHVwIHRoZSBtZW1vcnkgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIFJBUyB3aWR0aCwKKwkgKiBDQVMgd2lkdGgsIGFkZHJlc3MgbXVsdGlwbGV4aW5nLCBzaXplLCBiYW5rIG1hcHBpbmcsIGJ1cyB3aWR0aCwKKwkgKiBwb3dlciBtb2RlLCBERFIgdHlwZSBhbmQgbWVtb3J5IHR5cGUuCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX01DRkdfTE9DS1NUQVRVU19SVwkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfUkFTV0lEVEhfRU5DT0RFKFNEUkNfTUNGR19SQVNXSURUSF8xNF9CSVRTKQkJCXwKKwkJIFNEUkNfTUNGR19DQVNXSURUSF9FTkNPREUoU0RSQ19NQ0ZHX0NBU1dJRFRIXzEwX0JJVFMpCQkJfAorCQkgU0RSQ19NQ0ZHX0FERFJNVVhMRUdBQ1lfRkxFWElCTEUJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19SQU1TSVpFX0VOQ09ERShDRkdfU0RSQU1fU0laRV9NQikJCQkJCXwKKwkJIFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9FTkNPREUoU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX1JfQl9DKXwKKwkJIFNEUkNfTUNGR19CMzJOT1QxNl9PRkYJCQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19ERUVQUERfU1VQUE9SVEVECQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19ERFJUWVBFX0VOQ09ERShTRFJDX01DRkdfRERSVFlQRV9NT0JJTEVfRERSKQkJCXwKKwkJIFNEUkNfTUNGR19SQU1UWVBFX0VOQ09ERShTRFJDX01DRkdfUkFNVFlQRV9ERFIpKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfTUNGR18wKTsKKworCS8qCisJICogU3RlcCA0OiBFc3RhYmxpc2ggdGhlIEFDIGZpbmUgdHVuaW5nIHRpbWluZyBjaGFyYWN0ZXJpc3RpY3MuCisJICovCisKKwlhY3RpbV9jdHJsYQorCQk9IChTRFJDX0FDVElNX0NUUkxBX1RSRkNfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSRkMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkNfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSQykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQVNfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSQVMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUlBfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSUCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQ0RfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSQ0QpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUlJEX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlJEKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVERQTF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERQTCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1REQUxfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1REQUwpKTsKKworCWFjdGltX2N0cmxiCisJCT0gKFNEUkNfQUNUSU1fQ1RSTEJfVFdUUl9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFdUUikJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RDS0VfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RDS0UpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UWFBfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RYUCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RYU1JfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RYU1IpKTsKKworCV9fcmF3X3dyaXRlbChhY3RpbV9jdHJsYSwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoYWN0aW1fY3RybGIsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisKKwkvKgorCSAqIFN0ZXAgNTogRXN0YWJsaXNoIHRoZSBtZW1vcnkgYXV0b3JlZnJlc2ggY29udHJvbAorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19SRlJfQ1RSTF9BUkNWX0VOQ09ERSgxMjQ0KQkJCQkJCXwKKwkJIFNEUkNfUkZSX0NUUkxfQVJFX0VOQ09ERShTRFJDX1JGUl9DVFJMX0FSRV8xX0FSQ1YpKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfUkZSX0NUUkxfMCk7CisKKwl2YWx1ZSA9CisJCShTRFJDX1BPV0VSX1JFR19XQUtFVVBfREVMQVlFRAkJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19BVVRPQ09VTlRfRU5DT0RFKDApCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfU1JGUl9PTl9SU1RfRU5BQkxFCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfU1JGUl9PTl9JRExFX0RJU0FCTEUJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfRU5DT0RFKFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfTk9ORSkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19QQUdFUE9MSUNZX0hQSEIpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19QT1dFUl9SRUcpOworCisJLyoKKwkgKiBTdGVwIDY6IEVzdGFibGlzaCB0aGUgSkVERUMtZGVmaW5lZCBtb2RlIGFuZCBETEwgcGFyYW1ldGVycy4KKwkgKi8KKworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisKKwlkZWxheSg1MDAwKTsJICAgICAgICAgICAgICAgICAKKworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX1BSRUNIQVJHRV9BTEwpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisKKwl2YWx1ZSA9CisJCShTRFJDX01SX1pFUk9fMQkJCQkJCQl8CisJCSBTRFJDX01SX1dCU1RfRU5BQkxFCQkJCQl8CisJCSBTRFJDX01SX1pFUk9fMAkJCQkJCQl8CisJCSBTRFJDX01SX0NBU0xfRU5DT0RFKFNEUkNfTVJfQ0FTTF8zKQl8CisJCSBTRFJDX01SX1NJTF9TRVJJQUwJCQkJCQl8CisJCSBTRFJDX01SX0JMX0VOQ09ERShTRFJDX01SX0JMXzQpKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfTVJfMCk7CisKKwl2YWx1ZSA9CisJCShTRFJDX0RMTEFfQ1RSTF9GSVhFRF9ERUxBWV9FTkNPREUoMCkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9JTklUX0xBVF9FTkNPREUoMCkJCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX0VOQ09ERShTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfUFdEKSB8IAorCQkgU0RSQ19ETExBX0NUUkxfRExMX0VOQUJMRQkJCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0xPQ0tfVFJBQ0tJTkdERUxBWSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX0RMTEFfQ1RSTCk7CisKKwkvKgorCSAqIERlbGF5IGZvciBhICJyZWFzb25hYmx5IGxvbmciIHBlcmlvZCBvZiB0aW1lIHRvIGFsbG93IHRoZQorCSAqIHJlcXVlc3RlZCBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LgorCSAqLworCisgCWRlbGF5KDB4MjAwMDApOworfQorCisvKgorICogIHZvaWQgc19pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgdmVyeSBlYXJseSBzeXN0ZW0gaW5pdGlhbGl6YXRpb24gb2YgY2hpcAorICogICAgcGluIG11bHRpcGxleGluZyBhbmQgY2xvY2tzIGFuZCBpcyBjYWxsZWQgd2hlbiBPTkxZIGFuCisgKiAgICBTUkFNLWJhc2VkIHN0YWNrIGlzIGF2YWlsYWJsZSAoaS5lLiBubyBTRFJBTSkuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitzX2luaXQodm9pZCkKK3sKKwl3YXRjaGRvZ19pbml0KCk7CisJdHJ5X3VubG9ja19tZW1vcnkoKTsKKwlzZXRfbXV4Y29uZl9yZWdzKCk7CisKKwlkZWxheSgxMDApOworCisJcHJjbV9pbml0KCk7CisJcGVyX2Nsb2Nrc19lbmFibGUoKTsKKwljb25maWdfZGlhbW9uZF9zZHJhbSgpOworfQorCisvKgorICogIGludCBib2FyZF9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IGVhcmx5LCBib2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICogICAgZm9sbG93aW5nIGNvcmUgQ1BVIGluaXRpYWxpemF0aW9uIGJ1dCBwcmlvciB0byBzZXJpYWwgYW5kIE5BTkQKKyAqICAgIGluaXRpYWxpemF0aW9uLgorICoKKyAqICAgIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgYm9hcmQtc3BlY2lmaWMgdG8gZG8uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBPSzsgb3RoZXJ3aXNlLCBub24temVybyBvbiBlcnJvci4KKyAqCisgKi8KK2ludAorYm9hcmRfaW5pdCh2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiAgdTMyIGdldF9kZXZpY2VfdHlwZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGRlY29kZWQgdmFsdWUgZnJvbSB0aGUgQ1BVJ3MKKyAqICAgIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQsIGluZGljYXRpbmcgd2hldGhlciB0aGUKKyAqICAgIGRldmljZSBpcyBvZiBUU1QsIEVNVSwgSFMgb3IgR1AgdHlwZS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgZGVjb2RlZCBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBERVZJQ0VUWVBFIGZpZWxkLgorICoKKyAqLwordTMyCitnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKwljb25zdCBpbnQgdmFsdWUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUyk7CisKKwlyZXR1cm4gKENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfREVDT0RFKHZhbHVlKSk7Cit9CisKKy8qCisgKiAgdTMyIGdldF9zeXNib290X3ZhbHVlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZCwgaW5kaWNhdGluZyB0aGUKKyAqICAgIG9yZGVyIG9mIG1lbW9yeSBpbnRlcmZhY2VzIGZyb20gd2hpY2ggdGhlIHByb2Nlc3NvciB3aWxsIGF0dGVtcHQKKyAqICAgIHRvIGJvb3QgaXRzZWxmLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIFNZU0JPT1Qgb3JkZXIgc3ViZmllbGQuCisgKgorICovCit1MzIKK2dldF9zeXNib290X3ZhbHVlKHZvaWQpCit7CisjaWYgMAorCWNvbnN0IHUzMiB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKwljb25zdCB1MzIgcGVyaXBoZXJhbF90eXBlID0gQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX1BFUklQSEVSQUw7CisKKwkvKgorCSAqIFRoaXMgcm91dGluZSBhbmQgY2FsbGVycyBvZiBpdCBhcmUgaW1wbGljaXRseSBleHBlY3RpbmcgdGhlCisJICogTUVNT1JZIGludGVyZmFjZSAoU1lTQk9PVFs1XSA9PSAwKSBub3QgdGhlIFBFUkhJUEhFUkFMCisJICogaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDEpIGJvb3Qgb3JkZXIsIHNvIGNoZWNrIHRoYXQgaXMKKwkgKiBhY3R1YWxseSB0aGUgY2FzZS4KKwkgKi8KKworCWlmIChDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfREVDT0RFKHZhbHVlKSA9PSBwZXJpcGhlcmFsX3R5cGUpIHsKKwkJaGFuZygpOworCX0KKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9PUkRFUl9ERUNPREUodmFsdWUpKTsKKyNlbHNlCisgICAgICAgIHJldHVybiBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAweDNmOworI2VuZGlmCit9CisKKy8qCisgKiAgaW50IGdldF9ib290X2RldmljZV9saXN0KGNvbnN0IHUzMioqIGRldmljZV9saXN0KQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIGEgY29uc3RhbnQgbGlzdCBpbmRpY2F0aW5nIHRoZSBwcmVmZXJyZWQKKyAqICAgIGRldmljZSBib290IGxpc3QuCisgKiAgICBJdCBnZXRzIGNhbGxlZCBmcm9tIHN0YXJ0X2FybWJvb3QgaW4gYm9hcmQuYworICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBwcmVmZXJyZWQgZmlyc3QgcHJvY2Vzc29yIG1lbW9yeSBib290IGludGVyZmFjZS4KKyAqCisgKi8KKworaW50CitnZXRfYm9vdF9kZXZpY2VzX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlc19saXN0KQoreworCXN0YXRpYyB1MzIgbGlzdFtNQVhfSjQ5X0JPT1RfREVWSUNFU107CisJY29uc3QgdTMyIG1lbV9vcmRlciA9IGdldF9zeXNib290X3ZhbHVlKCk7CisKKwkvLyBzZXQgZGVmYXVsdHMKKwlpbnQgbnVtYmVyX29mX2RldmljZXMgPSAwOworCSpkZXZpY2VzX2xpc3QgPSAmbGlzdFswXTsKKworCXN3aXRjaCAobWVtX29yZGVyKSB7CisJY2FzZSAxNToKKwkJbGlzdFswXSA9IEdQTUNfTkFORDsKKwkJbGlzdFsxXSA9IFVTQl9QRVJJUEhFUkFMOworCQlsaXN0WzJdID0gTU1DX05BTkQ7CisJCW51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0o0OV9CT09UX0RFVklDRVM7CisJCWJyZWFrOworCWNhc2UgNDc6CisJCWxpc3RbMF0gPSBNTUNfTkFORDsKKwkJbGlzdFsxXSA9IEdQTUNfTkFORDsKKwkJbGlzdFsyXSA9IFVTQl9QRVJJUEhFUkFMOworCQludW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9KNDlfQk9PVF9ERVZJQ0VTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIG51bWJlcl9vZl9kZXZpY2VzOworfQorCisvKgorICogIGludCBtaXNjX2luaXRfcigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBtaXNjZWxsYW5lb3VzLCBib2FyZC1zcGVjaWZpYworICogICAgaW5pdGlhbGl6YXRpb24gZm9sbG93aW5nIENQVSwgZWFybHkgYm9hcmQsIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIGxvYWRpbmcgdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlcgorICogICAgdG8gUkFNLgorICoKKyAqICAgIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgYm9hcmQtc3BlY2lmaWMgdG8gZG8uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBPSzsgb3RoZXJ3aXNlLCBub24temVybyBvbiBlcnJvci4KKyAqCisgKi8KK2ludAorbWlzY19pbml0X3Iodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAord2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisKKwlkbyB7CisJCXBlbmRpbmcgPSBfX3Jhd19yZWFkbCh3ZF9iYXNlICsgV1dQUyk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YXRjaGRvZ19pbml0CisgKiBEZXNjcmlwdGlvbjogU2h1dCBkb3duIHdhdGNoIGRvZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3dhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogIHZvaWQgZm9vYmFyKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUuLi4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3Blcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTU1DCisJLyogRW5hYmxlIE1NQzEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKyNlbmRpZgorCWRlbGF5KDEwMDApOworfQorCitzdGF0aWMgaW50CitncG1jX2NvbmZpZ18wKHZvaWQpCit7CisjaWYgZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApCisJLyoKKwkgKiBGaXJzdCwgZGlzYWJsZSB0aGUgaW50ZXJmYWNlIGFuZCB3YWl0LgorCSAqLworCV9fcmF3X3dyaXRlbChHUE1DX0NPTkZJRzdfQ1NWQUxJRF9ESVNBQkxFRCwgR1BNQ19DT05GSUc3XzApOworCisJZGVsYXkoMTAwMCk7CisKKwkvKgorCSAqIE5leHQsIHByb2dyYW0gdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKwkgKi8KKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMV8wLCBHUE1DX0NPTkZJRzFfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzJfMCwgR1BNQ19DT05GSUcyXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUczXzAsIEdQTUNfQ09ORklHM18wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNF8wLCBHUE1DX0NPTkZJRzRfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzVfMCwgR1BNQ19DT05GSUc1XzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc2XzAsIEdQTUNfQ09ORklHNl8wKTsKKworCS8qCisJICogRmluYWxseSwgZW5hYmxlIHRoZSBHUE1DIG1hcHBpbmcgYW5kIHNwaW4gZm9yIHRoZSBwYXJhbWV0ZXJzIHRvCisJICogYmVjb21lIGFjdGl2ZS4KKwkgKi8KKwlfX3Jhd193cml0ZWwoKENGR19HUE1DX0NPTkZJRzdfMCB8IEdQTUNfQ09ORklHN19DU1ZBTElEX0VOQUJMRUQpLAorCQkJCSBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgyMDAwKTsKKworCWlmIChuYW5kX2NoaXAoKSl7CisJCXJldHVybiAoMSk7CisJfQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX0dQTUNfQ09ORklHMV8wKSAqLworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICBpbnQgbmFuZF9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlcgorICogICAgKEdQTUMpIHN1Y2ggdGhhdCBvbi1ib2FyZCBOQU5EIGRldmljZXMgbWF5IGJlIGFjY2Vzc2VkIGZvcgorICogICAgc2Vjb25kLXN0YWdlIGJvb3QuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBOQU5EIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQ7IG90aGVyd2lzZSwgMS4KKyAqCisgKi8KK2ludAorbmFuZF9pbml0KHZvaWQpCit7CisJaW50IHN0YXR1cyA9IDE7CisKKwkvKgorCSAqIEVzdGFibGlzaCBHUE1DIGdsb2JhbCBzZXR0aW5ncy4KKwkgKi8KKworCV9fcmF3X3dyaXRlbChHUE1DX1NZU0NPTkZJR19JRExFTU9ERV9TTUFSVCwgR1BNQ19TWVNDT05GSUcpOworCisJX19yYXdfd3JpdGVsKEdQTUNfSVJRRU5BQkxFX0FMTF9ESVNBQkxFLCBHUE1DX0lSUUVOQUJMRSk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19USU1FT1VURU5BQkxFX09GRiwgR1BNQ19USU1FT1VUX0NPTlRST0wpOworCisJaWYgKGdwbWNfY29uZmlnXzAoKSkgeworCQlwdXRzKCJVbnN1cHBvcnRlZCBOQU5EIGRldmljZSBAIEdQTUMwIVxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzdGF0dXMgPSAwOworCisgZG9uZToKKwkvKiBEdW1wIEdQTUMgYW5kIFNEUkMgcmVnaXN0ZXJzIGlmIHNvIGNvbmZpZ3VyZWQuICovCisKKwlvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAoKTsKKwlvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAoKTsKKwlvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAoKTsKKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoKKyAqICB2b2lkIGJvYXJkX2hhbmcoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgYm9hcmQtc3BlY2lmaWMgYWN0aW9ucyB3aGVuIHRoZSBzeXN0ZW0KKyAqICAgIGhhbmdzIGJ5IGV4ZWN1dGluZyBoYW5nKCkuIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG87CisgKiAgICBob3dldmVyLCB3ZSBtaWdodCBsYXRlciBkcml2ZSB0aGUgcGllem8gb3IgYSBMRUQuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitib2FyZF9oYW5nICh2b2lkKQoreworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L211eC5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjN2RmMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L211eC5jCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgSS9PIHBhZCBtdWx0aXBsZXhlciBjb25maWd1cmF0aW9uLgorICoKKyAqICAgICAgVGhpcyBpcyBvcmlnaW5hbGx5IGluaGVyaXRlZCBhbmQgc3BsaXQgZnJvbSB0aGUgT01BUDMgRVZNCisgKiAgICAgIGJvYXJkIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoKKyAqICB2b2lkIHNldF9tdXhjb25mX3JlZ3MoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZXMgc2V0cyB0aGUgSS9PIHBhZCBtdWx0aXBsZXhlcnMgZm9yIFVBUlQsIEdQTUMsIFNEUkMsCisgKiAgICBHUElPLgorICoKKyAqIFRoZSBjb21tZW50ZWQgc3RyaW5nIGdpdmVzIHRoZSBmaW5hbCBtdXggY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwaW4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqLwordm9pZAorc2V0X211eGNvbmZfcmVncyh2b2lkKQoreworCS8qCisJICogVGhlIGJpdCBmaWVsZHMgZm9yIHRoZXNlIHNldHRpbmdzIGFyZSBhcyBmb2xsb3dzOgorCSAqCisJICogICBJe0VOLERJU30JIAktIElucHV0IEVuYWJsZS9EaXNhYmxlCisJICogICBQVFtEVV0JCSAJLSBQdWxsLWRvd24sIC11cAorCSAqICAgRElTLEVOCQkgIAktIFB1bGwtZG93biwgLXVwIGRpc2FibGVkL2VuYWJsZWQKKwkgKiAgIE1bMDEyMzQ1NjddCS0gQ29uZmlndXJhdGlvbiBtb2RlIDAtNworCSAqLworCisJLyoKKwkgKiBTRFJBTSBDb250cm9sbGVyIChTRFJDKQorCSAqCisJICogTW9zdCBvZiB0aGUgU0RSQyBzaWduYWxzIGFyZSB1c2VkIHRvIGRyaXZlIHRoZSBTYW1zdW5nCisJICogSzRYNTExNjNQSS1GQ0c2IDUxMiBNYiB4IDE2LWJpdCAoNjQgTWlCKSBERFIgU0RSQU0uIEJlY2F1c2Ugd2UKKwkgKiBpbnRlcmZhY2UgaW4gMTYtYml0IHJhdGhlciB0aGFuIDMyLWJpdCBtb2RlLCB3ZSBwbGFjZSB0aGUKKwkgKiB1bnVzZWQgcGlucyBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisJICovCisKKwlNVVhfVkFMKENQKFNEUkNfRDApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QwCisJTVVYX1ZBTChDUChTRFJDX0QxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMQorCU1VWF9WQUwoQ1AoU0RSQ19EMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDIKKwlNVVhfVkFMKENQKFNEUkNfRDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QzCisJTVVYX1ZBTChDUChTRFJDX0Q0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDUKKwlNVVhfVkFMKENQKFNEUkNfRDYpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q2CisJTVVYX1ZBTChDUChTRFJDX0Q3KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENworCU1VWF9WQUwoQ1AoU0RSQ19EOCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDgKKwlNVVhfVkFMKENQKFNEUkNfRDkpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q5CisJTVVYX1ZBTChDUChTRFJDX0QxMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEwCisJTVVYX1ZBTChDUChTRFJDX0QxMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDExCisJTVVYX1ZBTChDUChTRFJDX0QxMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEyCisJTVVYX1ZBTChDUChTRFJDX0QxMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEzCisJTVVYX1ZBTChDUChTRFJDX0QxNCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDE0CisJTVVYX1ZBTChDUChTRFJDX0QxNSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDE1CisKKwkvLyBCZWNhdXNlIHdlIGludGVyZmFjZSBTRFJBTSBpbiAxNi1iaXQgbW9kZSwgcGxhY2UKKwkvLyBTRFJDX0RBVEFbMzE6MTZdIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoU0RSQ19EMTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMzEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCU1VWF9WQUwoQ1AoU0RSQ19DTEspLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0NMSworCU1VWF9WQUwoQ1AoU0RSQ19EUVMwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EUVMwCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzEKKworCS8vIFBsYWNlIHVudXNlZCBEUSBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0RRUzMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8qCisJICogR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyIChHUE1DKQorCSAqCisJICovCisKKwlNVVhfVkFMKENQKEdQTUNfQTEpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0ExCisJTVVYX1ZBTChDUChHUE1DX0EyKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMgorCU1VWF9WQUwoQ1AoR1BNQ19BMyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTMKKwlNVVhfVkFMKENQKEdQTUNfQTQpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E0CisJTVVYX1ZBTChDUChHUE1DX0E1KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNQorCU1VWF9WQUwoQ1AoR1BNQ19BNiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTYKKwlNVVhfVkFMKENQKEdQTUNfQTcpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E3CisKKwkvLyBQbGFjZSB0aGUgdW51c2VkIEdQTUNfQTggcGluIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoR1BNQ19BOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEdQTUNfQTkgdG8gR1BJT180MiB1c2VkIGFzIGEgcHVzaC1wdWxsLCBhY3RpdmUgbG93IGlucHV0CisJLy8gZnJvbSB0aGUgVVNCIFBIWSBmb3IgVVNCIHN1c3BlbmQgbm90aWZpY2F0aW9uLgorCisJTVVYX1ZBTChDUChHUE1DX0E5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gR1BJT180MgorCU1VWF9WQUwoQ1AoR1BNQ19BMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCU1VWF9WQUwoQ1AoR1BNQ19EMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDAKKwlNVVhfVkFMKENQKEdQTUNfRDEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxCisJTVVYX1ZBTChDUChHUE1DX0QyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMgorCU1VWF9WQUwoQ1AoR1BNQ19EMyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDMKKwlNVVhfVkFMKENQKEdQTUNfRDQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q0CisJTVVYX1ZBTChDUChHUE1DX0Q1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENQorCU1VWF9WQUwoQ1AoR1BNQ19ENiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDYKKwlNVVhfVkFMKENQKEdQTUNfRDcpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q3CisJTVVYX1ZBTChDUChHUE1DX0Q4KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDkKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTAKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTEKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTIKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTMKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTQKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTUKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MxCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzIKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBHUE1DX05DUzYgdG8gR1BUMTFfUFdNX0VWVCB1c2VkIGFzIGEgcHVzaC1wdWxsIHB1bHNlIHdpZHRoCisJLy8gbW9kdWxhdGVkIChQV00pIHNpZ25hbCBmb3IgdGhlIHBpZXpvLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMykpOwkvLyBHUFQxMV9QV01fRVZUCisKKwkvLyBBc3NpZ24gR1BNQ19OQ1M3IHRvIEdQSU9fNTggdXNlZCBhcyBhIHB1c2gtcHVsbCBvdXRwdXQKKwkvLyBQSUVaT19ORU5BQkxFIHRvIHRoZSBUSSBTTjc0TFZDMkcyNDAgRHVhbCBCdWZmZXIvRHJpdmVyIFdpdGgKKwkvLyAzLVN0YXRlIE91dHB1dHMgaW5wdXRzLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzU4CisKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19DTEsKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLAkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbkFEVl9BTEUKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uT0UKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV0UKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLAkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkJFMF9DTEUKKworCS8vIEFzc2lnbiBHUE1DX05CRTEgdG8gR1BJT182MSB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dCB0byB0aGUKKwkvLyBaaWdCZWUgYWN0aXZlLWxvdyByZXNldC4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182MQorCisJTVVYX1ZBTChDUChHUE1DX05XUCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbldQCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfV0FJVDEKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbmF2YWlsYWJsZQorCisJLy8gQXNzaWduIEdQTUNfV0FJVDMgdG8gR1BJT182NSB1c2VkIGFzIGFuIGFjdGl2ZS1oaWdoLCBwdXNoLXB1bGwKKwkvLyBiYWNrcGxhdGUgZGV0ZWN0IGlucHV0LgorCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182NQorCisJLyoKKwkgKiBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKQorCSAqCisJICogQWxsIERTUyBzaWduYWxzIGFyZSB1c2VkIGluIHRoZWlyIG5vcm1hbCwgZGVmYXVsdCBtb2RlIChNb2RlIDApCisJICogdG8gZHJpdmUgdGhlIFNhbXN1bmcgTE1TMzUwREYwWzEzXSBMQ0QgZGlzcGxheSBwYW5lbC4KKwkgKi8KKworCU1VWF9WQUwoQ1AoRFNTX1BDTEspLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfUENMSworCU1VWF9WQUwoQ1AoRFNTX0hTWU5DKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0hTWU5DCisJTVVYX1ZBTChDUChEU1NfVlNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfVlNZTkMKKwlNVVhfVkFMKENQKERTU19BQ0JJQVMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfQUNCSUFTCisJTVVYX1ZBTChDUChEU1NfREFUQTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTAKKwlNVVhfVkFMKENQKERTU19EQVRBMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyCisJTVVYX1ZBTChDUChEU1NfREFUQTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTMKKwlNVVhfVkFMKENQKERTU19EQVRBNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE1CisJTVVYX1ZBTChDUChEU1NfREFUQTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTYKKwlNVVhfVkFMKENQKERTU19EQVRBNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNworCU1VWF9WQUwoQ1AoRFNTX0RBVEE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE4CisJTVVYX1ZBTChDUChEU1NfREFUQTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTkKKwlNVVhfVkFMKENQKERTU19EQVRBMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEwCisJTVVYX1ZBTChDUChEU1NfREFUQTExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTIKKwlNVVhfVkFMKENQKERTU19EQVRBMTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEzCisJTVVYX1ZBTChDUChEU1NfREFUQTE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTUKKwlNVVhfVkFMKENQKERTU19EQVRBMTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE2CisJTVVYX1ZBTChDUChEU1NfREFUQTE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNworCU1VWF9WQUwoQ1AoRFNTX0RBVEExOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTgKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE5CisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjEKKwlNVVhfVkFMKENQKERTU19EQVRBMjIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIyCisJTVVYX1ZBTChDUChEU1NfREFUQTIzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMworCisJTVVYX1ZBTChDUChDQU1fV0VOKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvKgorCSAqIFVuaXZlcnNhbCBBc3luY2hyb25vdXMgUmVjZWl2ZXIgLyBUcmFuc21pdHRlciAoVUFSVCkKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChVQVJUMV9UWCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1RYCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVQVJUMV9SVFMKKwlNVVhfVkFMKENQKFVBUlQxX0NUUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVBUlQxX0NUUworCU1VWF9WQUwoQ1AoVUFSVDFfUlgpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9SWAorCS8qCisJICogQ29udHJvbCBhbmQgRGVidWcKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChTWVNfMzJLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTXzMySworCU1VWF9WQUwoQ1AoU1lTX0JPT1QwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QwCisJTVVYX1ZBTChDUChTWVNfQk9PVDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDEKKwlNVVhfVkFMKENQKFNZU19CT09UMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMgorCU1VWF9WQUwoQ1AoU1lTX0JPT1QzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QzCisJTVVYX1ZBTChDUChTWVNfQk9PVDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDQKKwlNVVhfVkFMKENQKFNZU19CT09UNSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNQorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q2KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q2CisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMSksICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gU1lTX0NMS09VVDEKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX25UUlNUCisJTVVYX1ZBTChDUChKVEFHX1RDSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVENLCisJTVVYX1ZBTChDUChKVEFHX1RNUyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVE1TCisJTVVYX1ZBTChDUChKVEFHX1RESSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVERJCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX0VNVTAKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMQorCU1VWF9WQUwoQ1AoRVRLX0NMS19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0NUTF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QwX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QyX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QzX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q0X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q1X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q2X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q3X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q4X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q5X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMV9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMl9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxM19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEVUS19EMVs0NV0gYXMgTU0yX1JYUkNWIGFuZCBNTTJfVFhTRTAgVVNCIEZTL0xTIEhvc3QKKwkvLyAoTW9kZSA1KQorCisJTVVYX1ZBTChDUChFVEtfRDE0X0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gTU0yX1JYUkNWCisJTVVYX1ZBTChDUChFVEtfRDE1X0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gTU0yX1RYU0UwCit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQ5ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0dXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogICAgICBJdCBpbmhlcml0cyBlbnRpcmVseSBmcm9tIHRoZSBlcXVpdmFsZW50IFRJIE9NQVAzIEVWTQorICoJZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLgorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLworICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzFfMCkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHM18wKQorZmxhc2hfY2ZnM192YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzRfMCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUc1XzApCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisjZW5kaWYgLyogIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgKi8KKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRQorLndvcmQgMHgwNworLndvcmQgMHgwNQorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDFGNAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5Cisud29yZCAweDEyCisud29yZCAweDA0Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDE5Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEKKy53b3JkIDB4MzIKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE2OAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDBCCisud29yZCAweDA2Cisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YKKy53b3JkIDB4MzAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MEUKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MTAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNEMKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgyMQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgxMworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyoKKyAqIFRhYmxlcyBmb3IgMzZ4LzM3eCBkZXZpY2VzCisgKgorICogKFBvcHVsYXRlZCBmb3IgMTNNSHogb25seSkKKyAqLworbXB1XzM2eF9kcGxsX3BhcmFtOgorLy8gICAgTSAgICBOICAgRlMgTTIKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfMzAwTUhaKQorLndvcmQgMTUwLCAgNSwgMCwgMSAJLy8gMTIgICBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDEzICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAxOS4yIE1IegorLndvcmQgMTUwLCAxMiwgMCwgMSAJLy8gMjYgICBNSHoKKy53b3JkIDEyNSwgMTUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopCisud29yZCAzMDAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgNjAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDMsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAzMDAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAgNywgMCwgMSAJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJNUFUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopICovCisKK2l2YV8zNnhfZHBsbF9wYXJhbToKKy8vICAgICBNICAgTiAgIEZTIE0yCisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE2LjggTUh6CisKK2NvcmVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfMjAwTUhaKQorLndvcmQgMTAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMTAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCA3MSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8zMzJNSFopCisud29yZCAxNjYsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAzMzIsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCA0MTUsIDIzLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxNjYsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCA0MTUsIDQ3LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikKKy53b3JkIDIwMCwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDQwMCwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDM3NSwgMTcsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDIwMCwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDM3NSwgMzUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJDb3JlIERQTEwgc2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkISIKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikgKi8KKworLyoKKyAqIEZvciB0aGUgcGVyaXBoZXJhbCAoUEVSKSAoYWthIERQTEw0KSBjbG9jayBzZXR0aW5ncywgdGhlcmUgYXJlIG9ubHkKKyAqIGVmZmVjdGl2ZWx5IHR3byBjbG9jayBjaG9pY2VzLCA5NiBNSHogb3IgMTkyIE1Iei4gSG93ZXZlciwgdGhlIG9ubHkKKyAqIHRpbWUgMTkyIE1IeiBpcyBhcHQgdG8gYmUgdXNlZCBpbiBhbiBhcHBsaWNhdGlvbiBpcyBpZiBib3RoIFNHWCBhbmQKKyAqIFRWIG91dHB1dCBhcmUgdXNlZC4KKyAqCisgKiAgIEZvciBhbnkgZ2l2ZW4gc3lzdGVtIGNsb2NrLCB0aGUgZGl2aWRlcnMgYXJlIGNvbmZpZ3VyZWQgdGh1cyAocGVyCisgKiAgIFNlY3Rpb24gMy41LjMuMy4zLjIgIlR5cGUgQiBEUExMIChMb3ctSml0dGVyKSIgb2YgdGhlIE9NQVAzIFRSTSk6CisgKgorICogICAgIFBFUltjbGtvdXRdID0gKFNZU1tjbGtvdXRdICogTSkgLyAoTiArIDEpCisgKgorICogICAgICAgTTJbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMiAgICAgICAgICAgdXNlZCBieSBVQVJULCBNTUMsIEkyQywgZXRjLgorICogICAgICAgTTNbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMyAgICAgICAgICAgdXNlZCBieSBUViBvdXQuCisgKiAgICAgICBNNFtjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE00ICAgICAgICAgICB1c2VkIGJ5IERTUy4KKyAqICAgICAgIE01W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTUgICAgICAgICAgIHVzZWQgYnkgY2FtZXJhLgorICogICAgICAgTTZbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNiAgICAgICAgICAgdXNlZCBieSBlbXVsYXRpb24uCisgKgorICogIFNvLCBmb3IgYSAxOS4yIE1IeiBzeXN0ZW0gY2xvY2sgYW5kIHRoZSBzY2FsYXIgZW50cmllcyBiZWxvdzoKKyAqCisgKiAgICAgICBQRVJbY2xrb3V0XSA9ICgxOS4yICogNTQwKSAvICgxMSArIDEpID0gODY0CisgKgorICogICAgICAgTTJbY2xrb3V0XTogODY0IC8gIDkgPSAgOTYgICBNSHoKKyAqICAgICAgIE0zW2Nsa291dF06IDg2NCAvIDE2ID0gIDU0ICAgTUh6CisgKiAgICAgICBNNFtjbGtvdXRdOiA4NjQgLyAgNSA9IDE3Mi44IE1IegorICogICAgICAgTTVbY2xrb3V0XTogODY0IC8gIDQgPSAyMTYgICBNSHoKKyAqICAgICAgIE02W2Nsa291dF06IDg2NCAvICAzID0gMjg4ICAgTUh6CisgKi8KK3Blcl8zNnhfZHBsbF9wYXJhbToKKy8vICAgIFNZU19DTEsgICAgTSAgICAgIE4gICAgICBNMiAgICAgIE0zICAgICAgTTQgICAgIE01ICAgICAgTTYgICAgICBtMkRJVgorLndvcmQgMTIwMDAsICAgIDQzMiwgICAgNSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDEyICAgTUh6Cisud29yZCAxMzAwMCwgICAgODY0LCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTMgICBNSHoKKy53b3JkIDE5MjAwLCAgICA1NDAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxOS4yIE1IegorLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDI2ICAgTUh6Cisud29yZCAzODQwMCwgICAgMjcwLCAgIDExLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMzguNCBNSHoKKy53b3JkIDE2ODAwLCAgICAzNjAsICAgIDYsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxNi44IE1IegorCisuZ2xvYmwgZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbQorZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIG1wdV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0KK2dldF8zNnhfaXZhX2RwbGxfcGFyYW06CisJYWRyCXIwLCBpdmFfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbQorZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW06CisJYWRyCXIwLCBjb3JlXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbQorZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbToKKwlhZHIJcjAsIHBlcl8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3BsYXRmb3JtLmggYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOGMxMmQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvcgorICogICAgICBhY2Nlc3NpbmcgRGlnaXRhbCBQaGFzZWQgTG9jayBMb29wIChEUExMKSBwYXJhbWV0ZXJzIGFuZAorICogICAgICBzZXR0aW5ncy4KKyAqCisgKi8KKworI2lmbmRlZiBfTkVTVF9KNDlfUExBVEZPUk1fSF8KKyNkZWZpbmUgX05FU1RfSjQ5X1BMQVRGT1JNX0hfCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKgorICogVHlwZSBEZWZpbml0aW9ucworICovCisKKy8qIFVzZWQgdG8gaW5kZXggaW50byBEUExMIHBhcmFtZXRlciB0YWJsZXMgKi8KKworc3RydWN0IGRwbGxfcGFyYW0geworCXUzMiBtOworCXUzMiBuOworCXUzMiBmc2VsOworCXUzMiBtMjsKK307CisKK3N0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0geworCXUzMiBzeXNfY2xrOworCXUzMiBtOworCXUzMiBuOworCXUzMiBtMjsKKwl1MzIgbTM7CisJdTMyIG00OworCXUzMiBtNTsKKwl1MzIgbTY7CisJdTMyIG0yZGl2OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBsbF9wYXJhbSBkcGxsX3BhcmFtOworCisvKgorICogSW5saW5lIEZ1bmN0aW9ucworICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIihsb29wcykpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBQcm90b3R5cGVzCisgKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGZyb20gcGxhdGZvcm0uUy4KKyAqLworCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTkVTVF9KNDlfUExBVEZPUk1fSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3ByY20uYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3ByY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI1YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcHJjbS5jCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgY2xvY2sgc2V0LXVwIGZvciB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZAorICogICAgICBDbG9jayBNYW5hZ2VyIChQUkNNKQorICoKKyAqICAgICAgVGhpcyBpcyBvcmlnaW5hbGx5IGluaGVyaXRlZCBhbmQgc3BsaXQgZnJvbSB0aGUgT01BUDMgRVZNCisgKiAgICAgIGJvYXJkIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoKKyAqICB1MzIgZ2V0X29zY19jbGtfc3BlZWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBkZXRlcm1pbmVzIHRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZCBiYXNlZCBvbgorICogICAgYSBrbm93biAzMiBrSHogY2xvY2sgYW5kIGdlbmVyYWwgcHVycG9zZSB0aW1lci4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgcmVmZXJlbmNlIG9zY2lsbGF0b3IgY2xvY2sgc3BlZWQuCisgKgorICovCitzdGF0aWMgdTMyCitnZXRfb3NjX2Nsa19zcGVlZCh2b2lkKQoreworCXUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgY2RpdiwgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJNX0NMS1NSQ19DVFJMKTsKKworCWlmICh2YWwgJiBCSVQ3KQorCQljZGl2ID0gMjsKKwllbHNlIGlmICh2YWwgJiBCSVQ2KQorCQljZGl2ID0gMTsKKwllbHNlCisJCS8qCisJCSAqIFNob3VsZCBuZXZlciByZWFjaCBoZXJlIQorCQkgKiBUQkQ6IEFkZCBhIFdBUk4oKS9CVUcoKQorCQkgKiAgICAgIEZvciBub3csIGFzc3VtZSBkaXZpZGVyIGFzIDEuCisJCSAqLworCQljZGl2ID0gMTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwlpZiAoY2RpdiA9PSAyKQorCXsKKwkJY2RpZmYgKj0gMjsKKwl9CisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoKKyAqICB2b2lkIGdldF9zeXNfY2xraW5fc2VsKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBQUkNNIFBSTSBzeXN0ZW0gY2xvY2sKKyAqICAgIGZyZXF1ZW5jeSBzZWxlY3Rvciwgd2hpY2ggc2hvdWxkIGJlIHdyaXR0ZW4gdG8gUFJNX0NMS1NFTC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBoZXJ0eiAgLSBUaGUgc3BlZWQsIGluIE1IeiwgdGhhdCB0aGUgc3lzdGVtIGNsb2NrIGlzIGJlbGlldmVkCisgKiAgICAgICAgICAgICAgIHRvIGJlIHJ1bm5pbmcgYXQuCisgKiAgICBzeXNfY2xraW5fc2VsIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBpbmRleCB1c2VkIHRvIGFjY2VzcyB0aGUKKyAqICAgICAgICAgICAgICAgZGlnaXRhbCBQTEwgc2V0dGluZ3MuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IGZvciB0aGUgZGlnaXRhbCBQTEwgc2V0dGluZ3MKKyAqICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBzcGVjaWZpZWQgc3lzdGVtIGNsb2NrIHJhdGUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitnZXRfc3lzX2Nsa2luX3NlbCh1MzIgaGVydHosIHUzMiAqc3lzX2Nsa2luX3NlbCkKK3sKKwlzd2l0Y2ggKGhlcnR6KSB7CisKKwljYXNlIFMzOF80TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMzhfNF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMjZNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8yNl8wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxOV8yTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTZfOE06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE2XzhfTUhaOworCQlicmVhazsKKworCWNhc2UgUzEzTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTNfMF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTJNOgorCWRlZmF1bHQ6CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEyXzBfTUhaOworCQlicmVhazsKKworCX0KK30KKworLyoKKyAqIE9NQVAzNHgvMzV4IHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNFgpOwkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciA9IHB0ciArIGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CQkvKiBzZXQgTTUgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDUsIFBFUl9NNFgyKTsJCS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkJLyogc2V0IE0zICovCisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChQRVJJUEhfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzIwOjIzXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAyMCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpIDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoTVBVX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfTVBVWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIHB0ci0+ZnNlbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChJVkEyX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfSVZBMls0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqIE9NQVAzNjMwIHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNlgpOwkJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorZHBsbDRfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqcHRyOworCisJcHRyID0gKHN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKilnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBNNiAoRElWX0RQTEw0KTogQ01fQ0xLU0VMMV9FTVVbMjQ6MjldICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDYsIHB0ci0+bTYpOworCisJLyogTTUgKENMS1NFTF9DQU0pOiBDTV9DTEtTRUwxX0VNVVswOjVdICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA2LCBwdHItPm01KTsKKworCS8qIE00IChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNiwgcHRyLT5tNCk7CisKKwkvKiBNMyAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzg6MTNdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA2LCBwdHItPm0zKTsKKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MTldICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTIsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIE0yRElWIChDTEtTRUxfOTZNKTogQ01fQ0xLU0VMX0NPUkVbMTI6MTNdICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMTIsIDIsIHB0ci0+bTJkaXYpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCk6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK21wdV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fTVBVX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiAgdm9pZCBwcmNtX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyBjbG9ja3MgaW4gYSBib2FyZC1zcGVjaWZpYyBtYW5uZXIgZm9yCisgKiAgICB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZCBDbG9jayBNYW5hZ2VyIChQUkNNKSBhbmQgaXMKKyAqICAgIGNhbGxlZCBvbmx5IHdoZW4gYW4gU1JBTS1iYXNlZCBzdGFjayBpcyBhdmFpbGFibGUgKGkuZS4gbm8KKyAqICAgIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3ByY21faW5pdCh2b2lkKQoreworCXUzMiBzeXNfY2xrX3JhdGUgPSAwLCBzeXNfY2xraW5fc2VsLCBzeXNfY2xrX2RpdjsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJc3lzX2Nsa19yYXRlID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChzeXNfY2xrX3JhdGUsICZzeXNfY2xraW5fc2VsKTsKKworCS8qIFNldCB0aGUgUFJNX0NMS1NFTF9TWVNfQ0xLSU5fU0VMIHZhbHVlIGluIHRoZSBwcm9jZXNzb3IuICovCisKKwlzcjMyKFBSQ01fUFJNX0NDUl9DTEtTRUwsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfU1RBUlQsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfQklUUywKKwkJIHN5c19jbGtpbl9zZWwpOworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlIGJ5IHR3by4KKwkgKgorCSAqIE9uIE9NQVAzNjMwLCBERFIgZGF0YSBjb3JydXB0aW9uIGhhcyBiZWVuIG9ic2VydmVkIG9uIE9GRiBtb2RlCisJICogZXhpdCBpZiB0aGUgc3lzIGNsb2NrIHdhcyBsb3dlciB0aGFuIDI2TS4gQXMgYSB3b3JrIGFyb3VuZCwKKwkgKiBPTUFQMzYzMCBpcyBvcGVyYXRlZCBhdCAyNk0gc3lzIGNsb2NrIGFuZCB0aGlzIGludGVybmFsIGRpdmlzaW9uCisJICogaXMgbm90IHBlcmZvcm1lZC4KKwkgKi8KKworCWlmKChpc19jcHVfZmFtaWx5KCkgIT0gQ1BVX09NQVAzNlhYKSAmJgorCSAgIChzeXNfY2xraW5fc2VsID4gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaKSkgeworCQlzeXNfY2xrX2RpdiA9IFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8yOworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsIC8gMjsKKworCX0gZWxzZSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzE7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAxOworCisJfQorCisJc3IzMihQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9TVEFSVCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CSVRTLAorCQkgc3lzX2Nsa19kaXYpOworCisJaWYgKGlzX2NwdV9mYW1pbHkoKSA9PSBDUFVfT01BUDM2WFgpIHsKKwkJZHBsbDNfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKworCX0gZWxzZSB7CisJCXNpbF9pbmRleCA9IGdldF9jcHVfcmV2KCkgLSAxOworCisJCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCQkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCQkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUKKwkJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuCisJCSAqLworCisJCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJCWRwbGwzX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKworCQkvKiBMb2NrIE1QVSBEUExMIHRvIHNldCBmcmVxdWVuY3kgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisJfQorCisJLyogU2V0IHVwIEdQVGltZXJzIHRvIHN5c19jbGsgc291cmNlIG9ubHkgKi8KKyAJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCA4LCAweGZmKTsKKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAwLCAxLCAxKTsKKworCWRlbGF5KDUwMDApOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MDNhMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3gtbG9hZC5sZHMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgWC1Mb2FkZXIgbGlua2VyIHNjYXR0ZXIgZmlsZSBmb3IgdGhlIE5lc3QKKyAqICAgICAgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKi8KKworLyoKKyAqIE5vdmVtYmVyIDIwMDYgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgMzQzMHNkcCBkZXZpY2UKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvb21hcDMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MDIwYWYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gb21hcDE3MTBoMy5vIAorU09CSlMJOj0gcGxhdGZvcm0ubworCiskKExJQik6CSQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllM2M3NgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyMgRGF2aWQgTXVlbGxlciwgRUxTT0ZUIEFHLCA8ZC5tdWVsbGVyQGVsc29mdC5jaD4KKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMgS3NoaXRpaiBHdXB0YSA8S3NoaXRpakB0aS5jb20+CisjCisjIFRJIEgzIGJvYXJkIHdpdGggT01BUDE3MTAgKEFSTTkyNUVKUykgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgSW5ub3ZhdG9yIGhhcyAxIGJhbmsgb2YgMjU2IE1CIFNEUkFNCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDEwMDAnMDAwMCB0byAyMDAwJzAwMDAKKyMKKyMKKyMgTGludXgtS2VybmVsIGlzIGV4cGVjdGVkIHRvIGJlIGF0IDEwMDAnODAwMCwgZW50cnkgMTAwMCc4MDAwCisjIChtZW0gYmFzZSArIHJlc2VydmVkKQorIworIyB3ZSBsb2FkIG91cnNlbGYgdG8gMTEwOCcwMDAwCisjCisjCisKK1BMQVRGT1JNX0xERkxBR1MgKz0gLW5vLXdhcm4tbWlzbWF0Y2gKK1RFWFRfQkFTRSA9IDB4MTEwODAwMDAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvb21hcDE3MTBoMy5jIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9vbWFwMTcxMGgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1Y2ZlMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvb21hcDE3MTBoMy5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhdmlkIE11ZWxsZXIsIEVMU09GVCBBRywgPGQubXVlbGxlckBlbHNvZnQuY2g+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2lmIGRlZmluZWQoQ09ORklHX09NQVAxNzEwKQorI2luY2x1ZGUgPC4vY29uZmlncy9vbWFwMTUxMC5oPgorI2VuZGlmCisgIAorI2RlZmluZSBDT01QX01PREVfRU5BQkxFICgodW5zaWduZWQgaW50KTB4MDAwMEVBRUYpCisKK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworI2lmZGVmIENGR19QUklOVEYgCisKKyAgCS8qIHNldHVwIGZvciBVQVJUMSAqLworCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopICgodW5zaWduZWQgaW50KUZVTkNfTVVYX0NUUkxfMCkgJj0gfigweDAyMDAwMDAwKTsJLyogYml0IDI1ICovCisgIAkvKiBiaXQgMjkgZm9yIFVBUlQxICovCisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKCh1bnNpZ25lZCBpbnQpTU9EX0NPTkZfQ1RSTF8wKSAmPSB+KDB4MDAwMDIwMDApOworICAKKwkvKiBFbmFibGUgdGhlIHBvd2VyIGZvciBVQVJUMSAqLworI2RlZmluZSBVQVJUMV80OE1IWl9FTkFCTEUJKCh1bnNpZ25lZCBzaG9ydCkweDAyMDApCisjZGVmaW5lIFNXX0NMT0NLX1JFUVVFU1QJMHhGRkZFMDgzNAorCSooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopU1dfQ0xPQ0tfUkVRVUVTVCkgfD0gVUFSVDFfNDhNSFpfRU5BQkxFOworCisjZW5kaWYKKworIAkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGludClDT01QX01PREVfQ1RSTF8wKSA9IENPTVBfTU9ERV9FTkFCTEU7CisgIAlyZXR1cm4gMDsKK30KKworI2RlZmluZSBHUElPMV9ESVJFQ1RJT04JCTB4RkZGQkU0MzQKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF9GCQkweEZGRkUxMDk0CisjZGVmaW5lIFBVX1BEX1NFTF80CQkJMHhGRkZFMTBDNAorLyoKKyAqIE9uIEgzIGJvYXJkLCBOYW5kIFIvQiBpcyB0aWVkIHRvIEdQSU9fMTAKKyAqIFdlIHNldHVwIHRoaXMgR1BJTyBwaW4gCisgKi8KK2ludCBuYW5kX2luaXQgKHZvaWQpCit7CisgICAJCisgCS8qIEdQSU9fMTAgZm9yIGlucHV0LiBpdCBpcyBpbiBHUElPMSBtb2R1bGUgKi8KKyAJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKCh1bnNpZ25lZCBpbnQpR1BJTzFfRElSRUNUSU9OKSB8PSAweDA0MDA7IAorCQorCS8qIEdQSU8xMCBGdW5jX01VWF9DVFJMIHJlZyBiaXQgMjk6MjcsIENvbmZpZ3VyZSBWMiB0byBtb2RlMSBhcyBHUElPICovCisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKCh1bnNpZ25lZCBpbnQpRlVOQ19NVVhfQ1RSTF9GKSAmPSAweEM3RkZGRkZGOworCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopICgodW5zaWduZWQgaW50KUZVTkNfTVVYX0NUUkxfRikgfD0gMHgwODAwMDAwMDsKKwkgIAorCS8qIEdQSU8xMCBwdWxsdXAvZG93biByZWdpc3RlciwgRW5hYmxlIHB1bGx1cCBvbiBHUElPMTAgKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGludClQVV9QRF9TRUxfNCkgfD0gMHgwODsKKyAJIAorIAlpZiAobmFuZF9jaGlwKCkpeworCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBvcHRpb25hbGx5IGRvIHNvbWV0aGluZyBsaWtlIGJsaW5raW5nIExFRCAqLwordm9pZCBib2FyZF9oYW5nICh2b2lkKQore30KKyAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjY0ZTNlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsNDEwIEBACisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqIEtzaGl0aWogR3VwdGEgPEtzaGl0aWpAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQMTcxMCkKKyNpbmNsdWRlIDwuL2NvbmZpZ3Mvb21hcDE1MTAuaD4KKyNlbmRpZgorCisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisuZ2xvYmwgcGxhdGZvcm1zZXR1cAorcGxhdGZvcm1zZXR1cDoKKworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogU2V0IHVwIEFSTSBDTE0gcmVnaXN0ZXJzIChJRExFQ1QxKSAgICAgICAgICAgICAgICAgICAqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxkcglyMCwJUkVHX0FSTV9JRExFQ1QxCisJbGRyCXIxLAlWQUxfQVJNX0lETEVDVDEKKwlzdHIJcjEsCVtyMF0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqIFNldCB1cCBBUk0gQ0xNIHJlZ2lzdGVycyAoSURMRUNUMikgIAkJICAgICAgICAqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxkcglyMCwJUkVHX0FSTV9JRExFQ1QyCisJbGRyCXIxLAlWQUxfQVJNX0lETEVDVDIKKwlzdHIJcjEsCVtyMF0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqIFNldCB1cCBBUk0gQ0xNIHJlZ2lzdGVycyAoSURMRUNUMykJCSAgICAgICAgKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsZHIJcjAsCVJFR19BUk1fSURMRUNUMworCWxkcglyMSwJVkFMX0FSTV9JRExFQ1QzCisJc3RyCXIxLAlbcjBdCisKKworCW1vdglyMSwJIzB4MDUJCS8qIFBFUl9FTiBiaXQgKi8KKwlsZHIJcjAsCVJFR19BUk1fUlNUQ1QyCisJc3RyaAlyMSwJW3IwXQkJLyogQ0xLTTsgUGVyaXBoZXJhbCByZXNldC4gKi8KKworCS8qIFNldCBDTEtNIHRvIFN5bmMtU2NhbGFibGUJKi8KKwkvKiBJIHN1cHBvc2VkbHkgbmVlZCB0byBlbmFibGUgdGhlIGRzcCBjbG9jayBiZWZvcmUgc3dpdGNoaW5nICovCisJbGRyCXIxLAlWQUxfQVJNX1NZU1NUCisJbGRyCXIwLAlSRUdfQVJNX1NZU1NUCisJc3RyaAlyMSwJW3IwXQorCW1vdglyMCwJIzB4NDAwCisxOgorCXN1YnMJcjAsCXIwLAkjMHgxCS8qIHdhaXQgZm9yIGFueSBidWJibGVzIHRvIGZpbmlzaCAqLworCWJuZQkxYgorCWxkcglyMSwJVkFMX0FSTV9DS0NUTAorCWxkcglyMCwJUkVHX0FSTV9DS0NUTAorCXN0cmgJcjEsCVtyMF0KKworCS8qIGEgZmV3IG5vcHMgdG8gbGV0IHNldHRsZSAqLworCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCisJLyogc2V0dXAgRFBMTCAxICovCisJLyogUmFtcCB1cCB0aGUgY2xvY2sgdG8gOTZNaHogKi8KKwlsZHIJcjEsCVZBTF9EUExMMV9DVEwKKwlsZHIJcjAsCVJFR19EUExMMV9DVEwKKwlzdHJoCXIxLAlbcjBdCisJYW5kcwlyMSwJcjEsCSMweDEwCS8qIENoZWNrIGlmIFBMTCBpcyBlbmFibGVkLiAqLworCWJlcQlsb2NrX2VuZAkvKiBEbyBub3QgbG9vayBmb3IgbG9jayBpZiBCWVBBU1Mgc2VsZWN0ZWQgKi8KKzI6CisJbGRyaAlyMSwJW3IwXQorCWFuZHMJcjEsCXIxLAkjMHgwMQkvKglDaGVjayB0aGUgTE9DSyBiaXQuKi8KKwliZXEgMmIJCQkvKglsb29wIHVudGlsIGJpdCBnb2VzIGhpLiAqLworbG9ja19lbmQ6CisKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqIFR1cm4gb2ZmIHRoZSB3YXRjaGRvZyBkdXJpbmcgaW5pdC4uLgkJCSoKKyAJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxkcglyMCwJUkVHX1dBVENIRE9HCisJbGRyCXIxLAlXQVRDSERPR19WQUwxCisJc3RyCXIxLAlbcjBdCisJbGRyCXIxLAlXQVRDSERPR19WQUwyCisJc3RyCXIxLAlbcjBdCisJbGRyCXIwLAlSRUdfV1NQUkRPRworCWxkcglyMSwJV1NQUkRPR19WQUwxCisJc3RyCXIxLAlbcjBdCisJbGRyCXIwLAlSRUdfV1dQU0RPRworCit3YXRjaDFXYWl0OgorCWxkcglyMSwJW3IwXQorCXRzdAlyMSwJIzB4MTAKKwlibmUJd2F0Y2gxV2FpdAorCisJbGRyCXIwLAlSRUdfV1NQUkRPRworCWxkcglyMSwJV1NQUkRPR19WQUwyCisJc3RyCXIxLAlbcjBdCisJbGRyCXIwLAlSRUdfV1dQU0RPRword2F0Y2gyV2FpdDoKKwlsZHIJcjEsCVtyMF0KKwl0c3QJcjEsCSMweDEwCisJYm5lCXdhdGNoMldhaXQKKworCisJLyogU2V0IG1lbW9yeSB0aW1pbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5ldyBjbG9jayBzcGVlZCAqLworIAkgCisJLyoKKwkqIERlbGF5IGZvciBTRFJBTSBpbml0aWFsaXphdGlvbi4KKwkqLworCW1vdglyMywJIzB4MTgwMAkJLyogdmFsdWUgc2hvdWxkIGJlIGNoZWNrZWQgKi8KKzM6CisJc3VicwlyMywJcjMsCSMweDEJLyogRGVjcmVtZW50IGNvdW50ICovCisJYm5lIAkzYgorCisKKwkvKgorCSAqIFNldCBTRFJBTSBjb250cm9sIHZhbHVlcy4gRGlzYWJsZSByZWZyZXNoIGJlZm9yZSBNUlMgY29tbWFuZC4KKwkgKi8KKworCS8qIG1vYmlsZSBkZHIgb3BlcmF0aW9uICovCisJbGRyCXIwLAlSRUdfU0RSQU1fT1BFUkFUSU9OCisJbW92CXIyLAkjMDcKKwlzdHIJcjIsCVtyMF0KKworCS8qIGNvbmZpZyByZWdpc3RlciAqLworCWxkcglyMCwJUkVHX1NEUkFNX0NPTkZJRworCWxkcglyMSwJU0RSQU1fQ09ORklHX1ZBTAorCXN0cglyMSwJW3IwXQorCisJLyogbWFudWFsIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKwlsZHIJcjAsCVJFR19TRFJBTV9NQU5VQUxfQ01ECisJLyogaXNzdWUgc2V0IGNrZSBoaWdoICovCisJbW92CXIxLAkjQ01EX1NEUkFNX0NLRV9TRVRfSElHSAorCXN0cglyMSwJW3IwXQorCS8qIGlzc3VlIG5vcCAqLworCW1vdglyMSwJI0NNRF9TRFJBTV9OT1AKKwlzdHIJcjEsCVtyMF0KKworCW1vdglyMiwJIzB4MDEwMAord2FpdE1ERFIxOgorCXN1YnMJcjIsCXIyLAkgIzEKKwlibmUJd2FpdE1ERFIxCS8qIGRlbGF5IGxvb3AgKi8KKworCS8qIGlzc3VlIHByZWNoYXJnZSAqLworCW1vdglyMSwJI0NNRF9TRFJBTV9QUkVDSEFSR0UKKwlzdHIJcjEsCVtyMF0KKworCisJLyogaXNzdWUgYXV0b3JlZnJlc2ggeCAyICovCisJbW92CXIxLAkjQ01EX1NEUkFNX0FVVE9SRUZSRVNICisJc3RyCXIxLAlbcjBdCisJc3RyCXIxLAlbcjBdCisKKwkvKiBtcnMgcmVnaXN0ZXIgZGRyIG1vYmlsZSAqLworCWxkcglyMCwJUkVHX1NEUkFNX01SUworCW1vdglyMSwJIzB4MzMKKwlzdHIJcjEsCVtyMF0KKworCS8qIGVtcnMxIGxvdy1wb3dlciByZWdpc3RlciAqLworCWxkcglyMCwJUkVHX1NEUkFNX0VNUlMxCisJLyogc2VsZiByZWZyZXNoIG9uIGFsbCBiYW5rcyAqLworCW1vdglyMSwJIzAKKwlzdHIJcjEsCVtyMF0KKworCWxkcglyMCwJUkVHX0RMTF9VUkRfQ09OVFJPTAorCWxkcglyMSwJRExMX1VSRF9DT05UUk9MX1ZBTAorCXN0cglyMSwJW3IwXQorCisJbGRyCXIwLAlSRUdfRExMX0xSRF9DT05UUk9MCisJbGRyCXIxLAlETExfTFJEX0NPTlRST0xfVkFMCisJc3RyCXIxLAlbcjBdCisKKwlsZHIJcjAsCVJFR19ETExfV1JUX0NPTlRST0wKKwlsZHIJcjEsCURMTF9XUlRfQ09OVFJPTF9WQUwKKwlzdHIJcjEsCVtyMF0KKworCS8qIGRlbGF5IGxvb3AgKi8KKwltb3YJcjIsCSMweDAxMDAKK3dhaXRNRERSMjoKKwlzdWJzCXIyLAlyMiwJIzEKKwlibmUJd2FpdE1ERFIyCisKKwkvKgorCSAqIERlbGF5IGZvciBTRFJBTSBpbml0aWFsaXphdGlvbi4KKwkgKi8KKwltb3YJcjMsCSMweDE4MDAKKzQ6CisJc3VicwlyMywJcjMsCSMxCS8qIERlY3JlbWVudCBjb3VudC4gKi8KKwlibmUJNGIKKwliCWNvbW1vbl90YworCitza2lwX3NkcmFtOgorCisJbGRyCXIwLAlSRUdfU0RSQU1fQ09ORklHCisJbGRyCXIxLAlTRFJBTV9DT05GSUdfVkFMCisJc3RyCXIxLAlbcjBdCisKKwkvKiBFbmFibGUgRU1JRkYgVEMgRG91YmxlciBpbiBPTUFQMTcxMCAqLworCWxkcglyMCwJUkVHX0VNSUZGX0RPVUJMRVIKKwltb3YJcjAsCSMweDE7CisKK2NvbW1vbl90YzoKKwkvKiBzbG93IGludGVyZmFjZSAqLworCWxkcglyMSwJVkFMX1RDX0VNSUZTX0NPTkZJRworCWxkcglyMCwJUkVHX1RDX0VNSUZTX0NPTkZJRworCXN0cglyMSwJW3IwXQorCisjaWZkZWYgQ0ZHX0JPT1RfQ1MwCisJLyogQ2hpcCBTZWxlY3QgMyBmb3IgTkFORCovCisJbGRyCXIxLAlWQUxfVENfRU1JRlNfQ1MzX0NPTkZJRworCWxkcglyMCwJUkVHX1RDX0VNSUZTX0NTM19DT05GSUcKKwlzdHIJcjEsCVtyMF0gCisjZWxzZQorCS8qIENoaXAgU2VsZWN0IDIgZm9yIE5BTkQqLworCWxkcglyMSwJVkFMX1RDX0VNSUZTX0NTMl9DT05GSUcKKwlsZHIJcjAsCVJFR19UQ19FTUlGU19DUzJfQ09ORklHCisJc3RyCXIxLAlbcjBdIAorI2VuZGlmCisgIAorICAgICAgICAvKiBTdGFydCBNUFUgVGltZXIgMSAqLworICAgICAgICBsZHIgICAgIHIwLCAgICAgUkVHX01QVV9MT0FEX1RJTUVSCisgICAgICAgIGxkciAgICAgcjEsICAgICBWQUxfTVBVX0xPQURfVElNRVIKKyAgICAgICAgc3RyICAgICByMSwgICAgIFtyMF0KKworICAgICAgICBsZHIgICAgIHIwLCAgICAgUkVHX01QVV9DTlRMX1RJTUVSCisgICAgICAgIGxkciAgICAgcjEsICAgICBWQUxfTVBVX0NOVExfVElNRVIKKyAgICAgICAgc3RyICAgICByMSwgICAgIFtyMF0KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworCitSRUdfVENfRU1JRlNfQ09ORklHOgkJLyogMzIgYml0cyAqLworCS53b3JkIDB4ZmZmZWNjMGMKKyNpZmRlZiBDRkdfQk9PVF9DUzAKK1JFR19UQ19FTUlGU19DUzNfQ09ORklHOgkvKiAzMiBiaXRzICovCisJLndvcmQgMHhmZmZlY2MxYworI2Vsc2UKK1JFR19UQ19FTUlGU19DUzJfQ09ORklHOgkvKiAzMiBiaXRzICovCisJLndvcmQgMHhmZmZlY2MxOAorI2VuZGlmCisgCisvKiBNUFUgY2xvY2svcmVzZXQvcG93ZXIgbW9kZSBjb250cm9sIHJlZ2lzdGVycyAqLworUkVHX0FSTV9DS0NUTDoJCQkvKiAxNiBiaXRzICovCisJLndvcmQgMHhmZmZlY2UwMAorCitSRUdfQVJNX0lETEVDVDM6CQkvKiAxNiBiaXRzICovCisJLndvcmQgMHhmZmZlY2UyNAorUkVHX0FSTV9JRExFQ1QyOgkJLyogMTYgYml0cyAqLworCS53b3JkIDB4ZmZmZWNlMDgKK1JFR19BUk1fSURMRUNUMToJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZTA0CisKK1JFR19BUk1fUlNUQ1QyOgkJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZTE0CitSRUdfQVJNX1NZU1NUOgkJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZTE4CisvKiBEUExMIGNvbnRyb2wgcmVnaXN0ZXJzICovCitSRUdfRFBMTDFfQ1RMOgkJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZjAwCisKKy8qIFdhdGNoIERvZyByZWdpc3RlciAqLworLyogc2VjdXJlIHdhdGNoZG9nIHN0b3AgKi8KK1JFR19XU1BSRE9HOgorCS53b3JkIDB4ZmZmZWIwNDgKKy8qIHdhdGNoZG9nIHdyaXRlIHBlbmRpbmcgKi8KK1JFR19XV1BTRE9HOgorCS53b3JkIDB4ZmZmZWIwMzQKKworV1NQUkRPR19WQUwxOgorCS53b3JkIDB4MDAwMGFhYWEKK1dTUFJET0dfVkFMMjoKKwkud29yZCAweDAwMDA1NTU1CisKKy8qIFNEUkFNIGNvbmZpZyBpczogYXV0byByZWZyZXNoIGVuYWJsZWQsIDE2IGJpdCA0IGJhbmssCisgY291bnRlciBAODE5MiByb3dzLCAxMCBucywgOCBidXJzdCAqLworUkVHX1NEUkFNX0NPTkZJRzoKKwkud29yZCAweGZmZmVjYzIwCisKKy8qIE9wZXJhdGlvbiByZWdpc3RlciAqLworUkVHX1NEUkFNX09QRVJBVElPTjoKKwkud29yZCAweGZmZmVjYzgwCisKK1JFR19FTUlGRl9ET1VCTEVSOgorCS53b3JkIDB4ZmZmZWNjNjAKKworLyogTWFudWFsIGNvbW1hbmQgcmVnaXN0ZXIgKi8KK1JFR19TRFJBTV9NQU5VQUxfQ01EOgorCS53b3JkIDB4ZmZmZWNjODQKKworLyogU0RSQU0gTVJTIChOZXcpIGNvbmZpZyBpczogQ0FTIGxhdGVuY3kgaXMgMiwgYnVyc3QgbGVuZ3RoIDggKi8KK1JFR19TRFJBTV9NUlM6CisJLndvcmQgMHhmZmZlY2M3MAorCisvKiBTRFJBTSBNUlMgKE5ldykgY29uZmlnIGlzOiBDQVMgbGF0ZW5jeSBpcyAyLCBidXJzdCBsZW5ndGggOCAqLworUkVHX1NEUkFNX0VNUlMxOgorCS53b3JkIDB4ZmZmZWNjNzgKKworLyogV1JUIERMTCByZWdpc3RlciAqLworUkVHX0RMTF9XUlRfQ09OVFJPTDoKKwkud29yZCAweGZmZmVjYzY0CitETExfV1JUX0NPTlRST0xfVkFMOgorCS53b3JkIDB4MDM1MDAwMDIKKworLyogVVJEIERMTCByZWdpc3RlciAqLworUkVHX0RMTF9VUkRfQ09OVFJPTDoKKwkud29yZCAweGZmZmVjY2MwCitETExfVVJEX0NPTlRST0xfVkFMOgorCS53b3JkIDB4MDAwMDAwMDYKKworLyogTFJEIERMTCByZWdpc3RlciAqLworUkVHX0RMTF9MUkRfQ09OVFJPTDoKKwkud29yZCAweGZmZmVjY2NjCisKK1JFR19XQVRDSERPRzoKKwkud29yZCAweGZmZmVjODA4CisKK1JFR19NUFVfTE9BRF9USU1FUjoKKyAgICAgICAgLndvcmQgMHhmZmZlYzYwMAorUkVHX01QVV9DTlRMX1RJTUVSOgorICAgICAgICAud29yZCAweGZmZmVjNTAwCisKKy8qIDk2IE1IeiBTYW1zdW5nIE1vYmlsZSBERFIgKi8KK1NEUkFNX0NPTkZJR19WQUw6CisJLndvcmQgMHgwYzAyOGFmNAorCitETExfTFJEX0NPTlRST0xfVkFMOgorCS53b3JkIDB4MDAwMDAwMDYKKworVkFMX0FSTV9DS0NUTDoKKwkud29yZCAweDM1MGUKK1ZBTF9BUk1fU1lTU1Q6CisJLndvcmQgMHgxMDAxCisKK1ZBTF9EUExMMV9DVEw6CisJLndvcmQgMHgyODEwCisKKyNpZmRlZiBDRkdfQk9PVF9DUzAKK1ZBTF9UQ19FTUlGU19DT05GSUc6CisJLndvcmQgMHgwMDAwMDAxMCAKK1ZBTF9UQ19FTUlGU19DUzNfQ09ORklHOgkKKyAJLndvcmQgMHhmZjgwZmZmMyAgIAorI2Vsc2UKK1ZBTF9UQ19FTUlGU19DT05GSUc6CisJLndvcmQgMHgwMDAwMDAxMiAgIC8qc3dhcCBDUzAvQ1MzIGFkZHJlc3NpbmcgKi8KK1ZBTF9UQ19FTUlGU19DUzJfQ09ORklHOgkKKyAJLndvcmQgMHhmZjgwZmZmMyAgIAorI2VuZGlmCisKKyAKK1ZBTF9UQ19FTUlGRl9TRFJBTV9DT05GSUc6CisJLndvcmQgMHgwMTAyOTBmYworVkFMX1RDX0VNSUZGX01SUzoKKwkud29yZCAweDAwMDAwMDI3CisKK1ZBTF9BUk1fSURMRUNUMToKKwkud29yZCAweDAwMDAxNGM2CisKK1ZBTF9BUk1fSURMRUNUMjoKKwkud29yZCAweDAwMDAwOWZmCitWQUxfQVJNX0lETEVDVDM6CisJLndvcmQgMHgwMDAwMDAzZgorCitXQVRDSERPR19WQUwxOgorCS53b3JkIDB4MDAwMDAwZjUKK1dBVENIRE9HX1ZBTDI6CisJLndvcmQgMHgwMDAwMDBhMAorCitWQUxfTVBVX0xPQURfVElNRVI6CisgICAgICAgIC53b3JkIDB4ZmZmZmZmZmYKK1ZBTF9NUFVfQ05UTF9USU1FUjoKKyAgICAgICAgLndvcmQgMHhmZmZmZmZhMQorCisvKiBjb21tYW5kIHZhbHVlcyAqLworLmVxdSBDTURfU0RSQU1fTk9QLAkJMHgwMDAwMDAwMAorLmVxdSBDTURfU0RSQU1fUFJFQ0hBUkdFLAkweDAwMDAwMDAxCisuZXF1IENNRF9TRFJBTV9BVVRPUkVGUkVTSCwJMHgwMDAwMDAwMgorLmVxdSBDTURfU0RSQU1fQ0tFX1NFVF9ISUdILAkweDAwMDAwMDA3CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4NGVlYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMveC1sb2FkLmxkcwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKwkuID0gQUxJR04oNCk7CisJLnRleHQJOgorCXsKKwkgIGNwdS9hcm05MjZlanMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisgCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTQ3NDI4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IG9tYXAyNDIwaDQubyAKK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzcwZjMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L2NvbmZpZy5tawpAQCAtMCwwICsxLDI2IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNAorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIFRJIEg0IGJvYXJkIHdpdGggT01BUDI0MjAgKEFSTTExMzYpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzCisjCisjIEg0IGhhcyAxIGJhbmsgb2YgMzJNQiBvciA2NE1CIG1ERFItU0RSQU0gb24gQ1MwCisjIEg0IGhhcyAxIGJhbmsgb2YgMzJNQiBvciAwME1CIG1ERFItU0RSQU0gb24gQ1MxCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisjIEEwMDAvMDAwMCAoYmFuazEpIEVTMiB3aWxsIGJlIGNvbmZpZ3VyYWJsZQorIyBMaW51eC1LZXJuZWwgaXMgZXhwZWN0ZWQgdG8gYmUgYXQgODAwMCc4MDAwLCBlbnRyeSA4MDAwJzgwMDAKKyMgKG1lbSBiYXNlICsgcmVzZXJ2ZWQpCisKKyMgRm9yIHVzZSB3aXRoIGV4dGVybmFsIG9yIGludGVybmFsIGJvb3RzLgorIyBDT05GSUdfUEFSVElBTF9TUkFNIG11c3QgYmUgZGVmaW5lZCB0byB1c2UgdGhpcy4KK1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBVc2VkIHdpdGggZnVsbCBTUkFNIGJvb3QuCisjIFRoaXMgaXMgZWl0aGVyIHdpdGggYSBHUCBzeXN0ZW0gb3IgYSBzaWduZWQgYm9vdCBpbWFnZS4KKyMgZWFzaWVzdCwgYW5kIHNhZmVzdCB3YXkgdG8gZ28gaWYgeW91IGNhbi4KKyMgQ29tbWVudCBvdXQgLy9DT05GSUdfUEFSVElBTF9TUkFNIGZvciB0aGlzIG9uZS4KKyMKKyNURVhUX0JBU0UgPSAweDQwMjgwMDAwCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9vbWFwMjQyMGg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4MWI0OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jCkBAIC0wLDAgKzEsNTk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRleGFzIEluc3RydW1lbnRzLgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAyNDIwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworc3RhdGljIHZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSk7CitzdGF0aWMgdm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpOworc3RhdGljIHZvaWQgcGVyaXBoZXJhbF9lbmFibGUodm9pZCk7CitzdGF0aWMgdm9pZCBtdXhTZXR1cFVBUlQxKHZvaWQpOworc3RhdGljIHUzMiAgZ2V0X2NwdV9yZXYodm9pZCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkgKHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iCisJCQkJCSAgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIgKGxvb3BzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogYm9hcmRfaW5pdAorICogRGVzY3JpcHRpb246IEVhcmx5IGhhcmR3YXJlIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENGR19TRFJBTV9ERFIKK3ZvaWQKK2NvbmZpZ19zZHJhbV9kZHIodTMyIHJldikKK3sKKwkvKiBiYWxsIEQxMSwgbW9kZSAwICovCisJX19yYXdfd3JpdGViKDB4MDgsIDB4NDgwMDAwMzIpOworCisJLyogU0RSQ19DUzAgQ29uZmlndXJhdGlvbiAqLworCWlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpIHsKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjJfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCQlfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisJfSBlbHNlIHsKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisJfQorCisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19SRlJfQ1RSTF9FUzEsIFNEUkNfUkZSX0NUUkwpOworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfQUNUSU1fQ1RSTEFfMF9FUzEsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19BQ1RJTV9DVFJMQl8wX0VTMSwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCS8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKworCisJLyogCisJICogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlcgorCSAqIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5CisJICogU2VyaWFsIG1vZGUKKwkgKiBDQVMgbGF0ZW5jeSA9IDMgCisJICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMzIsIFNEUkNfTVJfMCk7CisKKyAJLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkvKiBEZWxheSBpcyA5MCBkZWdyZWVzICovCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAyLCBTRFJDX0RMTEFfQ1RSTCk7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDIsIFNEUkNfRExMQl9DVFJMKTsKKwl9IGVsc2UgeworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDAwMDA4LCBTRFJDX0RMTEFfQ1RSTCk7CS8vIEVTMi54CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDgsIFNEUkNfRExMQl9DVFJMKTsJLy8gRVMyLngKKwl9CisKK30KKyNlbmRpZiAvLyBDRkdfU0RSQU1fRERSCisKKworI2lmZGVmIENGR19TRFJBTV9DT01CTyAKK3ZvaWQKK2NvbmZpZ19zZHJhbV9jb21ibyh1MzIgcmV2KQoreworCisJdTMyIGRsbGN0cmw9MDsKKworICAgICAgICAvKiBiYWxsIEMxMiwgbW9kZSAwICovCisgICAgICAgIF9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMGExKTsKKyAgICAgICAgLyogYmFsbCBEMTEsIG1vZGUgMCAqLworICAgICAgICBfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDAzMik7CisgICAgICAgIC8qIGJhbGwgQjEzLCBtb2RlIDAgLSBmb3IgQ0tFMSAobm90IG5lZWRlZCBya3cgZm9yIGNvbWJvKSAqLworICAgICAgICBfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMyk7CisKKyAgICAgICAgLypjb25maWd1cmUgc2RyYyAzMiBiaXQgZm9yIENPTUJPIGRkciBzZHJhbS4gSXNzdWUgc29mdCByZXNldCAqLworICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwMDAxMiwgU0RSQ19TWVNDT05GSUcpOworICAgICAgICBkZWxheSgyMDAwMDApOworICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwMDAxMCwgU0RSQ19TWVNDT05GSUcpOworCisJLyogU0RSQ1RyaVN0YXRlOiBubyBUcmlzICovCisgICAgICAgIC8qIENTME11eENmZzogMDAwICgzMi1iaXQgU0RSQU0gb24gRDMxLi4wKSAqLworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCisgICAgICAgIC8qIENTMCBTRFJDIE1lbW9yeSBDb25maWd1cmF0aW9uLCAqLworICAgICAgICAvKiBERFItU0RSQU0sIEV4dGVybmFsIFNEUkFNIGlzIHgzMmJpdCwgKi8KKyAgICAgICAgLyogQ29uZmlndXJlIHRvIE1VWDk6IDF4OE1ieDMyICAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9DT01CT19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMSwgU0RSQ19SRlJfQ1RSTCk7CisKKyAgICAgICAgLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKworICAgICAgICAvKiBDUzAgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisgICAgICAgIC8qIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5ICovCisgICAgICAgIC8qIFNlcmlhbCBtb2RlICovCisgICAgICAgIC8qIENBUyBsYXRlbmN5ID0gMyAgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjJfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8wKTsKKworICAgICAgICAvKiBDUzEgU0RSQyBNZW1vcnkgQ29uZmlndXJhdGlvbiwgKi8KKyAgICAgICAgLyogRERSLVNEUkFNLCBFeHRlcm5hbCBTRFJBTSBpcyB4MzJiaXQsICovCisgICAgICAgIC8qIENvbmZpZ3VyZSB0byBNVVg5OiAxeDhNYngzMiAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9DT01CT19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzEpOworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxBXzBfMTAwTUh6LCBTRFJDX0FDVElNX0NUUkxBXzEpOworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMSk7CisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19SRlJfQ1RSTF9FUzEsIDB4NjgwMDkwZDQpOworCisgICAgICAgIC8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8xKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzEpOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8xKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMSk7CisKKyAgICAgICAgLyogQ1MxIFNEUkMgTW9kZSBSZWdpc3RlciAqLworCS8qIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5ICovCisgICAgICAgIC8qIFNlcmlhbCBtb2RlICovCisgICAgICAgIC8qIENBUyBsYXRlbmN5ID0gMyAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX01SXzBfRERSLCBTRFJDX01SXzEpOworCisgICAgICAgIC8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisgICAgICAgIC8qIERlbGF5IGlzIDkwIGRlZ3JlZXMgKi8KKwlpZiAocmV2ID09IENQVV8yNDJYX0VTMSkKKwkJZGxsY3RybCA9IChCSVQwfEJJVDMpOworCWVsc2UKKwkJZGxsY3RybCA9IEJJVDA7CQkKKworICAgICAgICBpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKSB7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDYsIFNEUkNfRExMQV9DVFJMKTsKKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExBX0NUUkwpOworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwNiwgU0RSQ19ETExCX0NUUkwpOyAvKiBsb2FkIGN0ciB2YWx1ZSAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEJfQ1RSTCk7IC8qIGxvY2sgYW5kIGdvICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEFfQ1RSTCk7ICAgLy8gRVMyLngKKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwgJiB+KExPQURETEx8ZGxsY3RybCksIFNEUkNfRExMQV9DVFJMKTsgLy8gRVMyLngKKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQl9DVFJMKTsgICAvLyBFUzIueCA/CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICYgfihMT0FERExMfGRsbGN0cmwpLCBTRFJDX0RMTEJfQ1RSTCk7IC8vIEVTMi54CisgICAgICAgIH0KK30KKworI2VuZGlmIC8vIENGR19TRFJBTV9DT01CTworCisjaWZkZWYgQ0ZHX1NEUkFNX1NEUiAKK3ZvaWQKK2NvbmZpZ19zZHJhbV9zZHIodTMyIHJldikKK3sKKwl1MzIgZGxsY3RybD0wOworCisJLyogYmFsbCBEMTEsIG1vZGUgMCAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMyKTsKKworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDEyLCBTRFJDX1NZU0NPTkZJRyk7CisJZGVsYXkoMjAwMDAwKTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxMCwgU0RSQ19TWVNDT05GSUcpOworCisJLyogQ2hpcC1sZXZlbCBzaGFyZWQgaW50ZXJmYWNlIG1hbmFnZW1lbnQgKi8KKwkvKiBTRFJDVHJpU3RhdGU6IG5vIFRyaXMgKi8KKwkvKiBDUzBNdXhDZmc6IDAwMCAoMzItYml0IFNEUkFNIG9uIEQzMS4uMCkgKi8KKwkvKiBDUzFNdXhDZmc6IDAwMCAoMzItYml0IFNEUkFNIG9uIEQzMS4uMCkgKi8KKwlpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKQorCQlfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisJZWxzZQorCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwkvKiBDUzAgU0RSQyBNZW1vcnkgQ29uZmlndXJhdGlvbiwgKi8KKwkvKiBERFItU0RSQU0sIEV4dGVybmFsIFNEUkFNIGlzIHgzMmJpdCwgKi8KKwkvKiBDb25maWd1cmUgdG8gTVVYMTQ6IDMyTWJ4MzIgKi8KKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX01EQ0ZHXzBfU0RSLCBTRFJDX01DRkdfMCk7IC8qIGRpZmYgZnJvbSBjb21ibyBjYXNlICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMSwgU0RSQ19SRlJfQ1RSTCk7CisKKwkvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisgCisJLyogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlciAqLworCS8qIEJ1cnN0IGxlbmd0aCA9IDIgLSBTRFIgbWVtb3J5ICovCisJLyogU2VyaWFsIG1vZGUgKi8KKwkvKiBDQVMgbGF0ZW5jeSA9IDMgICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19NUl8wX1NEUiwgU0RSQ19NUl8wKTsgIC8qIGRpZmYgZnJvbSBjb21ibyBjYXNlICovCisKKwkvKiBTRFJDIERMTEEgY29udHJvbCByZWdpc3RlciAqLworCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkvKiBEZWxheSBpcyA5MCBkZWdyZWVzICovCisKKwlpZiAocmV2ID09IENQVV8yNDJYX0VTMSkKKyAgICAgICAgICAgICAgICBkbGxjdHJsID0gKEJJVDB8QklUMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkbGxjdHJsID0gQklUMDsKKworCWlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpIHsKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDYsIFNEUkNfRExMQV9DVFJMKTsKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQV9DVFJMKTsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwNiwgU0RSQ19ETExCX0NUUkwpOyAvKiBsb2FkIGN0ciB2YWx1ZSAqLworCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExCX0NUUkwpOyAvKiBsb2NrIGFuZCBnbyAqLworCX0KKwllbHNlIHsKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEFfQ1RSTCk7CS8vIEVTMi54CisJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAmIH4oTE9BRERMTHxkbGxjdHJsKSwgU0RSQ19ETExBX0NUUkwpOwkvLyBFUzIueAorCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExCX0NUUkwpOwkvLyBFUzIueAorCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwgJiB+KExPQURETEx8ZGxsY3RybCksIFNEUkNfRExMQl9DVFJMKTsJLy8gRVMyLngKKwl9CisgICAKK30KKyNlbmRpZiAvLyBDRkdfU0RSQU1fU0RSCisKKyNpZmRlZiBDRkdfU0RSQU1fU1RBQ0tFRCAKK3ZvaWQKK2NvbmZpZ19zZHJhbV9zdGFja2VkKHUzMiByZXYpCit7CisKKwkvKiBQaW4gTXV4aW5nIGZvciBTRFJDICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTEpOwkvKiBtdXggbW9kZSAwIChDUzEpICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTMpOwkvKiBtdXggbW9kZSAwIChDS0UxKSAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMyKTsJLyogY29ubmVjdCBzZHJjX2ExMiAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMxKTsJLyogY29ubmVjdCBzZHJjX2ExMyAqLworCisJLyogY29uZmlndXJlIHNkcmMgMzIgYml0IGZvciBDT01CTyBkZHIgc2RyYW0gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxMCwgU0RSQ19TWVNDT05GSUcpOwkvKiBubyBpZGxlIGFjayBhbmQgUkVTRVQgZW5hYmxlICovCisJZGVsYXkoMjAwMDAwKTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxMCwgU0RSQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlIG1vZGUgKi8KKworCS8qIFNEUkNfU0hBUklORyAqLworCS8qIFUtYm9vdCBpcyB3cml0aW5nIDB4MDAwMDAxMDAgdGhvdWdoIChINF8yNDIwX1NEUkNfU0hBUklORyApICovCisJLy9fX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwlfX3Jhd193cml0ZWwoMHgwMDAwNDkwMCwgU0RSQ19TSEFSSU5HKTsKKworCS8qIFNEUkNfQ1MwIENvbmZpZ3VyYXRpb24gKi8KKwkvKiBOb25lIGZvciBFUzIuMSAqLworCisJLyogIFNEUkNfQ1MxIENvbmZpZ3VyYXRpb24gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgU0RSQ19DU19DRkcpOwkvKiBSZW1hcCBDUzEgdG8gMHg4MDAwMDAwMCAqLworCisJLyogRGlzYWJsZSBwb3dlciBkb3duIG9mIENLRSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDg1LCBTRFJDX1BPV0VSKTsKKworCV9fcmF3X3dyaXRlbCgweDAxQTAyMDE5LCBTRFJDX01DRkdfMSk7CS8qIFNEUkNfTUNGRzEgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAzREQwMywgU0RSQ19SRlJfQ1RSTDEpOwkvKiBTRFJDX1JGUl9DVFJMMSAqLworCV9fcmF3X3dyaXRlbCgweDkyRERDNDg1LCBTRFJDX0FDVElNX0NUUkxBXzEpOwkvKiBTRFJDX0FDVElNX0NUUkxBMCAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDE0LCBTRFJDX0FDVElNX0NUUkxCXzEpOwkvKiBTRFJDX0FDVElNX0NUUkxCMCAqLworCisJLypNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8xKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMSk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMSk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMSk7CisKKwkvKiBDUzAgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisJLyogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkgKi8KKwkvKiBTZXJpYWwgbW9kZSAqLworCS8qIENBUyBsYXRlbmN5ID0gMyAgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAzMiwgU0RSQ19NUl8xKTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAyMCwgU0RSQ19FTVIyXzEpOwkvKiB3ZWFrLXN0cmVuZ3RoIGRyaXZlciAqLworCisgCS8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisJLyogRGVsYXkgaXMgOTAgZGVncmVlcyAqLworCWlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpIHsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExBX0NUUkwpOworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEJfQ1RSTCk7CisJfQorCWVsc2UgeworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDAzMTA4LCBTRFJDX0RMTEFfQ1RSTCk7CS8vIEVTMi54CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDMxMDgsIFNEUkNfRExMQl9DVFJMKTsJLy8gRVMyLngKKwl9Cit9CisjZW5kaWYgLy8gQ0ZHX1NEUkFNX1NUQUNLRUQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNfaW5pdAorICogRGVzY3JpcHRpb246IERvZXMgZWFybHkgc3lzdGVtIGluaXQgb2YgbXV4aW5nIGFuZCBjbG9ja3MuCisgKiAtIENhbGxlZCBhdCB0aW1lIHdoZW4gb25seSBzdGFjayBpcyBhdmFpbGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBzX2luaXQoaW50IHNraXApCit7CisJdTMyICAgcmV2OworCisJcmV2ID0gZ2V0X2NwdV9yZXYoKTsKKworCXdhdGNoZG9nX2luaXQoKTsKKwltdXhTZXR1cFVBUlQxKCk7CisJZGVsYXkoMTAwKTsKKworCS8qRFBMTCBvdXQgPSAyeCBEUExMIC0tPiBjb3JlIGNsb2NrICovCisJX19yYXdfd3JpdGVsKERQTExfT1VULCBDTV9DTEtTRUwyX1BMTCk7CisKKwkvKkRQTEwgaW50byBsb3cgcG93ZXIgYnlwYXNzIChvdGhlcnMgb2ZmKSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAxLCBDTV9DTEtFTl9QTEwpOworCisJLypNUFUgY29yZSBjbG9jayA9IENvcmUgLzIgPSAzMDAgKi8KKwlfX3Jhd193cml0ZWwoTVBVX0RJViwgQ01fQ0xLU0VMX01QVSk7CisKKwkvKkRTUGlmPTIwMCwgRFNQaWY9MTAwLCBJVkE9MjAwICovCisJX19yYXdfd3JpdGVsKERTUF9ESVYsIENNX0NMS1NFTF9EU1ApOworCisJLypHRlggY2xvY2sgKEwzLzIpIDUwTUh6ICovCisJX19yYXdfd3JpdGVsKEdGWF9ESVYsIENNX0NMS1NFTF9HRlgpOworCisJLypMMz0xMDAsIEw0PTEwMCwgRGlzcGxheVNTPTUwIFZseW5jPTk2TWh6LHNzaT0xMDAsIHVzYj01MCAqLworCV9fcmF3X3dyaXRlbChCVVNfRElWLCBDTV9DTEtTRUwxX0NPUkUpOworCisJLyoxMk1IeiBhcGxsIHNyYywgMTIvKDErMSkqNTA9MzAwICovCisJX19yYXdfd3JpdGVsKERQTExfVkFMLCBDTV9DTEtTRUwxX1BMTCk7CisKKwkvKlZhbGlkIHRoZSBjb25maWd1cmF0aW9uICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDEsIFBSQ01fQ0xLQ0ZHX0NUUkwpOworCWRlbGF5KDEwMDApOworCisJLypFbmFibGUgRFBMTD0zMDAsIDk2TUh6IEFQTEwgbG9ja2VkLiAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDBGLCBDTV9DTEtFTl9QTEwpOworCWRlbGF5KDIwMDAwMCk7CisKKyNpZmRlZiBDRkdfU0RSQU1fRERSCisJY29uZmlnX3NkcmFtX2RkcihyZXYpOworI2VsaWYgZGVmaW5lZChDRkdfU0RSQU1fQ09NQk8pCisJY29uZmlnX3NkcmFtX2NvbWJvKHJldik7CisjZWxpZiBkZWZpbmVkKENGR19TRFJBTV9TRFIpCisJY29uZmlnX3NkcmFtX3NkcihyZXYpOworI2VsaWYgZGVmaW5lZChDRkdfU0RSQU1fU1RBQ0tFRCkKKwljb25maWdfc2RyYW1fc3RhY2tlZChyZXYpOworI2Vsc2UKKyNlcnJvciBTRFJBTSB0eXBlIG5vdCBzdXBwb3J0ZWQKKyNlbmRpZgkKKworCWRlbGF5KDIwMDAwKTsKKwlwZXJpcGhlcmFsX2VuYWJsZSgpOworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG1pc2NfaW5pdF9yCisgKiBEZXNjcmlwdGlvbjogSW5pdCBldGhlcm5ldCAoZG9uZSBoZXJlIHNvIHVkZWxheSB3b3JrcykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YXRjaGRvZ19pbml0CisgKiBEZXNjcmlwdGlvbjogU2h1dCBkb3duIHdhdGNoIGRvZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKyNkZWZpbmUgR1AgKEJJVDh8QklUOSkKKworCS8qIFRoZXJlIGFyZSA0IHdhdGNoIGRvZ3MuICAxIHNlY3VyZSwgYW5kIDMgZ2VuZXJhbCBwdXJwb3NlLgorCSAqIEkgd291bGQgZXhwZWN0IHRoYXQgdGhlIFJPTSB0YWtlcyBjYXJlIG9mIHRoZSBzZWN1cmUgb25lLAorCSAqIGJ1dCB3ZSB3aWxsIHRyeSBhbHNvLiAgT2YgdGhlIDMgR1Agb25lcywgMSBjYW4gcmVzZXQgdXMKKwkgKiBkaXJlY3RseSwgdGhlIG90aGVyIDIgb25seSBnZW5lcmF0ZSBNUFUgaW50ZXJydXB0cy4KKwkgKi8KKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSAsV0QyX0JBU0UrV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIgLFdEMl9CQVNFK1dTUFIpOworCisjaWYgTVBVX1dEX0NMT0NLRUQgLyogdmFsdWUgMHgxMCBzdGljayBvbiBhcHRpeCwgQklUNCBwb2xhcml0eSBzZWVtcyBvcHBzaXRlKi8KKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSAsV0QzX0JBU0UrV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDNfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIgLFdEM19CQVNFK1dTUFIpOworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEgLFdENF9CQVNFK1dTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0Q0X0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syICxXRDRfQkFTRStXU1BSKTsKKyNlbmRpZgorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UrV1dQUyk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRyYW1faW5pdAorICogRGVzY3JpcHRpb246IHNldHMgdWJvb3RzIGlkZWEgb2Ygc2RyYW0gc2l6ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwZXJpcGhlcmFsX2VuYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGludCB2LCBpZl9jbGtzPTAsIGZ1bmNfY2xrcz0wOworCisJLyogRW5hYmxlIEdQMiB0aW1lci4qLworCWlmX2Nsa3MgfD0gQklUNDsKKwlmdW5jX2Nsa3MgfD0gQklUNDsKKwl2ID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMMl9DT1JFKSB8IDB4NDsJLyogU3lzX2NsayBpbnB1dCBPTUFQMjQyMF9HUFQyICovCisJX19yYXdfd3JpdGVsKHYsIENNX0NMS1NFTDJfQ09SRSk7CisJX19yYXdfd3JpdGVsKDB4MSwgQ01fQ0xLU0VMX1dLVVApOworCisjaWZkZWYgQ0ZHX05TMTY1NTAKKwkvKiBFbmFibGUgVUFSVDEgY2xvY2sgKi8KKwlmdW5jX2Nsa3MgfD0gQklUMjE7CisJaWZfY2xrcyB8PSBCSVQyMTsKKyNlbmRpZgorCXYgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU4xX0NPUkUpIHwgaWZfY2xrczsJLyogSW50ZXJmYWNlIGNsb2NrcyBvbiAqLworCV9fcmF3X3dyaXRlbCh2LENNX0lDTEtFTjFfQ09SRSApOworCXYgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU4xX0NPUkUpIHwgZnVuY19jbGtzOyAvKiBGdW5jdGlvbmFsIENsb2NrcyBvbiAqLworCV9fcmF3X3dyaXRlbCh2LCBDTV9GQ0xLRU4xX0NPUkUpOworCWRlbGF5KDEwMDApOworCisjaWZuZGVmIEtFUk5FTF9VUERBVEVECisJeworI2RlZmluZSBWMSAweGZmZmZmZmZmCisjZGVmaW5lIFYyIDB4MDAwMDAwMDcKKworCQlfX3Jhd193cml0ZWwoVjEsIENNX0ZDTEtFTjFfQ09SRSk7CisJCV9fcmF3X3dyaXRlbChWMiwgQ01fRkNMS0VOMl9DT1JFKTsKKwkJX19yYXdfd3JpdGVsKFYxLCBDTV9JQ0xLRU4xX0NPUkUpOworCQlfX3Jhd193cml0ZWwoVjEsIENNX0lDTEtFTjJfQ09SRSk7CisJfQorI2VuZGlmCisKK30KKworLyogUGluIE11eGluZyByZWdpc3RlcnMgdXNlZCBmb3IgVUFSVDEgKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQxX0NUUyAgICAgICAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikweDQ4MDAwMEM1KQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDFfUlRTICAgICAgICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKTB4NDgwMDAwQzYpCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMV9UWCAgICAgICAgKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopMHg0ODAwMDBDNykKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQxX1JYICAgICAgICAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikweDQ4MDAwMEM4KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG11eFNldHVwVUFSVDEgIChvc3Rib290KQorICogRGVzY3JpcHRpb246IFNldCB1cCB1YXJ0MSBtdXhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG11eFNldHVwVUFSVDEodm9pZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAqTXV4Q29uZmlnUmVnOworCisJLyogVUFSVDFfQ1RTIHBpbiBjb25maWd1cmF0aW9uLCBQSU4gPSBEMjEgKi8KKwlNdXhDb25maWdSZWcgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUNPTlRST0xfUEFEQ09ORl9VQVJUMV9DVFM7CisJKk11eENvbmZpZ1JlZyA9IDB4MDAgOyAvKiBNb2RlID0gMCwgUFVQRD1EaXNhYmxlZCAqLworCisJLyogVUFSVDFfUlRTIHBpbiBjb25maWd1cmF0aW9uLCBQSU4gPSBIMjEgKi8KKwlNdXhDb25maWdSZWcgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUNPTlRST0xfUEFEQ09ORl9VQVJUMV9SVFM7CisJKk11eENvbmZpZ1JlZyA9IDB4MDAgOyAvKiBNb2RlID0gMCwgUFVQRD1EaXNhYmxlZCAqLworCisJLyogVUFSVDFfVFggcGluIGNvbmZpZ3VyYXRpb24sIFBJTiA9IEwyMCAqLworCU11eENvbmZpZ1JlZyA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopQ09OVFJPTF9QQURDT05GX1VBUlQxX1RYOworCSpNdXhDb25maWdSZWcgPSAweDAwIDsgLyogTW9kZSA9IDAsIFBVUEQ9RGlzYWJsZWQgKi8KKworCS8qIFVBUlQxX1JYIHBpbiBjb25maWd1cmF0aW9uLCBQSU4gPSBUMjEgKi8KKwlNdXhDb25maWdSZWcgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUNPTlRST0xfUEFEQ09ORl9VQVJUMV9SWDsKKwkqTXV4Q29uZmlnUmVnID0gMHgwMCA7IC8qIE1vZGUgPSAwLCBQVVBEPURpc2FibGVkICovCit9CisKK2ludCBuYW5kX2luaXQodm9pZCkKK3sKKwl1MzIJcmV2OworCisJcmV2ID0gZ2V0X2NwdV9yZXYoKTsKKworCisJLyogR1BNQyBwaW4gbXV4aW5nICovIAorCSgqKHZvbGF0aWxlIGludCopMHg0ODAwMDA3MCkgJj0gMHgwMDAwMDBGRjsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NDgwMDAwNzQpICY9IDB4MDAwMDAwMDA7CisJKCoodm9sYXRpbGUgaW50KikweDQ4MDAwMDc4KSAmPSAweDAwMDAwMDAwOworCSgqKHZvbGF0aWxlIGludCopMHg0ODAwMDA3QykgJj0gMHgwMDAwMDAwMDsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NDgwMDAwODApICY9IDB4RkYwMDAwMDA7CisKKwkvKiBHUE1DX0lPX0RJUiAqLworCSgqKHZvbGF0aWxlIGludCopMHg0ODAwMDA4QykgPSAweDE5MDAwMDAwOworCisJLyogR1BNQyBDb25maWd1cmF0aW9uICovCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDEwKSA9IDB4MDAwMDAwMEE7CisJd2hpbGUgKCgoKih2b2xhdGlsZSBpbnQgKikweDY4MDBBMDE0KSAmIDB4MDAwMDAwMDEpID09IDApOworCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDUwKSA9IDB4MDAwMDAwMDE7CQorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA2MCkgPSAweDAwMDAxODAwOwkKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNjQpID0gMHgwMDE0MTQwMDsJCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDY4KSA9IDB4MDAxNDE0MDA7CQorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA2QykgPSAweDBGMDEwRjAxOwkKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNzApID0gMHgwMTBDMTQxNDsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNzQpID0gMHgwMDAwMEE4MDsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNzgpID0gMHgwMDAwMEM0NDsgCS8vYmFzZSAweDA0MDAwMDAwCisKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwQTgpID0gMHgwMDAwMDAwMDsKKwlkZWxheSgxMDAwKTsKKyNpZmRlZiBDRkdfU0RSQU1fU1RBQ0tFRAorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA5MCkgPSAweDAwMDExMDAwOworI2Vsc2UKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwOTApID0gMHgwMDAxMTIwMDsKKyNlbmRpZgorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA5NCkgPSAweDAwMWYxZjAwOworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA5OCkgPSAweDAwMDgwODAyOworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA5QykgPSAweDFDMDkxQzA5OworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTBBMCkgPSAweDAzMUExRjFGOworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTBBNCkgPSAweDAwMDAwM0MyOworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTBBOCkgPSAweDAwMDAwRjQ4OworCisJaWYgKHJldiAhPSBDUFVfMjQyMF8yNDIyX0VTMSkKKwkJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDQwKSA9IDB4MUZGMDsJLy8gZXMyLngKKworIAlpZiAobmFuZF9jaGlwKCkpeworCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9jcHVfcmV2KHZvaWQpCit7CisgICAgICAgIHUzMiB2OworICAgICAgICB2ID0gX19yYXdfcmVhZGwoVEFQX0lEQ09ERV9SRUcpOworICAgICAgICB2ID0gdiA+PiAyODsKKyAgICAgICAgcmV0dXJuKHYrMSk7ICAvKiBjdXJyZW50bHkgMjQyMiBhbmQgMjQyMCBtYXRjaCB1cCAqLworfQorCisvKiBvcHRpb25hbGx5IGRvIHNvbWV0aGluZyBsaWtlIGJsaW5raW5nIExFRCAqLwordm9pZCBib2FyZF9oYW5nICh2b2lkKQore30KKworCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2MzN2U1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMjQyMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworI2lmZGVmIENPTkZJR19QQVJUSUFMX1NSQU0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8gCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gUFJDTV9DTEtDRkdfQ1RSTCAtIGFkZHIgb2YgdmFsaWQgcmVnCisgKiAgUjEgPSBDTV9DTEtFTl9QTEwgLSBhZGRyIGRwbGwgY3RsciByZWcKKyAqICBSMiA9IGRwbGwgdmFsdWUKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAorLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdWIgICAgIHNwLCBzcCwgIzB4NCAvKiBnZXQgc29tZSBzdGFjayBzcGFjZSAqLworICAgICAgICBzdHIgICAgIHI0LCBbc3BdICAgICAvKiBzYXZlIHI0J3MgdmFsdWUgKi8KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjgsIHBsbF9jdGxfYWRkCisgICAgICAgIG1vdiAgICAgcjQsICMweDIKKyAgICAgICAgc3RyICAgICByNCwgW3I4XQorICAgICAgICBsZHIgICAgIHI0LCBwbGxfc3RhdAorYmxvY2s6CisgICAgICAgIGxkciAgICAgcjgsIFtyNF0JLyogd2FpdCBmb3IgYnlwYXNzIHRvIHRha2UgZWZmZWN0ICovCisgICAgICAgIGFuZCAgICAgcjgsIHI4LCAjMHgzCisgICAgICAgIGNtcCAgICAgcjgsICMweDEKKyAgICAgICAgYm5lICAgICBibG9jaworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNCwgcGxsX2Rpdl9hZGQKKwlsZHIgICAgIHI4LCBwbGxfZGl2X3ZhbAorICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisgICAgCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNCwgY2ZnM18wX2FkZHIKKyAgICAgICAgbGRyICAgICByOCwgY2ZnM18wX3ZhbAorICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisgICAgICAgIGxkciAgICAgcjQsIGNmZzRfMF9hZGRyCisgICAgICAgIGxkciAgICAgcjgsIGNmZzRfMF92YWwKKyAgICAgICAgc3RyICAgICByOCwgW3I0XQorICAgICAgICBsZHIgICAgIHI0LCBjZmcxXzBfYWRkcgorICAgICAgICBsZHIgICAgIHI4LCBbcjRdCisgICAgICAgIG9yciAgICAgcjgsIHI4LCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByOCwgW3I0XQorCisJLyogc2V0dXAgdG8gMnggbG9vcCB0aG91Z2ggY29kZS4gIFRoZSBmaXJzdCBsb29wIHByZS1sb2FkcyB0aGUgCisgICAgICAgICAqIGljYWNoZSwgdGhlIDJuZCBjb21taXRzIHRoZSBwcmNtIGNvbmZpZywgYW5kIGxvY2tzIHRoZSBkcGxsCisgICAgICAgICAqLworICAgICAgICBtb3YgICAgIHI0LCAjMHgxMDAwICAgICAgLyogc3BpbiBzcGluIHNwaW4gKi8KKyAgICAgICAgbW92ICAgICByOCwgIzB4NCAgICAgICAgIC8qIGZpcnN0IHBhc3MgY29uZGl0aW9uICYgc2V0IHJlZ2lzdGVycyAqLworICAgICAgICBjbXAgICAgIHI4LCAjMHg0CisyOgorICAgICAgICBsZHJuZSAgIHI4LCBbcjNdICAgICAgICAgLyogRFBMTCBsb2NrIGNoZWNrICovCisgICAgICAgIGFuZCAgICAgcjgsIHI4LCAjMHg3CisgICAgICAgIGNtcCAgICAgcjgsICMweDIKKyAgICAgICAgYmVxICAgICA0ZgorMzoKKyAgICAgICAgc3ViZXEgICByOCwgcjgsICMweDEKKyAgICAgICAgc3RyZXEgICByOCwgW3IwXSAgICAgICAgIC8qIGNvbW1pdCBkaXZpZGVycyAoMm5kIHRpbWUpICovCisgICAgICAgIG5vcAorbGxvb3AxOgorICAgICAgICBzdWIgICAgIHI0LCByNCwgIzB4MSAgICAvKiBMb29wIGN1cnJlbnRseSBuZWNlc3NhcnkgZWxzZSBiYWQganVtcHMgKi8KKyAgICAgICAgbm9wCisgICAgICAgIGNtcCAgICAgcjQsICMweDAKKyAgICAgICAgYm5lICAgICBsbG9vcDEKKyAgICAgICAgbW92ICAgICByNCwgIzB4NDAwMDAKKyAgICAgICAgY21wICAgICByOCwgIzB4MQorICAgICAgICBub3AKKyAgICAgICAgc3RyZXEgICByMiwgW3IxXSAgICAgICAgLyogbG9jayBkcGxsICgybmQgdGltZSkgKi8KKyAgICAgICAgbm9wCitsbG9vcDI6CisgICAgICAgIHN1YiAgICAgcjQsIHI0LCAjMHgxICAgIC8qIGxvb3AgY3VycmVudGx5IG5lY2Vzc2FyeSBlbHNlIGJhZCBqdW1wcyAqLworICAgICAgICBub3AKKyAgICAgICAgY21wICAgICByNCwgIzB4MAorICAgICAgICBibmUgICAgIGxsb29wMgorICAgICAgICBtb3YgICAgIHI0LCAjMHg0MDAwMAorICAgICAgICBjbXAgICAgIHI4LCAjMHgxCisgICAgICAgIG5vcAorICAgICAgICBsZHJlcSAgIHI4LCBbcjNdICAgICAgICAgLyogZ2V0IGxvY2sgY29uZGl0aW9uIGZvciBkcGxsICovCisgICAgICAgIGNtcCAgICAgcjgsICMweDQgICAgICAgICAvKiBmaXJzdCB0aW1lIHRob3VnaD8gKi8KKyAgICAgICAgYm5lICAgICAyYgorICAgICAgICBtb3ZlcSAgIHI4LCAjMHgyICAgICAgICAgLyogc2V0IHRvIGRwbGwgY2hlY2sgY29uZGl0aW9uLiAqLworICAgICAgICBiZXEgICAgIDNiICAgICAgICAgICAgICAgLyogaWYgY29uZGl0aW9uIG5vdCB0cnVlIGJyYW5jaCAqLworNDogIAorICAgICAgICBsZHIgICAgIHI0LCBbc3BdCisgICAgICAgIGFkZCAgICAgc3AsIHNwLCAjMHg0ICAgICAvKiByZXR1cm4gc3RhY2sgc3BhY2UgKi8KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8gICAgICAgIAorCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworY2ZnM18wX2FkZHI6CisgICAgLndvcmQgIEdQTUNfQ09ORklHM18wCitjZmczXzBfdmFsOiAKKyAgICAud29yZCAgU01OQU5EX0dQTUNfQ09ORklHMworY2ZnNF8wX2FkZHI6CisgICAgLndvcmQgIEdQTUNfQ09ORklHNF8wCitjZmc0XzBfdmFsOgorICAgIC53b3JkICBTTU5BTkRfR1BNQ19DT05GSUc0CitjZmcxXzBfYWRkcjoKKyAgICAud29yZCAgR1BNQ19DT05GSUcxXzAKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX3N0YXQ6CisgICAgLndvcmQgQ01fSURMRVNUX0NLR0VOCitwbGxfZGl2X2FkZDoKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTCAKK3BsbF9kaXZfdmFsOgorICAgIC53b3JkIERQTExfVkFMCS8qIERQTEwgc2V0dGluZyAoMzAwTUh6IGRlZmF1bHQpICovCisjZW5kaWYgICAgICAgICAgICAKKworLmdsb2JsIHBsYXRmb3Jtc2V0dXAKK3BsYXRmb3Jtc2V0dXA6CisJbW92IHIzLCByMCAgICAgLyogc2F2ZSBza2lwIGluZm9ybWF0aW9uICovCisjaWZkZWYgQ09ORklHX0FQVElYCisJbGRyCXIwLAlSRUdfU0RSQ19NQ0ZHXzAKKwlsZHIJcjEsCVZBTF9TRFJDX01DRkdfMAorCXN0cglyMSwJW3IwXQorCWxkcglyMCwJUkVHX1NEUkNfTVJfMAorCWxkcglyMSwJVkFMX1NEUkNfTVJfMAorCXN0cglyMSwJW3IwXQorCS8qIGEgZGRyIG5lZWRzIGVtcjEgc2V0IGhlcmUgKi8KKwlsZHIJcjAsCVJFR19TRFJDX1NIQVJJTkcKKwlsZHIJcjEsCVZBTF9TRFJDX1NIQVJJTkcKKwlzdHIJcjEsCVtyMF0KKyAgICAgICAJbGRyCXIwLAlSRUdfU0RSQ19SRlJfQ1RSTF8wCisJbGRyCXIxLAlWQUxfU0RSQ19SRlJfQ1RSTF8wCisJc3RyCXIxLAlbcjBdCisKKyAgICAgICAvKiBsaXR0bGUgZGVsYXkgYWZ0ZXIgaW5pdCAqLworICAgICAgIG1vdiByMiwgIzB4MTgwMCAgICAgICAgICAgICAgICAgICAgICAgIAorMTogICAgICAgCisgICAgICAgIHN1YnMgcjIsIHIyLCAjMHgxCisgICAgICAgIGJuZSAxYgorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BBUlRJQUxfU1JBTQorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisgICAgICAgIG1vdiAgICAgcjAsICAgICByMyAgICAgIC8qIHBhc3Mgc2tpcCBpbmZvIHRvIHNfaW5pdCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworI2VuZGlmCisKKwkvKiBtYXAgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKwlsZHIJcjAsCVZBTF9JTlRIX1NFVFVQCisJbWNyCXAxNSwgMCwgcjAsIGMxNSwgYzIsIDQKKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitWQUxfSU5USF9TRVRVUDoKKwkud29yZCBQRVJJRkVSQUxfUE9SVF9CQVNFCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworCisKKworCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2NGNhNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQveC1sb2FkLmxkcwpAQCAtMCwwICsxLDU0IEBACisvKgorICogSmFudWFyeSAyMDA0IC0gQ2hhbmdlZCB0byBzdXBwb3J0IEg0IGRldmljZSAKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cyAKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9hcm0xMTM2L3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Yzk0MWQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IG9tYXAyNDMwc2RwLm8gCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzUwNzgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9jb25maWcubWsKQEAgLTAsMCArMSwyOCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDQKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBUSSBINCBib2FyZCB3aXRoIE9NQVAyNDIwIChBUk0xMTM2KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cworIworIyBINCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgNjRNQiBtRERSLVNEUkFNIG9uIENTMAorIyBINCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgMDBNQiBtRERSLVNEUkFNIG9uIENTMQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorIyBBMDAwLzAwMDAgKGJhbmsxKSBFUzIgd2lsbCBiZSBjb25maWd1cmFibGUKKyMgTGludXgtS2VybmVsIGlzIGV4cGVjdGVkIHRvIGJlIGF0IDgwMDAnODAwMCwgZW50cnkgODAwMCc4MDAwCisjIChtZW0gYmFzZSArIHJlc2VydmVkKQorCisjIDI0MzAgaDQgaGFzIHNhbWUgbWVtIGNvbmZpZ3VyYXRpb24gYXMgaDQuCisKKyMgRm9yIHVzZSB3aXRoIGV4dGVybmFsIG9yIGludGVybmFsIGJvb3RzLgorIyBDT05GSUdfUEFSVElBTF9TUkFNIG11c3QgYmUgZGVmaW5lZCB0byB1c2UgdGhpcy4KK1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBVc2VkIHdpdGggZnVsbCBTUkFNIGJvb3QuCisjIFRoaXMgaXMgZWl0aGVyIHdpdGggYSBHUCBzeXN0ZW0gb3IgYSBzaWduZWQgYm9vdCBpbWFnZS4KKyMgZWFzaWVzdCwgYW5kIHNhZmVzdCB3YXkgdG8gZ28gaWYgeW91IGNhbi4KKyMgQ29tbWVudCBvdXQgLy9DT05GSUdfUEFSVElBTF9TUkFNIGZvciB0aGlzIG9uZS4KKyMKKyNURVhUX0JBU0UgPSAweDQwMjgwMDAwCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL29tYXAyNDMwc2RwLmMgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9vbWFwMjQzMHNkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTdiNDIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9vbWFwMjQzMHNkcC5jCkBAIC0wLDAgKzEsNzQ2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDUKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMjQzMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKTsKK3N0YXRpYyB2b2lkIHdhdGNoZG9nX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBwZXJpcGhlcmFsX2VuYWJsZSh2b2lkKTsKK3N0YXRpYyB2b2lkIG11eFNldHVwQWxsKHZvaWQpOworc3RhdGljIHUzMiAgZ2V0X2NwdV9yZXYodm9pZCk7CitzdGF0aWMgdTMyICBnZXRfZGV2aWNlX3R5cGUodm9pZCk7CitzdGF0aWMgdm9pZCBwcmNtX2luaXQodm9pZCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkgKHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iCisJCQkJCSAgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIgKGxvb3BzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogYm9hcmRfaW5pdAorICogRGVzY3JpcHRpb246IEVhcmx5IGhhcmR3YXJlIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfY3B1X3Jldih2b2lkKQoreworICAgICAgICB1MzIgdjsKKyAgICAgICAgdiA9IF9fcmF3X3JlYWRsKFRBUF9JRENPREVfUkVHKTsKKyAgICAgICAgdiA9IHYgPj4gMjg7CisgICAgICAgIHJldHVybih2KzEpOyAgLyogY3VycmVudGx5IDI0MjIgYW5kIDI0MjAgbWF0Y2ggdXAgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBnZXRfZGV2aWNlX3R5cGUoKTogdGVsbCBpZiBHUC9IUy9FTVUvVFNUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoREVWSUNFX01BU0spOworICAgICAgICByZXR1cm4obW9kZSA+Pj0gOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgSGVscGVyIGZ1bmN0aW9uIHRvIHdhaXQgZm9yIHRoZSBzdGF0dXMgb2YgYSByZWdpc3RlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgd2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisgICAgICAgIHUzMiBpID0gMCwgdmFsOworICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgIHZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgICAgICAgICAgaWYgKGk9PWJvdW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9IHdoaWxlICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTdXBwb3J0IGZvciBtdWx0aXBsZSB0eXBlIG9mIG1lbW9yeSB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ0ZHX1NEUkFNX0REUgordm9pZAorY29uZmlnX3NkcmFtX2Rkcih1MzIgcmV2KQoreworCS8qIGJhbGwgRDExLCBtb2RlIDAgKi8KKwlfX3Jhd193cml0ZWIoMHgwOCwgMHg0ODAwMDAzMik7CisKKwkvKiBTRFJDX0NTMCBDb25maWd1cmF0aW9uICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxLCBTRFJDX1JGUl9DVFJMKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX0FDVElNX0NUUkxBXzBfRVMxLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfQUNUSU1fQ1RSTEJfMF9FUzEsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisKKwkvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisKKworCS8qIAorCSAqIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIKKwkgKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeQorCSAqIFNlcmlhbCBtb2RlCisJICogQ0FTIGxhdGVuY3kgPSAzIAorCSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDMyLCBTRFJDX01SXzApOworCisgCS8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisJLyogRGVsYXkgaXMgOTAgZGVncmVlcyAqLworCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwOCwgU0RSQ19ETExBX0NUUkwpOwkvLyBFUzIueAorCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwOCwgU0RSQ19ETExCX0NUUkwpOwkvLyBFUzIueAorCit9CisjZW5kaWYgLy8gQ0ZHX1NEUkFNX0REUgorCisjaWZkZWYgQ0ZHX1NEUkFNX0NPTUJPIAordm9pZAorY29uZmlnX3NkcmFtX2NvbWJvKHUzMiByZXYpCit7CisKKwl1MzIgZGxsY3RybD0wOworCisgICAgICAgIC8qIGJhbGwgQzEyLCBtb2RlIDAgKi8KKyAgICAgICAgX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTEpOworICAgICAgICAvKiBiYWxsIEQxMSwgbW9kZSAwICovCisgICAgICAgIF9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMyKTsKKyAgICAgICAgLyogYmFsbCBCMTMsIG1vZGUgMCAtIGZvciBDS0UxIChub3QgbmVlZGVkIHJrdyBmb3IgY29tYm8pICovCisgICAgICAgIF9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMGEzKTsKKworICAgICAgICAvKmNvbmZpZ3VyZSBzZHJjIDMyIGJpdCBmb3IgQ09NQk8gZGRyIHNkcmFtLiBJc3N1ZSBzb2Z0IHJlc2V0ICovCisgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDAwMDEyLCBTRFJDX1NZU0NPTkZJRyk7CisgICAgICAgIHdhaXRfb25fdmFsdWUoQklUMCwgQklUMCwgU0RSQ19TVEFUVVMsIDEyMDAwMDAwKTsgLyogd2FpdCB0aWxsIHJlc2V0IGRvbmUgc2V0ICovCisgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDAwMDAwLCBTRFJDX1NZU0NPTkZJRyk7CisKKyAgICAgICAgLyogU0RSQ1RyaVN0YXRlOiBubyBUcmlzICovCisgICAgICAgIC8qIENTME11eENmZzogMDAwICgzMi1iaXQgU0RSQU0gb24gRDMxLi4wKSAqLworCWlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpCisJICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisJZWxzZQorICAgICAgIAkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisKKyAgICAgICAgLyogQ1MwIFNEUkMgTWVtb3J5IENvbmZpZ3VyYXRpb24sICovCisgICAgICAgIC8qIEREUi1TRFJBTSwgRXh0ZXJuYWwgU0RSQU0gaXMgeDMyYml0LCAqLworICAgICAgICAvKiBDb25maWd1cmUgdG8gTVVYOTogMXg4TWJ4MzIgICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX0NPTUJPX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCQorCS8qIFRoaXMgaXMgcmVxZCBvbmx5IGZvciBFUzEgKi8KKwlpZiAocmV2ID09IENQVV8yNDJYX0VTMSkKKyAgICAgICAgCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxLCBTRFJDX1JGUl9DVFJMKTsKKworICAgICAgICAvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJZGVsYXkoNTAwMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCisgICAgICAgIC8qIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKyAgICAgICAgLyogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkgKi8KKyAgICAgICAgLyogU2VyaWFsIG1vZGUgKi8KKyAgICAgICAgLyogQ0FTIGxhdGVuY3kgPSAzICAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX01SXzBfRERSLCBTRFJDX01SXzApOworCisgICAgICAgIC8qIENTMSBTRFJDIE1lbW9yeSBDb25maWd1cmF0aW9uLCAqLworICAgICAgICAvKiBERFItU0RSQU0sIEV4dGVybmFsIFNEUkFNIGlzIHgzMmJpdCwgKi8KKyAgICAgICAgLyogQ29uZmlndXJlIHRvIE1VWDk6IDF4OE1ieDMyICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX0NPTUJPX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMSk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEFfMF8xMDBNSHosIFNEUkNfQUNUSU1fQ1RSTEFfMSk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8xKTsKKwkvKiBUaGlzIGlzIHJlcWQgb25seSBmb3IgRVMxICovCisJaWYgKHJldiA9PSBDUFVfMjQyWF9FUzEpCisgICAgICAgIAlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMSwgMHg2ODAwOTBkNCk7CisKKyAgICAgICAgLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9OT1AsIDB4NjgwMDkwZDgpOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgMHg2ODAwOTBkOCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIDB4NjgwMDkwZDgpOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCAweDY4MDA5MGQ4KTsKKworICAgICAgICAvKiBDUzEgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisJLyogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkgKi8KKyAgICAgICAgLyogU2VyaWFsIG1vZGUgKi8KKyAgICAgICAgLyogQ0FTIGxhdGVuY3kgPSAzICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfTVJfMF9ERFIsIDB4NjgwMDkwYjQpOworCisgICAgICAgIC8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisgICAgICAgIC8qIERlbGF5IGlzIDkwIGRlZ3JlZXMgKi8KKworCWlmIChyZXYgPT0gQ1BVXzI0MlhfRVMxKQorCQlkbGxjdHJsID0gKEJJVDB8QklUMyk7CisJZWxzZQorCQlkbGxjdHJsID0gQklUMDsJCQorCisgICAgICAgIGlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpIHsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwNiwgU0RSQ19ETExBX0NUUkwpOworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEFfQ1RSTCk7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzA2LCBTRFJDX0RMTEJfQ1RSTCk7IC8qIGxvYWQgY3RyIHZhbHVlICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQl9DVFJMKTsgLyogbG9jayBhbmQgZ28gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQV9DVFJMKTsgICAvLyBFUzIueAorICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAmIH4oTE9BRERMTHxkbGxjdHJsKSwgU0RSQ19ETExBX0NUUkwpOyAgIC8vIEVTMi54CisgICAgICAgICAgICAgICAvLyBfX3Jhd193cml0ZWwoMHgwMDAwOTgwOCwgU0RSQ19ETExBX0NUUkwpOyAgIC8vIEVTMi54CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEJfQ1RSTCk7ICAgLy8gRVMyLnggPworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAmIH4oTE9BRERMTHxkbGxjdHJsKSwgU0RSQ19ETExCX0NUUkwpOyAgIC8vIEVTMi54CisgICAgICAgICAgICAgICAgLy9fX3Jhd193cml0ZWwoMHgwMDAwOTgwOCwgU0RSQ19ETExCX0NUUkwpOyAgIC8vIEVTMi54CisgICAgICAgIH0KK30KKworI2VuZGlmIC8vIENGR19TRFJBTV9DT01CTworCisjaWZkZWYgQ0ZHXzI0MzBTRFJBTV9ERFIKK3ZvaWQKK2NvbmZpZ18yNDMwc2RyYW1fZGRyKHUzMiByZXYpCit7CisJdTMyIGRsbHN0YXQsIGRsbGN0cmw7CisKKyAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDAwMTIsIFNEUkNfU1lTQ09ORklHKTsKKyAgICAgICAgd2FpdF9vbl92YWx1ZShCSVQwLCBCSVQwLCBTRFJDX1NUQVRVUywgMTIwMDAwMDApOyAvKiB3YWl0IHRpbGwgcmVzZXQgZG9uZSBzZXQgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qIENoaXAtbGV2ZWwgc2hhcmVkIGludGVyZmFjZSBtYW5hZ2VtZW50ICovCisJLyogU0RSQ1RyaVN0YXRlOiBubyBUcmlzICovCisJLyogQ1MwTXV4Q2ZnOiAwMDAgKDMyLWJpdCBTRFJBTSBvbiBEMzEuLjApICovCisJLyogQ1MxTXV4Q2ZnOiAwMDAgKDMyLWJpdCBTRFJBTSBvbiBEMzEuLjApICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisJLyogQ1MwIFNEUkMgTWVtb3J5IENvbmZpZ3VyYXRpb24sICovCisJLyogRERSLVNEUkFNLCBFeHRlcm5hbCBTRFJBTSBpcyB4MzJiaXQsICovCisJLyogQ29uZmlndXJlIHRvIE1VWDE0OiAzMk1ieDMyICovCisJX19yYXdfd3JpdGVsKFNEUF8yNDMwX1NEUkNfTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKwlfX3Jhd193cml0ZWwoU0RQXzI0MzBfU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfUkZSX0NUUkwsIFNEUkNfUkZSX0NUUkwpOworCisJLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJZGVsYXkoNTAwMCk7CisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworIAorCS8qIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKwkvKiBCdXJzdCBsZW5ndGggPSAyIC0gU0RSIG1lbW9yeSAqLworCS8qIFNlcmlhbCBtb2RlICovCisJLyogQ0FTIGxhdGVuY3kgPSAzICAqLworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMCk7CisKKwkvKiBTZXQgdXAgU0RSQyBETEwgdmFsdWVzIGZvciAyNDMwIEREUiAqLworCWRsbGN0cmwgPSAoU0RQXzI0MzBfU0RSQ19ETExBQl9DVFJMICYgfkJJVDIpOyAvKiBzZXQgdGFyZ2V0IGN0cmwgdmFsICovCisJX19yYXdfd3JpdGVsKGRsbGN0cmwsIFNEUkNfRExMQV9DVFJMKTsJLyogc2V0IGxvY2sgbW9kZSAqLworCV9fcmF3X3dyaXRlbChkbGxjdHJsLCBTRFJDX0RMTEJfQ1RSTCk7CS8qIHNldCBsb2NrIG1vZGUgKi8KKwlkZWxheSgweDEwMDApOyAvKiB0aW1lIHRvIHRyYWNrIHRvIGNlbnRlciAqLwkKKwlkbGxzdGF0ID0gX19yYXdfcmVhZGwoU0RSQ19ETExBX1NUQVRVUykgJiAweEZGMDA7IC8qIGdldCBzdGF0dXMgKi8KKwlkbGxjdHJsID0gKGRsbGN0cmwgJiAweDAwRkYpIHwgZGxsc3RhdCB8IEJJVDI7IC8qIGJ1aWxkIHVubG9jayB2YWx1ZSAqLworCV9fcmF3X3dyaXRlbChkbGxjdHJsLCBTRFJDX0RMTEFfQ1RSTCk7CS8qIHNldCB1bmxvY2sgbW9kZSAqLworCV9fcmF3X3dyaXRlbChkbGxjdHJsLCBTRFJDX0RMTEJfQ1RSTCk7CS8qIHNldCB1bmxvY2sgbW9kZSAqLworfQorI2VuZGlmIC8vIENGR18yNDMwU0RSQU1fRERSCisKKyNpZmRlZiBDRkdfU0RSQU1fU1RBQ0tFRCAKK3ZvaWQKK2NvbmZpZ19zZHJhbV9zdGFja2VkKHUzMiByZXYpCit7CisKKwkvKiBQaW4gTXV4aW5nIGZvciBTRFJDICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTEpOwkvKiBtdXggbW9kZSAwIChDUzEpICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTMpOwkvKiBtdXggbW9kZSAwIChDS0UxKSAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMyKTsJLyogY29ubmVjdCBzZHJjX2ExMiAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMxKTsJLyogY29ubmVjdCBzZHJjX2ExMyAqLworCisJLyogY29uZmlndXJlIHNkcmMgMzIgYml0IGZvciBDT01CTyBkZHIgc2RyYW0gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxMCwgU0RSQ19TWVNDT05GSUcpOwkvKiBubyBpZGxlIGFjayBhbmQgUkVTRVQgZW5hYmxlICovCisJZGVsYXkoMjAwMDAwKTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxMCwgU0RSQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlIG1vZGUgKi8KKworCS8qIFNEUkNfU0hBUklORyAqLworCS8qIFUtYm9vdCBpcyB3cml0aW5nIDB4MDAwMDAxMDAgdGhvdWdoIChINF8yNDIwX1NEUkNfU0hBUklORyApICovCisJLy9fX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwlfX3Jhd193cml0ZWwoMHgwMDAwNDkwMCwgU0RSQ19TSEFSSU5HKTsKKworCS8qIFNEUkNfQ1MwIENvbmZpZ3VyYXRpb24gKi8KKwkvKiBOb25lIGZvciBFUzIuMSAqLworCisJLyogIFNEUkNfQ1MxIENvbmZpZ3VyYXRpb24gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgU0RSQ19DU19DRkcpOwkvKiBSZW1hcCBDUzEgdG8gMHg4MDAwMDAwMCAqLworCisJLyogRGlzYWJsZSBwb3dlciBkb3duIG9mIENLRSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDg1LCBTRFJDX1BPV0VSKTsKKworCV9fcmF3X3dyaXRlbCgweDAxQTAyMDE5LCBTRFJDX01DRkdfMSk7CS8qIFNEUkNfTUNGRzEgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAzREQwMywgU0RSQ19SRlJfQ1RSTDEpOwkvKiBTRFJDX1JGUl9DVFJMMSAqLworCV9fcmF3X3dyaXRlbCgweDkyRERDNDg1LCBTRFJDX0FDVElNX0NUUkxBXzEpOwkvKiBTRFJDX0FDVElNX0NUUkxBMCAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDE0LCBTRFJDX0FDVElNX0NUUkxCXzEpOwkvKiBTRFJDX0FDVElNX0NUUkxCMCAqLworCisJLypNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAwLCAweDY4MDA5MEQ4KTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMSwgMHg2ODAwOTBEOCk7CisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDIsIDB4NjgwMDkwRDgpOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAyLCAweDY4MDA5MEQ4KTsKKworCS8qIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKwkvKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeSAqLworCS8qIFNlcmlhbCBtb2RlICovCisJLyogQ0FTIGxhdGVuY3kgPSAzICAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDMyLCAweDY4MDA5MEI0KTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAyMCwgMHg2ODAwOTBCQyk7CS8qIHdlYWstc3RyZW5ndGggZHJpdmVyICovCisKKyAJLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkvKiBEZWxheSBpcyA5MCBkZWdyZWVzICovCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEFfQ1RSTCk7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQl9DVFJMKTsKKwl9CisJZWxzZSB7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDMxMDgsIFNEUkNfRExMQV9DVFJMKTsJLy8gRVMyLngKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMzEwOCwgU0RSQ19ETExCX0NUUkwpOwkvLyBFUzIueAorCX0KK30KKyNlbmRpZiAvLyBDRkdfU0RSQU1fU1RBQ0tFRAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtfc3BlZWQgLSBkZXRlcm1pbmUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQKKyAqICBiYXNlZCBvbiBrbm93biAzMmtIeiBjbG9jayBhbmQgZ3B0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9vc2NfY2xrX3NwZWVkKHUzMiAqc2hpZnQpCit7CisjZGVmaW5lIEdQVF9FTiAgKCgwPDwyKXxCSVQxfEJJVDApICAgICAgLyogZW5hYmxlIHN5c19jbGsgTk8tcHJlc2NhbGUgLzEgKi8KKyNkZWZpbmUgR1BUX0NUUiBPTUFQMjRYWF9HUFQyK1RDUlIgICAgICAvKiByZWFkIGNvdW50ZXIgYWRkcmVzcyAqLworICAgICAgICB1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIHZhbDsKKwl1bnNpZ25lZCBpbnQgdiwgaWZfY2xrcz0wLCBmdW5jX2Nsa3M9MCA7CisKKworCisgICAgICAgIGlmKF9fcmF3X3JlYWRsKFBSQ01fQ0xLU1JDX0NUUkwpICYgQklUNyl7ICAgIC8qIGlmIGN1cnJlbnRseSAvMiAqLworICAgICAgICAgICAgICAgICpzaGlmdCA9IDE7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICpzaGlmdCA9IDA7CisgICAgICAgIH0KKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUwyX0NPUkUpIHwgMHg0OyAgICAgIC8qIG1hc2sgZm9yIHN5c19jbGsgdXNlICovCisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMMl9DT1JFKTsgICAgICAgICAgICAvKiB0aW1lcjIgc291cmNlIHRvIHN5c19jbGsgKi8KKwlfX3Jhd193cml0ZWwoQklUNCwgQ01fSUNMS0VOMV9DT1JFKTsgICAgICAgICAgIC8qIHRpbWVyMiBpbnRlcmZhY2UgY2xvY2sgb24gKi8KKwlfX3Jhd193cml0ZWwoQklUNCwgQ01fRkNMS0VOMV9DT1JFKTsgICAgICAgICAgIC8qIHRpbWVyMiBmdW5jdGlvbiBjbG9jayBvbiAqLworCS8qIEVuYWJsZSBHUDIgdGltZXIuKi8KKwlpZl9jbGtzIHw9IEJJVDQ7CisJZnVuY19jbGtzIHw9IEJJVDQ7CisJdiA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTjFfQ09SRSkgfCBpZl9jbGtzOwkvKiBJbnRlcmZhY2UgY2xvY2tzIG9uICovCisJX19yYXdfd3JpdGVsKHYsQ01fSUNMS0VOMV9DT1JFICk7CisJdiA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTjFfQ09SRSkgfCBmdW5jX2Nsa3M7IC8qIEZ1bmN0aW9uYWwgQ2xvY2tzIG9uICovCisJX19yYXdfd3JpdGVsKHYsIENNX0ZDTEtFTjFfQ09SRSk7CisgICAgICAgIF9fcmF3X3dyaXRlbCgwLCBPTUFQMjRYWF9HUFQyK1RMRFIpOyAgICAgICAgICAgLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworICAgICAgICBfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMjRYWF9HUFQyK1RDTFIpOyAgICAgIC8qIGVuYWJsZSBjbG9jayAqLworICAgICAgICAvKiBlbmFibGUgMzJrSHogc291cmNlICovICAgICAgICAgICAgICAgICAgICAgIC8qIGVuYWJsZWQgb3V0IG9mIHJlc2V0ICovCisgICAgICAgIC8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisgICAgICAgIHN0YXJ0ID0gMjAgKyBfX3Jhd19yZWFkbChTMzJLX0NSKTsgICAgICAgICAgICAgLyogc3RhcnQgdGltZSBpbiAyMCBjeWNsZXMqLworICAgICAgICB3aGlsZShfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsgICAgICAgICAgIC8qIGRlYWQgbG9vcCB0aWxsIHN0YXJ0IHRpbWUgKi8KKyAgICAgICAgY3N0YXJ0ID0gX19yYXdfcmVhZGwoR1BUX0NUUik7ICAgICAgICAgICAgICAgICAvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworICAgICAgICB3aGlsZShfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCsyMCkpOyAgICAgIC8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworICAgICAgICBjZW5kID0gX19yYXdfcmVhZGwoR1BUX0NUUik7ICAgICAgICAgICAgICAgICAgIC8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworICAgICAgICBjZGlmZiA9IGNlbmQgLSBjc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBlbGFwc2VkIHRpY2tzICovCisgICAgICAgIC8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKyAgICAgICAgaWYoY2RpZmYgPiAoMTkwMDAgPj4gKnNoaWZ0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4oUzM4XzRNKTsKKyAgICAgICAgZWxzZSBpZiAoY2RpZmYgPiAoMTUyMDAgPj4gKnNoaWZ0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4oUzI2TSk7CisgICAgICAgIGVsc2UgaWYgKGNkaWZmID4gKDEzMDAwID4+ICpzaGlmdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuKFMyNE0pOworICAgICAgICBlbHNlIGlmIChjZGlmZiA+ICg5MDAwID4+ICpzaGlmdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuKFMxOV8yTSk7CisgICAgICAgIGVsc2UgaWYgKGNkaWZmID4gKDc2MDAgPj4gKnNoaWZ0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4oUzEzTSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4oUzEyTSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHByY21faW5pdCgpIC0gaW5pdHMgY2xvY2tzIGZvciBQUkNNIGFzIGRlZmluZWQgaW4gY2xvY2tzLmggKGNvbmZpZyBJSSBkZWZhdWx0KS4KKyAqICAgLS0gY2FsbGVkIGZyb20gU1JBTQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3ByY21faW5pdCgpCit7CisJdTMyIGRpdiwgc3BlZWQsIHZhbCwgZGl2X2J5XzI7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUkNNX0NMS1NSQ19DVFJMKSAmIH4oQklUMSB8IEJJVDApOworI2lmIGRlZmluZWQoT01BUDI0MzBfU1FVQVJFX0NMT0NLX0lOUFVUKQorCV9fcmF3X3dyaXRlbCh2YWwsIFBSQ01fQ0xLU1JDX0NUUkwpOworI2Vsc2UKKwlfX3Jhd193cml0ZWwoKHZhbCB8IEJJVDApLCBQUkNNX0NMS1NSQ19DVFJMKTsKKyNlbmRpZgorCXNwZWVkID0gZ2V0X29zY19jbGtfc3BlZWQoJmRpdl9ieV8yKTsKKyAgICAgICAgaWYoKHNwZWVkID4gUzE5XzJNKSAmJiAoIWRpdl9ieV8yKSl7IC8qIGlmIGZhc3QgJiYgLzIgb2ZmLCBlbmFibGUgaXQgKi8KKyAgICAgICAgICAgICAgICB2YWwgPSB+KEJJVDZ8QklUNykgJiBfX3Jhd19yZWFkbChQUkNNX0NMS1NSQ19DVFJMKTsKKyAgICAgICAgICAgICAgICB2YWwgfD0gKDB4MiA8PCA2KTsgLyogZGl2aWRlIGJ5IDIgaWYgKDI0LDI2LDM4LjQpIC0+ICgxMi8xMy8xOS4yKSAgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwodmFsLCBQUkNNX0NMS1NSQ19DVFJMKTsKKyAgICAgICAgfQorCisJX19yYXdfd3JpdGVsKDAsIENNX0ZDTEtFTjFfQ09SRSk7CS8qIHN0b3AgYWxsIGNsb2NrcyB0byByZWR1Y2UgcmluZ2luZyAqLworCV9fcmF3X3dyaXRlbCgwLCBDTV9GQ0xLRU4yX0NPUkUpOwkvKiBtYXkgbm90IGJlIG5lY2Vzc2FyeSAqLworCV9fcmF3X3dyaXRlbCgwLCBDTV9JQ0xLRU4xX0NPUkUpOworCV9fcmF3X3dyaXRlbCgwLCBDTV9JQ0xLRU4yX0NPUkUpOworCisJLypEUExMIGludG8gbG93IHBvd2VyIGJ5cGFzcyAob3RoZXJzIG9mZikgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMSwgQ01fQ0xLRU5fUExMKTsKKworCV9fcmF3X3dyaXRlbChEUExMX09VVCwgQ01fQ0xLU0VMMl9QTEwpOyAvKiBzZXQgRFBMTCBvdXQgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKE1QVV9ESVYsIENNX0NMS1NFTF9NUFUpOyAgIC8qIHNldCBNUFUgZGl2aWRlciAqLworICAgICAgICBfX3Jhd193cml0ZWwoRFNQX0RJViwgQ01fQ0xLU0VMX0RTUCk7ICAgLyogc2V0IGRzcCBhbmQgaXZhIGRpdmlkZXJzICovCisgICAgICAgIF9fcmF3X3dyaXRlbChHRlhfRElWLCBDTV9DTEtTRUxfR0ZYKTsgICAvKiBzZXQgZ2Z4IGRpdmlkZXJzICovCisgICAgICAgIF9fcmF3X3dyaXRlbChNRE1fRElWLCBDTV9DTEtTRUxfTURNKTsgICAvKiBzZXQgbWRtIGRpdmlkZXJzICovCisKKwlkaXYgPSBCVVNfRElWOworCV9fcmF3X3dyaXRlbChkaXYsIENNX0NMS1NFTDFfQ09SRSk7Lyogc2V0IEwzL0w0L1VTQi9EaXNwbGF5L1NTaSBkaXZpZGVycyAqLworCWRlbGF5KDEwMDApOworCisJLyoxM01IeiBhcGxsIHNyYywgUFJDTSAneCcgRFBMTCByYXRlICovCisJX19yYXdfd3JpdGVsKERQTExfVkFMLCBDTV9DTEtTRUwxX1BMTCk7CisKKwkvKlZhbGlkIHRoZSBjb25maWd1cmF0aW9uICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDEsIFBSQ01fQ0xLQ0ZHX0NUUkwpOworCWRlbGF5KDEwMDApOworCisJLyogc2V0IHVwIEFQTExTX0NMS0lOIHBlciBjcnlzdGFsICovCisJaWYgKHNwZWVkID4gUzE5XzJNKQorICAgICAgICAgICAgICAgIHNwZWVkID4+PSAxOyAgICAvKiBpZiBmYXN0IHNoaWZ0IHRvIC8yIHJhbmdlICovCisgICAgICAgIHZhbCA9ICgweDIgPDwgMjMpOyAgICAgIC8qIGRlZmF1bHQgdG8gMTNNaHogZm9yIDI0MzBjICovCisgICAgICAgIGlmIChzcGVlZCA9PSBTMTJNKQorICAgICAgICAgICAgICAgIHZhbCA9ICgweDMgPDwgMjMpOworICAgICAgICBlbHNlIGlmIChzcGVlZCA9PSBTMTlfMk0pCisgICAgICAgICAgICAgICAgdmFsID0gKDB4MCA8PCAyMyk7CisgICAgICAgIHZhbCB8PSAofihCSVQyM3xCSVQyNHxCSVQyNSkgJiBfX3Jhd19yZWFkbChDTV9DTEtTRUwxX1BMTCkpOworICAgICAgICBfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUwxX1BMTCk7CisKKyAgICAgICAgX19yYXdfd3JpdGVsKERQTExfTE9DS3xBUExMX0xPQ0ssIENNX0NMS0VOX1BMTCk7ICAgLyogZW5hYmxlIGFwbGwgKi8KKyAgICAgICAgd2FpdF9vbl92YWx1ZShCSVQ4LCBCSVQ4LCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Lyogd2FpdCBmb3IgYXBsbCBsb2NrICovCisKKyAgICAgICAgZGVsYXkoMjAwMDAwKTsKK30KKwordm9pZCBTRUNfZ2VuZXJpYyh2b2lkKQoreworLyogUGVybWlzc2lvbiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAtRnVsbCBmbGVkZ2VkIHBlcm1pc3Npb25zIHRvIGFsbCAqLworI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKyNkZWZpbmUgVU5MT0NLXzMgMHgwMDAwRkZGRgorCS8qIFByb3RlY3Rpb24gTW9kdWxlIFJlZ2lzdGVyIFRhcmdldCBBUEUgKFBNX1JUKSovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSArIDB4NjgpOyAvKiBSRVFfSU5GT19QRVJNSVNTSU9OXzEgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSArIDB4NTApOyAgLyogUkVBRF9QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSArIDB4NTgpOyAgLyogV1JJVEVfUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUE1fUlRfQVBFX0JBU0VfQUREUl9BUk0gKyAweDYwKTsgLyogQUREUl9NQVRDSF8xIEwqLworCisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX0dQTUNfQkFTRV9BRERSX0FSTSArIDB4NDgpOyAvKiBSRVFfSU5GT19QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9HUE1DX0JBU0VfQUREUl9BUk0gKyAweDUwKTsgLyogUkVBRF9QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9HUE1DX0JBU0VfQUREUl9BUk0gKyAweDU4KTsgLyogV1JJVEVfUEVSTUlTU0lPTl8wIEwqLworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0gKyAweDQ4KTsgLyogUkVRX0lORk9fUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNICsgMHg1MCk7IC8qIFJFQURfUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNICsgMHg1OCk7IC8qIFdSSVRFX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIFBNX09DTV9SQU1fQkFTRV9BRERSX0FSTSArIDB4ODApOyAgLyogQUREUl9NQVRDSF8yIEwqLworCisJLyogSVZBIENoYW5nZXMgKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4NDgpOyAvKiBSRVFfSU5GT19QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDUwKTsgLyogUkVBRF9QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDU4KTsgLyogV1JJVEVfUEVSTUlTU0lPTl8wIEwqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRyeV91bmxvY2tfc3JhbSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKworICAgICAgICAvKiBpZiBHUCBkZXZpY2UgdW5sb2NrIGRldmljZSBTUkFNIGZvciBnZW5lcmFsIHVzZSAqLworICAgICAgICBtb2RlID0gZ2V0X2RldmljZV90eXBlKCk7CisKKyAgICAgICAgaWYgKChtb2RlID09IEdQX0RFVklDRSkgfHwgKG1vZGUgPT0gSFNfREVWSUNFKSB8fCAobW9kZSA9PSBFTVVfREVWSUNFKQorICAgICAgICAgICAgfHwgKG1vZGUgPT0gVFNUX0RFVklDRSkpIHsKKyAgICAgICAgICAgICAgICAvKiBTZWN1cmUgb3IgRW11bGF0aW9uIGRldmljZSAtIEhTL0UvVCAqLworICAgICAgICAgICAgICAgIFNFQ19nZW5lcmljKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc19pbml0CisgKiBEZXNjcmlwdGlvbjogRG9lcyBlYXJseSBzeXN0ZW0gaW5pdCBvZiBtdXhpbmcgYW5kIGNsb2Nrcy4KKyAqIC0gQ2FsbGVkIGF0IHRpbWUgd2hlbiBvbmx5IHN0YWNrIGlzIGF2YWlsYWJsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgc19pbml0KGludCBza2lwKQoreworICAgICAgICB1MzIgICByZXY7CisKKyAgICAgICAgcmV2ID0gZ2V0X2NwdV9yZXYoKTsKKworICAgICAgICB3YXRjaGRvZ19pbml0KCk7CisJdHJ5X3VubG9ja19zcmFtKCk7ICAgCisgICAgICAgIG11eFNldHVwQWxsKCk7CisgICAgICAgIGRlbGF5KDEwMCk7CisJcHJjbV9pbml0KCk7CisKKyNpZmRlZiBDRkdfU0RSQU1fRERSCisgICAgICAgIGNvbmZpZ19zZHJhbV9kZHIocmV2KTsKKyNlbGlmIGRlZmluZWQoQ0ZHX1NEUkFNX0NPTUJPKQorICAgICAgICBjb25maWdfc2RyYW1fY29tYm8ocmV2KTsKKyNlbGlmIGRlZmluZWQoQ0ZHXzI0MzBTRFJBTV9ERFIpCisgICAgICAgIGNvbmZpZ18yNDMwc2RyYW1fZGRyKHJldik7CisjZWxpZiBkZWZpbmVkKENGR19TRFJBTV9TVEFDS0VEKQorICAgICAgICBjb25maWdfc2RyYW1fc3RhY2tlZChyZXYpOworI2Vsc2UKKyNlcnJvciBTRFJBTSB0eXBlIG5vdCBzdXBwb3J0ZWQKKyNlbmRpZgorCisgICAgICAgIGRlbGF5KDIwMDAwKTsKKyAgICAgICAgcGVyaXBoZXJhbF9lbmFibGUoKTsKKyAgICAgICAgcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbWlzY19pbml0X3IKKyAqIERlc2NyaXB0aW9uOiBJbml0IGV0aGVybmV0IChkb25lIGhlcmUgc28gdWRlbGF5IHdvcmtzKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworI2RlZmluZSBHUCAoQklUOHxCSVQ5KQorCisJLyogVGhlcmUgYXJlIDQgd2F0Y2ggZG9ncy4gIDEgc2VjdXJlLCBhbmQgMyBnZW5lcmFsIHB1cnBvc2UuCisJICogSSB3b3VsZCBleHBlY3QgdGhhdCB0aGUgUk9NIHRha2VzIGNhcmUgb2YgdGhlIHNlY3VyZSBvbmUsCisJICogYnV0IHdlIHdpbGwgdHJ5IGFsc28uICBPZiB0aGUgMyBHUCBvbmVzLCAxIGNhbiByZXNldCB1cworCSAqIGRpcmVjdGx5LCB0aGUgb3RoZXIgMiBvbmx5IGdlbmVyYXRlIE1QVSBpbnRlcnJ1cHRzLgorCSAqLworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxICxXRDJfQkFTRStXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiAsV0QyX0JBU0UrV1NQUik7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZStXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZHJhbV9pbml0CisgKiBEZXNjcmlwdGlvbjogc2V0cyB1Ym9vdHMgaWRlYSBvZiBzZHJhbSBzaXplCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkcmFtX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBlcmlwaGVyYWxfZW5hYmxlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHYsIGlmX2Nsa3M9MCwgaWZfY2xrczIgPSAwLCBmdW5jX2Nsa3M9MCwgZnVuY19jbGtzMiA9IDA7CisKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiovCisJaWZfY2xrcyB8PSBCSVQ0OworCWZ1bmNfY2xrcyB8PSBCSVQ0OworCXYgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUwyX0NPUkUpIHwgMHg0OwkvKiBTeXNfY2xrIGlucHV0IE9NQVAyNFhYX0dQVDIgKi8KKwlfX3Jhd193cml0ZWwodiwgQ01fQ0xLU0VMMl9DT1JFKTsKKwlfX3Jhd193cml0ZWwoMHgxLCBDTV9DTEtTRUxfV0tVUCk7CisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9jayAqLworCWZ1bmNfY2xrcyB8PSBCSVQyMTsKKwlpZl9jbGtzIHw9IEJJVDIxOworI2VuZGlmCisJdiA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTjFfQ09SRSkgfCBpZl9jbGtzOwkvKiBJbnRlcmZhY2UgY2xvY2tzIG9uICovCisJX19yYXdfd3JpdGVsKHYsQ01fSUNMS0VOMV9DT1JFICk7CisJdiA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTjJfQ09SRSkgfCBpZl9jbGtzMjsgICAgLyogSW50ZXJmYWNlIGNsb2NrcyBvbiAqLworICAgICAgICBfX3Jhd193cml0ZWwodiwgQ01fSUNMS0VOMl9DT1JFKTsKKwl2ID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOMV9DT1JFKSB8IGZ1bmNfY2xrczsgLyogRnVuY3Rpb25hbCBDbG9ja3Mgb24gKi8KKwlfX3Jhd193cml0ZWwodiwgQ01fRkNMS0VOMV9DT1JFKTsKKwl2ID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOMl9DT1JFKSB8IGZ1bmNfY2xrczI7ICAvKiBGdW5jdGlvbmFsIENsb2NrcyBvbiAqLworICAgICAgICBfX3Jhd193cml0ZWwodiwgQ01fRkNMS0VOMl9DT1JFKTsKKwlkZWxheSgxMDAwKTsKKworfQorCisvKiBEbyBwaW4gbXV4aW5nIGZvciBhbGwgdGhlIGRldmljZXMgdXNlZCBpbiBYLUxvYWRlciAqLworI2RlZmluZSBNVVhfVkFMKE9GRlNFVCxWQUxVRSlcCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGViKFZBTFVFLCBPTUFQMjRYWF9DVFJMX0JBU0UgKyBPRkZTRVQpOworc3RhdGljIHZvaWQgbXV4U2V0dXBBbGwodm9pZCkKK3sKKwkvKiBVQVJUIDEqLworCU1VWF9WQUwoMHgwMEIxLCAweDFCKSAgICAgICAgLyogdWFydDFfY3RzLSBFTiwgSEksIDMsIC0+Z3Bpb18zMiAqLworCU1VWF9WQUwoMHgwMEIyLCAweDFCKSAgICAgICAgLyogdWFydDFfcnRzLSBFTiwgSEksIDMsIC0+Z3Bpb184ICovCisJTVVYX1ZBTCgweDAwQjMsIDB4MUIpICAgICAgICAvKiB1YXJ0MV90eC0gRU4sIEhJLCAzLCAtPmdwaW9fOSAqLworCU1VWF9WQUwoMHgwMEI0LCAweDFCKSAgICAgICAgLyogdWFydDFfcngtIEVOLCBISSwgMywgLT5ncGlvXzEwICovCisJTVVYX1ZBTCgweDAxMDcsIDB4MDEpICAgICAgICAvKiBzc2kxX2RhdF90eC0gRGlzLCAxLCAtPnVhcnQxX3R4ICovCisJTVVYX1ZBTCgweDAxMDgsIDB4MDEpICAgICAgICAvKiBzc2kxX2ZsYWdfdHgtIERpcywgMSwgLT51YXJ0MV9ydHMgKi8KKwlNVVhfVkFMKDB4MDEwOSwgMHgwMSkgICAgICAgIC8qIHNzaTFfcmR5X3R4LSBEaXMsIDEsIC0+dWFydDFfY3RzICovCisJTVVYX1ZBTCgweDAxMEEsIDB4MDEpICAgICAgICAvKiBzc2kxX2RhdF9yeC0gRGlzLCAxLCAtPnVhcnQxX3J4ICovCisKKwkvKiBNdXggc2V0dGluZ3MgZm9yIFNEUkMgKi8KKwlNVVhfVkFMKDB4MDA1NCwgMHgxQikgICAgICAgIC8qIHNkcmNfYTE0IC0gRU4sIEhJLCAzLCAtPmdwaW9fMCAqLworCU1VWF9WQUwoMHgwMDU1LCAweDFCKSAgICAgICAgLyogc2RyY19hMTMgLSBFTiwgSEksIDMsIC0+Z3Bpb18xICovCisJTVVYX1ZBTCgweDAwNTYsIDB4MDApICAgICAgICAvKiBzZHJjX2ExMiAtIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDQ2LCAweDAwKSAgICAgICAgLyogc2RyY19uY3MxIC0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwNDgsIDB4MDApICAgICAgICAvKiBzZHJjX2NrZTEgLSBEaXMsIDAgKi8KKwkvKiBHUE1DICovCisJTVVYX1ZBTCgweDAwMzAsIDB4MDApICAgICAgICAvKiBncG1jX2NsayAtIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDMyLCAweDAwKSAgICAgICAgLyogZ3BtY19uY3MxLSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDAzMywgMHgwMCkgICAgICAgIC8qIGdwbWNfbmNzMi0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwMzQsIDB4MDMpICAgICAgICAvKiBncG1jX25jczMtIERpcywgMywgLT5ncGlvXzI0ICovCisJTVVYX1ZBTCgweDAwMzUsIDB4MDMpICAgICAgICAvKiBncG1jX25jczQtIERpcywgMywgLT5ncGlvXzI1ICovCisJTVVYX1ZBTCgweDAwMzYsIDB4MDApICAgICAgICAvKiBncG1jX25jczUtIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDM3LCAweDAzKSAgICAgICAgLyogZ3BtY19uY3M2LSBEaXMsIDMsIC0+Z3Bpb18yNyAqLworCU1VWF9WQUwoMHgwMDM4LCAweDAwKSAgICAgICAgLyogZ3BtY19uY3M3LSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDA0MCwgMHgxOCkgICAgICAgIC8qIGdwbWNfd2FpdDEtIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDQxLCAweDE4KSAgICAgICAgLyogZ3BtY193YWl0Mi0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwNDIsIDB4MUIpICAgICAgICAvKiBncG1jX3dhaXQzLSBFTiwgSEksIDMsIC0+Z3Bpb18zNSAqLworCU1VWF9WQUwoMHgwMDg1LCAweDFCKSAgICAgICAgLyogZ3BtY19hMTAtIEVOLCBISSwgMywgLT5ncGlvXzMgKi8KK30KKworaW50IG5hbmRfaW5pdCh2b2lkKQoreworCXUzMglyZXY7CisKKwkvKiBHUE1DIENvbmZpZ3VyYXRpb24gKi8KKwlyZXYgID0gZ2V0X2NwdV9yZXYoKTsKKworCS8qIGdsb2JhbCBzZXR0aW5ncyAqLworCV9fcmF3X3dyaXRlbCgweDEwLCBHUE1DX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBHUE1DX0lSUUVOQUJMRSk7CS8qIGlzcidzIHNvdXJjZXMgbWFza2VkICovCisJX19yYXdfd3JpdGVsKDAsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsvKiB0aW1lb3V0IGRpc2FibGUgKi8KKyNpZmRlZiBDRkdfTkFORAorCV9fcmF3X3dyaXRlbCgweDAwMSwgR1BNQ19DT05GSUcpOwkvKiBzZXQgbldQLCBkaXNhYmxlIGxpbWl0ZWQgYWRkciAqLworI2VuZGlmCisKKwkvKiBTZXQgdGhlIEdQTUMgVmFscyAuIEZvciBOQU5EIGJvb3Qgb24gMjQzMFNEUCwgTkFORCBpcyBtYXBwZWQgYXQgQ1MwCisgICAgICAgICAqICAsIE5PUiBhdCBDUzEgYW5kIE1QREIgYXQgQ1M1LiBBbmQgb25lTkFORCBib290LCB3ZSBtYXAgb25lTkFORCBhdCBDUzAuCisJICogIFdlIGNvbmZpZ3VyZSBvbmx5IEdQTUMgQ1MwIHdpdGggcmVxdWlyZWQgdmFsdWVzLiBDb25maWdpcmluZyBvdGhlciBkZXZpY2VzIAorCSAqICBhdCBvdGhlciBDUyBpbiBkb25lIGluIHUtYm9vdCBhbnl3YXkuIFNvIHdlIGRvbid0IGhhdmUgdG8gYm90aGVyIGRvaW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCV9fcmF3X3dyaXRlbCgwLCBHUE1DX0NPTkZJRzdfMCk7CisJc2RlbGF5KDEwMDApOworCisjaWZkZWYgQ0ZHX05BTkQKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMV8wKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMl8wKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHM18wKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNF8wKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNV8wKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNl8wKTsKKworI2Vsc2UgLyogQ0ZHX09ORU5BTkQgKi8KKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzFfMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMiwgR1BNQ19DT05GSUcyXzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHM18wKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzRfMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNSwgR1BNQ19DT05GSUc1XzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNl8wKTsKKyNlbmRpZgorCisJLyogRW5hYmxlIHRoZSBHUE1DIE1hcHBpbmcgKi8KKwlfX3Jhd193cml0ZWwoKCAoKE9NQVAyNFhYX0dQTUNfQ1MwX1NJWkUgJiAweEYpPDw4KSB8CisJCSAgICAgKChPTUFQMjRYWF9HUE1DX0NTMF9NQVA+PjI0KSAmIDB4M0YpIHwKKwkJICAgICAoMTw8NikgKSwgR1BNQ19DT05GSUc3XzApOworCXNkZWxheSgyMDAwKTsKKyNpZmRlZiBDRkdfTkFORAorIAlpZiAobmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKwkJcHJpbnRmKCJVbnN1cHBvcnRlZCBDaGlwIVxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorI2Vsc2UKKwlpZiAob25lbmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKwkJcHJpbnRmKCJPbmVOQU5EIFVuc3VwcG9ydGVkICFcbiIpOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qIG9wdGlvbmFsbHkgZG8gc29tZXRoaW5nIGxpa2UgYmxpbmtpbmcgTEVEICovCit2b2lkIGJvYXJkX2hhbmcgKHZvaWQpCit7IHdoaWxlICgwKSB7fTt9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjIxZDdlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNQorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMjQzMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8gCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gUFJDTV9DTEtDRkdfQ1RSTCAtIGFkZHIgb2YgdmFsaWQgcmVnCisgKiAgUjEgPSBDTV9DTEtFTl9QTEwgLSBhZGRyIGRwbGwgY3RsciByZWcKKyAqICBSMiA9IGRwbGwgdmFsdWUKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAorLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdWIgICAgIHNwLCBzcCwgIzB4NCAvKiBnZXQgc29tZSBzdGFjayBzcGFjZSAqLworICAgICAgICBzdHIgICAgIHI0LCBbc3BdICAgICAvKiBzYXZlIHI0J3MgdmFsdWUgKi8KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjgsIHBsbF9jdGxfYWRkCisgICAgICAgIG1vdiAgICAgcjQsICMweDIKKyAgICAgICAgc3RyICAgICByNCwgW3I4XQorICAgICAgICBsZHIgICAgIHI0LCBwbGxfc3RhdAorYmxvY2s6CisgICAgICAgIGxkciAgICAgcjgsIFtyNF0JLyogd2FpdCBmb3IgYnlwYXNzIHRvIHRha2UgZWZmZWN0ICovCisgICAgICAgIGFuZCAgICAgcjgsIHI4LCAjMHgzCisgICAgICAgIGNtcCAgICAgcjgsICMweDEKKyAgICAgICAgYm5lICAgICBibG9jaworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNCwgcGxsX2Rpdl9hZGQKKwlsZHIgICAgIHI4LCBwbGxfZGl2X3ZhbAorICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisgICAgCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNCwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjgsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKyAgICAgICAgbGRyICAgICByNCwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjgsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKyAgICAgICAgbGRyICAgICByNCwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjgsIFtyNF0KKyAgICAgICAgb3JyICAgICByOCwgcjgsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisKKwkvKiBzZXR1cCB0byAyeCBsb29wIHRob3VnaCBjb2RlLiAgVGhlIGZpcnN0IGxvb3AgcHJlLWxvYWRzIHRoZSAKKyAgICAgICAgICogaWNhY2hlLCB0aGUgMm5kIGNvbW1pdHMgdGhlIHByY20gY29uZmlnLCBhbmQgbG9ja3MgdGhlIGRwbGwKKyAgICAgICAgICovCisgICAgICAgIG1vdiAgICAgcjQsICMweDEwMDAgICAgICAvKiBzcGluIHNwaW4gc3BpbiAqLworICAgICAgICBtb3YgICAgIHI4LCAjMHg0ICAgICAgICAgLyogZmlyc3QgcGFzcyBjb25kaXRpb24gJiBzZXQgcmVnaXN0ZXJzICovCisgICAgICAgIGNtcCAgICAgcjgsICMweDQKKzI6CisgICAgICAgIGxkcm5lICAgcjgsIFtyM10gICAgICAgICAvKiBEUExMIGxvY2sgY2hlY2sgKi8KKyAgICAgICAgYW5kICAgICByOCwgcjgsICMweDcKKyAgICAgICAgY21wICAgICByOCwgIzB4MgorICAgICAgICBiZXEgICAgIDRmCiszOgorICAgICAgICBzdWJlcSAgIHI4LCByOCwgIzB4MQorICAgICAgICBzdHJlcSAgIHI4LCBbcjBdICAgICAgICAgLyogY29tbWl0IGRpdmlkZXJzICgybmQgdGltZSkgKi8KKyAgICAgICAgbm9wCitsbG9vcDE6CisgICAgICAgIHN1YiAgICAgcjQsIHI0LCAjMHgxICAgIC8qIExvb3AgY3VycmVudGx5IG5lY2Vzc2FyeSBlbHNlIGJhZCBqdW1wcyAqLworICAgICAgICBub3AKKyAgICAgICAgY21wICAgICByNCwgIzB4MAorICAgICAgICBibmUgICAgIGxsb29wMQorICAgICAgICBtb3YgICAgIHI0LCAjMHg0MDAwMAorICAgICAgICBjbXAgICAgIHI4LCAjMHgxCisgICAgICAgIG5vcAorICAgICAgICBzdHJlcSAgIHIyLCBbcjFdICAgICAgICAvKiBsb2NrIGRwbGwgKDJuZCB0aW1lKSAqLworICAgICAgICBub3AKK2xsb29wMjoKKyAgICAgICAgc3ViICAgICByNCwgcjQsICMweDEgICAgLyogbG9vcCBjdXJyZW50bHkgbmVjZXNzYXJ5IGVsc2UgYmFkIGp1bXBzICovCisgICAgICAgIG5vcAorICAgICAgICBjbXAgICAgIHI0LCAjMHgwCisgICAgICAgIGJuZSAgICAgbGxvb3AyCisgICAgICAgIG1vdiAgICAgcjQsICMweDQwMDAwCisgICAgICAgIGNtcCAgICAgcjgsICMweDEKKyAgICAgICAgbm9wCisgICAgICAgIGxkcmVxICAgcjgsIFtyM10gICAgICAgICAvKiBnZXQgbG9jayBjb25kaXRpb24gZm9yIGRwbGwgKi8KKyAgICAgICAgY21wICAgICByOCwgIzB4NCAgICAgICAgIC8qIGZpcnN0IHRpbWUgdGhvdWdoPyAqLworICAgICAgICBibmUgICAgIDJiCisgICAgICAgIG1vdmVxICAgcjgsICMweDIgICAgICAgICAvKiBzZXQgdG8gZHBsbCBjaGVjayBjb25kaXRpb24uICovCisgICAgICAgIGJlcSAgICAgM2IgICAgICAgICAgICAgICAvKiBpZiBjb25kaXRpb24gbm90IHRydWUgYnJhbmNoICovCis0OiAgCisgICAgICAgIGxkciAgICAgcjQsIFtzcF0KKyAgICAgICAgYWRkICAgICBzcCwgc3AsICMweDQgICAgIC8qIHJldHVybiBzdGFjayBzcGFjZSAqLworICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLyAgICAgICAgCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisjaWZkZWYgQ0ZHX09ORU5BTkQKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCBHUE1DX0NPTkZJRzNfMCAKK2ZsYXNoX2NmZzNfdmFsOiAKKyAgICAud29yZCAgT05FTkFORF9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCBHUE1DX0NPTkZJRzRfMAorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIE9ORU5BTkRfR1BNQ19DT05GSUc0CitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgR1BNQ19DT05GSUcxXzAKKyNlbHNlCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgR1BNQ19DT05GSUczXzAgCitmbGFzaF9jZmczX3ZhbDogCisgICAgLndvcmQgIFNNTkFORF9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCBHUE1DX0NPTkZJRzRfMAorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNNTkFORF9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCBHUE1DX0NPTkZJRzFfMAorI2VuZGlmCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9zdGF0OgorICAgIC53b3JkIENNX0lETEVTVF9DS0dFTgorcGxsX2Rpdl9hZGQ6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwgCitwbGxfZGl2X3ZhbDoKKyAgICAud29yZCBEUExMX1ZBTAkvKiBEUExMIHNldHRpbmcgKDMwME1IeiBkZWZhdWx0KSAqLworCisuZ2xvYmwgcGxhdGZvcm1zZXR1cAorcGxhdGZvcm1zZXR1cDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogbWFwIGludGVycnVwdCBjb250cm9sbGVyICovCisJbGRyCXIwLAlWQUxfSU5USF9TRVRVUAorCW1jcglwMTUsIDAsIHIwLCBjMTUsIGMyLCA0CisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworVkFMX0lOVEhfU0VUVVA6CisJLndvcmQgUEVSSUZFUkFMX1BPUlRfQkFTRQorU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC94LWxvYWQubGRzIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTJlOGY4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAveC1sb2FkLmxkcwpAQCAtMCwwICsxLDU0IEBACisvKgorICogSmFudWFyeSAyMDA0IC0gQ2hhbmdlZCB0byBzdXBwb3J0IEg0IGRldmljZSAKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFRleGFzIEluc3RydW1lbnRzIAorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L2FybTExMzYvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3OGI4YTMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gb21hcDM0MzBzZHAubworU09CSlMJOj0gcGxhdGZvcm0ubworCiskKExJQik6CSQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDZhZDZjNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjIgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgU0RQMzQzMCBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzCisjCisjIFNEUDM0MzAgaGFzIDEgYmFuayBvZiAzMk1CIG9yIDEyOE1CIG1ERFItU0RSQU0gb24gQ1MwCisjIFNEUDM0MzAgaGFzIDEgYmFuayBvZiAzMk1CIG9yIDAwTUIgbUREUi1TRFJBTSBvbiBDUzEKKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIChiYW5rMCkKKyMgQTAwMCcwMDAwIChiYW5rMSkgLSByZS1tYXBwYWJsZSBiZWxvdyBDUzEKKworIyBGb3IgdXNlIGlmIHlvdSB3YW50IFgtTG9hZGVyIHRvIHJlbG9jYXRlIGZyb20gU1JBTSB0byBERFIKKyNURVhUX0JBU0UgPSAweDgwZTgwMDAwCisKKyMgRm9yIFhJUCBpbiA2NEsgb2YgU1JBTSBvciBkZWJ1ZyAoR1AgZGV2aWNlIGhhcyBpdCBhbGwgYXZhaWxhYmUpCisjIFNSQU0gNDAyMDAwMDAtNDAyMEZGRkYgYmFzZQorIyBpbml0aWFsIHN0YWNrIGF0IDB4NDAyMGZmZmMgdXNlZCBpbiBzX2luaXQgKGJlbG93IHhsb2FkZXIpLgorIyBUaGUgcnVuIHRpbWUgc3RhY2sgaXMgKGFib3ZlIHhsb2FkZXIsIDJrIGJlbG93KQorIyBJZiBhbnkgZ2xvYmFscyBleGlzdCB0aGVyZSBuZWVkcyB0byBiZSByb29tIGZvciB0aGVtIGFsc28KK1RFWFRfQkFTRSA9IDB4NDAyMDg4MDAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3Ivb21hcDM0MzBzZHAuYyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3Ivb21hcDM0MzBzZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZjlmZWRiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9vbWFwMzQzMHNkcC5jCkBAIC0wLDAgKzEsNzQ0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2LTIwMDgKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworc3RydWN0IGRwbGxfcGFyYW0geworICAgICAgICB1bnNpZ25lZCBpbnQgbTsKKyAgICAgICAgdW5zaWduZWQgaW50IG47CisgICAgICAgIHVuc2lnbmVkIGludCBmc2VsOworICAgICAgICB1bnNpZ25lZCBpbnQgbTI7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcGxsX3BhcmFtIGRwbGxfcGFyYW07CisKKyNkZWZpbmUgTUFYX1NJTF9JTkRFWAkzCisKKy8qIEZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGZyb20gbG93bGV2ZWxfaW5pdC5TICovCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkZWxheQorICogRGVzY3JpcHRpb246IHNwaW5uaW5nIGRlbGF5IHRvIHVzZSBiZWZvcmUgdWRlbGF5IHdvcmtzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIihsb29wcykpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGJvYXJkX2luaXQKKyAqIERlc2NyaXB0aW9uOiBFYXJseSBoYXJkd2FyZSBpbml0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGJvYXJkX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZ2V0X2RldmljZV90eXBlKCk6IHRlbGwgaWYgR1AvSFMvRU1VL1RTVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2RldmljZV90eXBlKHZvaWQpCit7CisgICAgICAgIGludCBtb2RlOworICAgICAgICBtb2RlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpICYgKERFVklDRV9NQVNLKTsKKyAgICAgICAgcmV0dXJuKG1vZGUgPj49IDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9jcHVfcmV2KHZvaWQpCit7CisJdTMyIGNwdWlkPTA7CisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisJaWYoKGNwdWlkICAmIDB4ZikgPT0gMHgwKQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMxOworCWVsc2UKKwkJcmV0dXJuIENQVV8zNDMwX0VTMjsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBjcHVfaXNfMzQxMCh2b2lkKQoreworCWludCBzdGF0dXM7CisJaWYoZ2V0X2NwdV9yZXYoKSA8IENQVV8zNDMwX0VTMikgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiByZWFkIHNjYWxhYmlsaXR5IHN0YXR1cyBhbmQgcmV0dXJuIDEgZm9yIDM0MTAqLworCQlzdGF0dXMgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NDQUxBQkxFX09NQVBfU1RBVFVTKTsKKwkJLyogQ2hlY2sgd2hldGhlciBNUFUgZnJlcXVlbmN5IGlzIHNldCB0byAyNjYgTUh6IHdoaWNoCisJCSAqIGlzIG5vbWluYWwgZm9yIDM0MTAuIElmIHllcyByZXR1cm4gdHJ1ZSBlbHNlIGZhbHNlCisJCSAqLworCQlpZiAoKChzdGF0dXMgPj4gOCkgJiAweDMpID09IDB4MikKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3IzMiAtIGNsZWFyICYgc2V0IGEgdmFsdWUgaW4gYSBiaXQgcmFuZ2UgZm9yIGEgMzIgYml0IGFkZHJlc3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpCit7CisJdTMyIHRtcCwgbXNrID0gMDsKKwltc2sgPSAxIDw8IG51bV9iaXRzOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FpdF9vbl92YWx1ZSgpIC0gY29tbW9uIHJvdXRpbmUgdG8gYWxsb3cgd2FpdGluZyBmb3IgY2hhbmdlcyBpbgorICogICB2b2xhdGlsZSByZWdzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKyNpZmRlZiBDRkdfMzQzMFNEUkFNX0REUgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY29uZmlnXzM0MzBzZHJhbV9kZHIoKSAtIEluaXQgRERSIG9uIDM0MzBTRFAgZGV2IGJvYXJkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY29uZmlnXzM0MzBzZHJhbV9kZHIodm9pZCkKK3sKKwkvKiByZXNldCBzZHJjIGNvbnRyb2xsZXIgKi8KKwlfX3Jhd193cml0ZWwoU09GVFJFU0VULCBTRFJDX1NZU0NPTkZJRyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCBCSVQwLCBTRFJDX1NUQVRVUywgMTIwMDAwMDApOworCV9fcmF3X3dyaXRlbCgwLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKiBzZXR1cCBzZHJjIHRvIGJhbGwgbXV4ICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwkvKiBzZXQgbWRjZmcgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKworCS8qIHNldCB0aW1pbmcgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfUkZSX0NUUkwsIFNEUkNfUkZSX0NUUkwpOworCisJLyogaW5pdCBzZXF1ZW5jZSBmb3IgbUREUi9tU0RSIHVzaW5nIG1hbnVhbCBjb21tYW5kcyAoRERSIGlzIGRpZmZlcmVudCkgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJZGVsYXkoNTAwMCk7CisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCisJLyogc2V0IG1yMCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8wKTsKKworCS8qIHNldCB1cCBkbGwgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExBX0NUUkwpOworCWRlbGF5KDB4MjAwMCk7CS8qIGdpdmUgdGltZSB0byBsb2NrICovCisKK30KKyNlbmRpZiAvLyBDRkdfMzQzMFNEUkFNX0REUgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtfc3BlZWQgLSBkZXRlcm1pbmUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQKKyAqICBiYXNlZCBvbiBrbm93biAzMmtIeiBjbG9jayBhbmQgZ3B0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCS8qIElmIFNZU19DTEsgaXMgYmVpbmcgZGl2aWRlZCBieSAyLCByZW1vdmUgZm9yIG5vdyAqLworCXZhbCA9ICh2YWwgJiAofkJJVDcpKSB8IEJJVDY7CisJX19yYXdfd3JpdGVsKHZhbCwgUFJNX0NMS1NSQ19DVFJMKTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtpbl9zZWwoKSAtIHJldHVybnMgdGhlIHN5c19jbGtpbl9zZWwgZmllbGQgdmFsdWUgYmFzZWQgb24gCisgKiAgIC0tIGlucHV0IG9zY2lsbGF0b3IgY2xvY2sgZnJlcXVlbmN5LgorICogICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZ2V0X3N5c19jbGtpbl9zZWwodTMyIG9zY19jbGssIHUzMiAqc3lzX2Nsa2luX3NlbCkKK3sKKwlpZihvc2NfY2xrID09IFMzOF80TSkKKwkJKnN5c19jbGtpbl9zZWw9ICA0OworCWVsc2UgaWYob3NjX2NsayA9PSBTMjZNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDM7CisJZWxzZSBpZihvc2NfY2xrID09IFMxOV8yTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAyOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTNNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDE7CisJZWxzZSBpZihvc2NfY2xrID09IFMxMk0pCisJCSpzeXNfY2xraW5fc2VsID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHJjbV9pbml0KCkgLSBpbml0cyBjbG9ja3MgZm9yIFBSQ00gYXMgZGVmaW5lZCBpbiBjbG9ja3MuaAorICogICAtLSBjYWxsZWQgZnJvbSBTUkFNLCBvciBGbGFzaCAodXNpbmcgdGVtcCBTUkFNIHN0YWNrKS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJjbV9pbml0KHZvaWQpCit7CisJdTMyIG9zY19jbGs9MCwgc3lzX2Nsa2luX3NlbDsKKwlkcGxsX3BhcmFtICpkcGxsX3BhcmFtX3A7CisJdTMyIGNsa19pbmRleCwgc2lsX2luZGV4OworCisJLyogR2F1Z2UgdGhlIGlucHV0IGNsb2NrIHNwZWVkIGFuZCBmaW5kIG91dCB0aGUgc3lzX2Nsa2luX3NlbAorCSAqIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGNsb2NrLgorCSAqLworCW9zY19jbGsgPSBnZXRfb3NjX2Nsa19zcGVlZCgpOworCWdldF9zeXNfY2xraW5fc2VsKG9zY19jbGssICZzeXNfY2xraW5fc2VsKTsKKworCXNyMzIoUFJNX0NMS1NFTCwgMCwgMywgc3lzX2Nsa2luX3NlbCk7IC8qIHNldCBpbnB1dCBjcnlzdGFsIHNwZWVkICovCisKKwkvKiBJZiB0aGUgaW5wdXQgY2xvY2sgaXMgZ3JlYXRlciB0aGFuIDE5LjJNIGFsd2F5cyBkaXZpZGUvMiAqLworCWlmKHN5c19jbGtpbl9zZWwgPiAyKSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAyKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwvMjsKKwl9IGVsc2UgeworCQlzcjMyKFBSTV9DTEtTUkNfQ1RSTCwgNiwgMiwgMSk7LyogaW5wdXQgY2xvY2sgZGl2aWRlciAqLworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsOworCX0KKworCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCAwLCAyLCAwKTsvKiBCeXBhc3MgbW9kZTogVDIgaW5wdXRzIGEgc3F1YXJlIGNsb2NrICovCisKKwkvKiBUaGUgRFBMTCB0YWJsZXMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHN5c2NsayB2YWx1ZSBhbmQKKwkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkgKiB0aGUgdmFsdWVzIGZvciB0aGF0IGlucHV0IHN5c2NsayBmcm9tIHRoZSBEUExMIHBhcmFtIHRhYmxlCisJICogYW5kIHNpbF9pbmRleCB3aWxsIGdldCB0aGUgdmFsdWVzIGZvciB0aGF0IFN5c0NsayBmb3IgdGhlIAorCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LiAKKwkgKi8KKwlpZihjcHVfaXNfMzQxMCgpKQorCQlzaWxfaW5kZXggPSAyOworCWVsc2UgeworCQlpZihnZXRfY3B1X3JldigpID09IENQVV8zNDMwX0VTMSkKKwkJCXNpbF9pbmRleCA9IDA7CisJCWVsc2UgaWYoZ2V0X2NwdV9yZXYoKSA9PSBDUFVfMzQzMF9FUzIpCisJCQlzaWxfaW5kZXggPSAxOworCX0JCisKKwkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBNQVhfU0lMX0lOREVYKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBzcjMyKENNX0NMS1NFTDJfRU1VKSBzZXQgb3ZlcnJpZGUgdG8gd29yayB3aGVuIGFzbGVlcCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKwkJLyogRm9yIDM0MzAgRVMxLjAgRXJyYXRhIDEuNTAsIGRlZmF1bHQgdmFsdWUgZGlyZWN0bHkgZG9lc250CisJCSAgIHdvcmsuIHdyaXRlIGFub3RoZXIgdmFsdWUgYW5kIHRoZW4gZGVmYXVsdCB2YWx1ZS4gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyICsgMSk7CS8qIG0zeDIgKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsJCS8qIG0zeDIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgMiwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIFNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogU2V0IE0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBTZXQgTiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOwkJCS8qIDk2TSBTcmMgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgRVMxIG9ubHkgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgMCwgMywgR0ZYX0RJVik7CQkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgNCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsJLyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBQRVIgIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIGNsa19pbmRleDsKKwkvKiBQRVIgRFBMTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA1LCBQRVJfTTZYMik7CS8qIHNldCBNNiAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNSwgUEVSX001WDIpOwkvKiBzZXQgTTUgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDUsIFBFUl9NNFgyKTsJLyogc2V0IE00ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA1LCBQRVJfTTNYMik7CS8qIHNldCBNMyAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBzZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogc2V0IG0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBzZXQgbiAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAyMCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9tcHVfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIE1BWF9TSUxfSU5ERVgqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogU2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBTZXQgTSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBTZXQgTiAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgNCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsJLyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOyAvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9pdmFfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIE1BWF9TSUxfSU5ERVgqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCS8qIElWQSBEUExMIChzZXQgdG8gMTIqMjA9MjQwTUh6KSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBzZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBzZXQgTSAqLworICAJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBzZXQgTiAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogU2V0IHVwIEdQVGltZXJzIHRvIHN5c19jbGsgc291cmNlIG9ubHkgKi8KKyAJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCA4LCAweGZmKTsKKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAwLCAxLCAxKTsKKworCWRlbGF5KDUwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNlY3VyZV91bmxvY2sKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCBzZWN1cml0eSByZWdpc3RlcnMgZm9yIGFjY2VzcworICogKEdQIERldmljZSBvbmx5KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZWN1cmVfdW5sb2NrKHZvaWQpCit7CisJLyogUGVybWlzc2lvbiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAtRnVsbCBmbGVkZ2VkIHBlcm1pc3Npb25zIHRvIGFsbCAqLworCSNkZWZpbmUgVU5MT0NLXzEgMHhGRkZGRkZGRgorCSNkZWZpbmUgVU5MT0NLXzIgMHgwMDAwMDAwMAorCSNkZWZpbmUgVU5MT0NLXzMgMHgwMDAwRkZGRgorCS8qIFByb3RlY3Rpb24gTW9kdWxlIFJlZ2lzdGVyIFRhcmdldCBBUEUgKFBNX1JUKSovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRVFfSU5GT19QRVJNSVNTSU9OXzEpOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIFJUX0FERFJfTUFUQ0hfMSk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIE9DTV9BRERSX01BVENIXzIpOworCisJLyogSVZBIENoYW5nZXMgKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBTTVNfUkdfQVRUMCk7IC8qIFNEUkMgcmVnaW9uIDAgcHVibGljICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB0cnlfdW5sb2NrX3NyYW0oKQorICogRGVzY3JpcHRpb246IElmIGNoaXAgaXMgR1AgdHlwZSwgdW5sb2NrIHRoZSBTUkFNIGZvcgorICogIGdlbmVyYWwgdXNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0cnlfdW5sb2NrX21lbW9yeSh2b2lkKQoreworCWludCBtb2RlOworCisJLyogaWYgR1AgZGV2aWNlIHVubG9jayBkZXZpY2UgU1JBTSBmb3IgZ2VuZXJhbCB1c2UgKi8KKwkvKiBzZWN1cmUgY29kZSBicmVha3MgZm9yIFNlY3VyZS9FbXVsYXRpb24gZGV2aWNlIC0gSFMvRS9UKi8KKwltb2RlID0gZ2V0X2RldmljZV90eXBlKCk7CisJaWYgKG1vZGUgPT0gR1BfREVWSUNFKSB7CisJCXNlY3VyZV91bmxvY2soKTsKKwl9CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc19pbml0CisgKiBEZXNjcmlwdGlvbjogRG9lcyBlYXJseSBzeXN0ZW0gaW5pdCBvZiBtdXhpbmcgYW5kIGNsb2Nrcy4KKyAqIC0gQ2FsbGVkIGF0IHRpbWUgd2hlbiBvbmx5IHN0YWNrIGlzIGF2YWlsYWJsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHNfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKyNpZmRlZiBDT05GSUdfMzQzMF9BU18zNDEwCisJLyogc2V0dXAgdGhlIHNjYWxhYmlsaXR5IGNvbnRyb2wgcmVnaXN0ZXIgZm9yIAorCSAqIDM0MzAgdG8gd29yayBpbiAzNDEwIG1vZGUKKwkgKi8KKwlfX3Jhd193cml0ZWwoMHg1QUJGLENPTlRST0xfU0NBTEFCTEVfT01BUF9PQ1ApOworI2VuZGlmCisJdHJ5X3VubG9ja19tZW1vcnkoKTsKKwlzZXRfbXV4Y29uZl9yZWdzKCk7CisJZGVsYXkoMTAwKTsKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ18zNDMwc2RyYW1fZGRyKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBtaXNjX2luaXRfcgorICogRGVzY3JpcHRpb246IEluaXQgZXRoZXJuZXQgKGRvbmUgaGVyZSBzbyB1ZGVsYXkgd29ya3MpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkcmFtX2luaXQKKyAqIERlc2NyaXB0aW9uOiBzZXRzIHVib290cyBpZGVhIG9mIHNkcmFtIHNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBlcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorLy8vLyNpZmRlZiBDT05GSUdfU0VSSUFMMworCXNyMzIoQ01fRkNMS0VOX1BFUiwgMTEsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU5fUEVSLCAxMSwgMSwgMHgxKTsKKy8vLy8jZWxzZQorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworLy8vLyNlbmRpZgorI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKKy8qIFNldCBNVVggZm9yIFVBUlQsIEdQTUMsIFNEUkMsIEdQSU8gKi8KKworLyoKKyAqIElFTiAgLSBJbnB1dCBFbmFibGUKKyAqIElESVMgLSBJbnB1dCBEaXNhYmxlCisgKiBQVEQgIC0gUHVsbCB0eXBlIERvd24KKyAqIFBUVSAgLSBQdWxsIHR5cGUgVXAKKyAqIERJUyAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGluYWN0aXZlCisgKiBFTiAgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBhY3RpdmUKKyAqIE0wICAgLSBNb2RlIDAKKyAqIFRoZSBjb21tZW50ZWQgc3RyaW5nIGdpdmVzIHRoZSBmaW5hbCBtdXggY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwaW4KKyAqLworI2RlZmluZSBNVVhfREVGQVVMVCgpXAorCS8qU0RSQyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzKi9cCisJTVVYX1ZBTChDUChTRFJDX0Q0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENSovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q3KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDgpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDExKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEzKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxOCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxOSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIxKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIzKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyOCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyOSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QzMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMxKi9cCisJTVVYX1ZBTChDUChTRFJDX0NMSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfQ0xLKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMyKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMyovXAorCS8qR1BNQyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0ExKi9cCisJTVVYX1ZBTChDUChHUE1DX0EyKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTMpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNCksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E1KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTYpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E4KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTgqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTkpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMTApLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0ExMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QzKi9cCisJTVVYX1ZBTChDUChHUE1DX0Q0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENSovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q3KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDcqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDgpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0QxMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDExKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEzKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDE0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0QxNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDE1Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzApLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzEqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMiksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MyKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M0KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzQgbGFiKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkNTNSBsYWIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMSkpIC8qc3lzX25kbWFyZXExIGxhYiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M3KSwgICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0xKSkgLypHUE1DX0lPX0RJUiBsYWIqL1wKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19DTEsqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLCAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQURWX0FMRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OT0UpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05PRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV0UpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQkUwX0NMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05CRTBfQ0xFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkJFMSBsYWIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTldQKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OV1AqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDApLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19XQUlUMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQxKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQyKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKmdwbWNfbldhaXQgbGFiKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKmdwbWNfbldhaXQgbGFiKi9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkRTU19EQVRBMTgqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLCAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qRFNTX0RBVEExOSovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypEU1NfREFUQTIwKi9cCisJTVVYX1ZBTChDUChDQU1fWENMS0IpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkNBTV9YQ0xLQiovXAorCU1VWF9WQUwoQ1AoQ0FNX1dFTiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2NyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfVFgpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9UWCovXAorCU1VWF9WQUwoQ1AoVUFSVDFfUlRTKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQxX0NUUyksICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qVUFSVDFfQ1RTKi9cCisJTVVYX1ZBTChDUChVQVJUMV9SWCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JYKi9cCisJTVVYX1ZBTChDUChNQ0JTUDFfRFgpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTU4Ki9cCisJTVVYX1ZBTChDUChTWVNfMzJLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNZU18zMksqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzMgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNCAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT181ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184ICovXAorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDEpLCAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypzeXNfY2xrb3V0MiBsYWIqL1wKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qc3lzX2Nsa291dDIgbGFiKi9cCisJTVVYX1ZBTChDUChKVEFHX25UUlNUKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfblRSU1QqL1wKKwlNVVhfVkFMKENQKEpUQUdfVENLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UQ0sqL1wKKwlNVVhfVkFMKENQKEpUQUdfVE1TKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UTVMqL1wKKwlNVVhfVkFMKENQKEpUQUdfVERJKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UREkqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUwKi9cCisJTVVYX1ZBTChDUChKVEFHX0VNVTEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfRU1VMSovXAorCU1VWF9WQUwoQ1AoRVRLX0NMSyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzEyKi9cCisJTVVYX1ZBTChDUChFVEtfQ1RMKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTMqL1wKKwlNVVhfVkFMKENQKEVUS19EMCApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE1Ki9cCisJTVVYX1ZBTChDUChFVEtfRDIgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTYqL1wKKwlNVVhfVkFMKENQKEVUS19EMTApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI1Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjYqL1wKKwlNVVhfVkFMKENQKEVUS19EMTMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNyovXAorCU1VWF9WQUwoQ1AoRVRLX0QxNCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI4Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjkqL1wKKwlNVVhfVkFMKENQKFVBUlQzX0NUU19SQ1RYKSwgKElFTiAgfCBQVEQgfCBFTiAgfCBNMCkpIC8qVUFSVDNfQ1RTX1JDVFggKi9cCisJTVVYX1ZBTChDUChVQVJUM19SVFNfU0QpLCAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQzX1JUU19TRCAqL1wKKwlNVVhfVkFMKENQKFVBUlQzX1JYX0lSUlggKSwgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDNfUlhfSVJSWCovXAorCU1VWF9WQUwoQ1AoVUFSVDNfVFhfSVJUWCApLCAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUM19UWF9JUlRYKi9cCisJTVVYX1ZBTChDUChzZHJjX2NrZTApLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKnNkcmNfY2tlMCAqL1wKKwlNVVhfVkFMKENQKHNkcmNfY2tlMSksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNykpIC8qc2RyY19ja2UxIG5vdCB1c2VkKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZXRfbXV4Y29uZl9yZWdzCisgKiBEZXNjcmlwdGlvbjogU2V0dGluZyB1cCB0aGUgY29uZmlndXJhdGlvbiBNdXggcmVnaXN0ZXJzCisgKiAgICAgICAgICAgICAgc3BlY2lmaWMgdG8gdGhlIGhhcmR3YXJlLiBNYW55IHBpbnMgbmVlZAorICogICAgICAgICAgICAgIHRvIGJlIG1vdmVkIGZyb20gcHJvdGVjdCB0byBwcmltYXJ5IG1vZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJTVVYX0RFRkFVTFQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG5hbmQrX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTZXQgdXAgbmFuZCBmb3IgbmFuZCBhbmQgamZmczIgY29tbWFuZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbmFuZF9pbml0KHZvaWQpCit7CisJLyogZ2xvYmFsIHNldHRpbmdzICovCisJX19yYXdfd3JpdGVsKDB4MTAsIEdQTUNfU1lTQ09ORklHKTsJLyogc21hcnQgaWRsZSAqLworCV9fcmF3X3dyaXRlbCgweDAsIEdQTUNfSVJRRU5BQkxFKTsJLyogaXNyJ3Mgc291cmNlcyBtYXNrZWQgKi8KKwlfX3Jhd193cml0ZWwoMCwgR1BNQ19USU1FT1VUX0NPTlRST0wpOy8qIHRpbWVvdXQgZGlzYWJsZSAqLworI2lmZGVmIENGR19OQU5ECisJX19yYXdfd3JpdGVsKDB4MDAxLCBHUE1DX0NPTkZJRyk7CS8qIHNldCBuV1AsIGRpc2FibGUgbGltaXRlZCBhZGRyICovCisjZW5kaWYKKworCS8qIHNldHVwIENTMCBmb3IgTWljcm9uIE5BTkQsIGxlYXZlIG90aGVyIENTJ3MgdG8gdS1ib290ICovCisJX19yYXdfd3JpdGVsKDAgLCBHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApOworCWRlbGF5KDEwMDApOworCisjaWZkZWYgQ0ZHX05BTkQKKwlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKworI2Vsc2UgLyogQ0ZHX09ORU5BTkQgKi8KKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKyNlbmRpZgorCisJLyogRW5hYmxlIHRoZSBHUE1DIE1hcHBpbmcgKi8KKwlfX3Jhd193cml0ZWwoKCAoKE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgJiAweEYpPDw4KSB8CisJCSAgICAgKChPTUFQMzRYWF9HUE1DX0NTMF9NQVA+PjI0KSAmIDB4M0YpIHwKKwkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKwlkZWxheSgyMDAwKTsKKworI2lmZGVmIENGR19OQU5ECisgCWlmIChuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisjZWxzZQorCWlmIChvbmVuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorCQlwcmludGYoIk9uZU5BTkQgVW5zdXBwb3J0ZWQgIVxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qIG9wdGlvbmFsbHkgZG8gc29tZXRoaW5nIGxpa2UgYmxpbmtpbmcgTEVEICovCit2b2lkIGJvYXJkX2hhbmcgKHZvaWQpCit7IHdoaWxlICgwKSB7fTt9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTg2OTI3MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8gCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogTk9URTogMzQzMCBYLWxvYWRlciBjdXJyZW50bHkgZG9lcyBub3QgdXNlIHRoaXMgY29kZS4gIAorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3RtZmQgc3AhLCB7cjQtcjZ9CisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI0LCBwbGxfY3RsX2FkZAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdCit3YWl0MToKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYmVxICAgICB3YWl0MSAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDEKKyAgICAgICAgc3RyICAgICByMSwgW3I1XSAgICAgICAgICAvKiBzZXQgbSwgbiwgbTIgKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQyCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgLyogc2V0IGwzL2w0Ly4uIGRpdmlkZXJzKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQzICAvKiB3a3VwICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsMyAgLyogcnNtIHZhbCAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIAorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQgCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAKKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1IAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAKKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLyAgICAgCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8gICAgICAgIAorCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworLyogVGhlIE5vciBoYXMgdG8gYmUgaW4gdGhlIEZsYXNoIEJhc2UgQ1MwIGZvciB0aGlzIGNvbmRpdGlvbiB0byBoYXBwZW4gKi8KK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUcxKQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkICAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUczKQorZmxhc2hfY2ZnM192YWw6IAorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc0KQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzUpCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTCAKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpIAorcGxsX2Rpdl9hZGQ0OgorICAgIC53b3JkIENNX0NMS1NFTF9HRlgKK3BsbF9kaXZfdmFsNDoKKyAgICAud29yZCAoR0ZYX0RJViA8PCAwKSAKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisKKyNlbmRpZgorCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworCWJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4gCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRSwweDA3LDB4MDUsMHgwMQorLyogRVMyICovCisud29yZCAweDBGQSwweDA1LDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwNSwweDA3LDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QsMHgwQywweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxRjQsMHgwQywweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTBBLDB4MEMsMHgwMywweDAxCisgCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5LDB4MTIsMHgwNCwweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxLDB4MTcsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDE3LDB4MDMsMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3RCwweDE5LDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDBGQSwweDBDLDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwQywweDA3LDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQSwweDMyLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDI3MSwweDJGLDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgyRiwweDAzLDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RCwweDA1LDB4MDcsMHgwMQorLyogRVMyICovCisud29yZCAweDBCNCwweDA1LDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwNSwweDA3LDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkEsMHgwQywweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNjgsMHgwQywweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTBBLDB4MEMsMHgwMywweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIsMHgwOSwweDA3LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEsMHgwQiwweDA2LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MTcsMHgwMywweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdELDB4MEMsMHgwNywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0LDB4MEMsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDBDLDB4MDcsMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTNGLDB4MzAsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxLDB4MTcsMHgwNiwweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDJGLDB4MDMsMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBDb3JlIERQTEwgdGFyZ2V0cyBmb3IgTDMgYXQgMTY2ICYgTDEzMyAqLworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8xMl9FUzEsTV8xMl9FUzEsRlNMXzEyX0VTMSxNMl8xMl9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8xMixOXzEyLEZTRUxfMTIsTTJfMTIKKy8qIDM0MTAgKi8KKy53b3JkIE1fMTIsTl8xMixGU0VMXzEyLE0yXzEyCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMTNfRVMxLE5fMTNfRVMxLEZTTF8xM19FUzEsTTJfMTNfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMTMsTl8xMyxGU0VMXzEzLE0yXzEzCisvKiAzNDEwICovCisud29yZCBNXzEzLE5fMTMsRlNFTF8xMyxNMl8xMworCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMTlwMl9FUzEsTl8xOXAyX0VTMSxGU0xfMTlwMl9FUzEsTTJfMTlwMl9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8xOXAyLE5fMTlwMixGU0VMXzE5cDIsTTJfMTlwMgorLyogMzQxMCAqLworLndvcmQgTV8xOXAyLE5fMTlwMixGU0VMXzE5cDIsTTJfMTlwMgorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCBNXzI2X0VTMSxOXzI2X0VTMSxGU0xfMjZfRVMxLE0yXzI2X0VTMQorLyogRVMyICovCisud29yZCBNXzI2LE5fMjYsRlNFTF8yNixNMl8yNgorLyogMzQxMCAqLworLndvcmQgTV8yNixOXzI2LEZTRUxfMjYsTTJfMjYKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCBNXzM4cDRfRVMxLE5fMzhwNF9FUzEsRlNMXzM4cDRfRVMxLE0yXzM4cDRfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMzhwNCxOXzM4cDQsRlNFTF8zOHA0LE0yXzM4cDQKKy8qIDM0MTAgKi8KKy53b3JkIE1fMzhwNCxOXzM4cDQsRlNFTF8zOHA0LE0yXzM4cDQKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOCwweDA1LDB4MDcsMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAsMHgwQywweDAzLDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMSwweDA5LDB4MDcsMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOCwweDBDLDB4MDcsMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxLDB4MTMsMHgwNywweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQwMmY3NAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IveC1sb2FkLmxkcwpAQCAtMCwwICsxLDU0IEBACisvKgorICogTm92ZW1iZXIgMjAwNiAtIENoYW5nZWQgdG8gc3VwcG9ydCAzNDMwc2RwIGRldmljZSAKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzIAorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNWNlMTcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IG9tYXAzNDMwc2RwLm8gCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YWQ2YzUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9jb25maWcubWsKQEAgLTAsMCArMSwyMiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBTRFAzNDMwIGJvYXJkIHVzZXMgT01BUDM0MzAgKEFSTS1Db3J0ZXhBOCkgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgU0RQMzQzMCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgMTI4TUIgbUREUi1TRFJBTSBvbiBDUzAKKyMgU0RQMzQzMCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgMDBNQiBtRERSLVNEUkFNIG9uIENTMQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorIyBBMDAwJzAwMDAgKGJhbmsxKSAtIHJlLW1hcHBhYmxlIGJlbG93IENTMQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwODgwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvb21hcDM0MzBzZHAuYyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL29tYXAzNDMwc2RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwOWFhZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL29tYXAzNDMwc2RwLmMKQEAgLTAsMCArMSw3NzQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisgICAgICAgIHVuc2lnbmVkIGludCBtOworICAgICAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGZzZWw7CisgICAgICAgIHVuc2lnbmVkIGludCBtMjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworI2RlZmluZSBNQVhfU0lMX0lOREVYCTMKKworLyogRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsb3dsZXZlbF9pbml0LlMgKi8KK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X21wdV9kcGxsX3BhcmFtKCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9pdmFfZHBsbF9wYXJhbSgpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfY29yZV9kcGxsX3BhcmFtKCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9wZXJfZHBsbF9wYXJhbSgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIiAic3VicyAlMCwgJTEsICMxXG4iCisJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIobG9vcHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBib2FyZF9pbml0CisgKiBEZXNjcmlwdGlvbjogRWFybHkgaGFyZHdhcmUgaW5pdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdldF9kZXZpY2VfdHlwZSgpOiB0ZWxsIGlmIEdQL0hTL0VNVS9UU1QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9kZXZpY2VfdHlwZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChERVZJQ0VfTUFTSyk7CisgICAgICAgIHJldHVybihtb2RlID4+PSA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfY3B1X3Jldih2b2lkKQoreworCXUzMiBjcHVpZD0wOworCS8qIE9uIEVTMS4wIHRoZSBJRENPREUgcmVnaXN0ZXIgaXMgbm90IGV4cG9zZWQgb24gTDQKKwkgKiBzbyB1c2luZyBDUFUgSUQgdG8gZGlmZmVyZW50aWF0ZQorCSAqIGJldHdlZW4gRVMyLjAgYW5kIEVTMS4wLgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChjcHVpZCkpOworCWlmKChjcHVpZCAgJiAweGYpID09IDB4MCkKKwkJcmV0dXJuIENQVV8zNDMwX0VTMTsKKwllbHNlCisJCXJldHVybiBDUFVfMzQzMF9FUzI7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B1X2lzXzM0MTAodm9pZCkgLSByZXR1cm5zIHRydWUgZm9yIDM0MTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgY3B1X2lzXzM0MTAodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCWlmKGdldF9jcHVfcmV2KCkgPCBDUFVfMzQzMF9FUzIpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogcmVhZCBzY2FsYWJpbGl0eSBzdGF0dXMgYW5kIHJldHVybiAxIGZvciAzNDEwKi8KKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX1NUQVRVUyk7CisJCS8qIENoZWNrIHdoZXRoZXIgTVBVIGZyZXF1ZW5jeSBpcyBzZXQgdG8gMjY2IE1IeiB3aGljaAorCQkgKiBpcyBub21pbmFsIGZvciAzNDEwLiBJZiB5ZXMgcmV0dXJuIHRydWUgZWxzZSBmYWxzZQorCQkgKi8KKwkJaWYgKCgoc3RhdHVzID4+IDgpICYgMHgzKSA9PSAweDIpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHNyMzIgLSBjbGVhciAmIHNldCBhIHZhbHVlIGluIGEgYml0IHJhbmdlIGZvciBhIDMyIGJpdCBhZGRyZXNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisJbXNrID0gMSA8PCBudW1fYml0czsKKwktLW1zazsKKwl0bXAgPSBfX3Jhd19yZWFkbChhZGRyKSAmIH4obXNrIDw8IHN0YXJ0X2JpdCk7CisJdG1wIHw9ICB2YWx1ZSA8PCBzdGFydF9iaXQ7CisJX19yYXdfd3JpdGVsKHRtcCwgYWRkcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhaXRfb25fdmFsdWUoKSAtIGNvbW1vbiByb3V0aW5lIHRvIGFsbG93IHdhaXRpbmcgZm9yIGNoYW5nZXMgaW4KKyAqICAgdm9sYXRpbGUgcmVncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgd2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisjaWZkZWYgQ0ZHXzM0MzBTRFJBTV9ERFIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNvbmZpZ18zNDMwc2RyYW1fZGRyKCkgLSBJbml0IEREUiBvbiAzNDMwU0RQIGRldiBib2FyZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNvbmZpZ18zNDMwc2RyYW1fZGRyKHZvaWQpCit7CisJLyogcmVzZXQgc2RyYyBjb250cm9sbGVyICovCisJX19yYXdfd3JpdGVsKFNPRlRSRVNFVCwgU0RSQ19TWVNDT05GSUcpOworCXdhaXRfb25fdmFsdWUoQklUMCwgQklUMCwgU0RSQ19TVEFUVVMsIDEyMDAwMDAwKTsKKwlfX3Jhd193cml0ZWwoMCwgU0RSQ19TWVNDT05GSUcpOworCisJLyogc2V0dXAgc2RyYyB0byBiYWxsIG11eCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisJLyogc2V0IG1kY2ZnICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisKKwkvKiBzZXQgdGltaW5nICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1JGUl9DVFJMLCBTRFJDX1JGUl9DVFJMKTsKKworCS8qIGluaXQgc2VxdWVuY2UgZm9yIG1ERFIvbVNEUiB1c2luZyBtYW51YWwgY29tbWFuZHMgKEREUiBpcyBkaWZmZXJlbnQpICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCWRlbGF5KDUwMDApOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKworCS8qIHNldCBtcjAgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMCk7CisKKwkvKiBzZXQgdXAgZGxsICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQV9DVFJMKTsKKwlkZWxheSgweDIwMDApOwkvKiBnaXZlIHRpbWUgdG8gbG9jayAqLworCit9CisjZW5kaWYgLy8gQ0ZHXzM0MzBTRFJBTV9ERFIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNfY2xrX3NwZWVkIC0gZGV0ZXJtaW5lIHJlZmVyZW5jZSBvc2NpbGxhdG9yIHNwZWVkCisgKiAgYmFzZWQgb24ga25vd24gMzJrSHogY2xvY2sgYW5kIGdwdGltZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfb3NjX2Nsa19zcGVlZCh2b2lkKQoreworCXUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJNX0NMS1NSQ19DVFJMKTsKKwkvKiBJZiBTWVNfQ0xLIGlzIGJlaW5nIGRpdmlkZWQgYnkgMiwgcmVtb3ZlIGZvciBub3cgKi8KKwl2YWwgPSAodmFsICYgKH5CSVQ3KSkgfCBCSVQ2OworCV9fcmF3X3dyaXRlbCh2YWwsIFBSTV9DTEtTUkNfQ1RSTCk7CisKKwkvKiBlbmFibGUgdGltZXIyICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUxfV0tVUCk7CS8qIHNlbGVjdCBzeXNfY2xrIGZvciBHUFQxICovCisKKwkvKiBFbmFibGUgSSBhbmQgRiBDbG9ja3MgZm9yIEdQVDEgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU5fV0tVUCkgfCBCSVQwIHwgQklUMjsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9JQ0xLRU5fV0tVUCk7CisJdmFsID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9GQ0xLRU5fV0tVUCk7CisKKwlfX3Jhd193cml0ZWwoMCwgT01BUDM0WFhfR1BUMSArIFRMRFIpOwkvKiBzdGFydCBjb3VudGluZyBhdCAwICovCisJX19yYXdfd3JpdGVsKEdQVF9FTiwgT01BUDM0WFhfR1BUMSArIFRDTFIpOyAgICAgLyogZW5hYmxlIGNsb2NrICovCisJLyogZW5hYmxlIDMya0h6IHNvdXJjZSAqLy8qIGVuYWJsZWQgb3V0IG9mIHJlc2V0ICovCisJLyogZGV0ZXJtaW5lIHN5c19jbGsgdmlhIGdhdWdpbmcgKi8KKworCXN0YXJ0ID0gMjAgKyBfX3Jhd19yZWFkbChTMzJLX0NSKTsJLyogc3RhcnQgdGltZSBpbiAyMCBjeWNsZXMgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCBzdGFydCk7CS8qIGRlYWQgbG9vcCB0aWxsIHN0YXJ0IHRpbWUgKi8KKwljc3RhcnQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBzdGFydCBzeXNfY2xrIGNvdW50ICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgKHN0YXJ0ICsgMjApKTsJLyogd2FpdCBmb3IgNDAgY3ljbGVzICovCisJY2VuZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IGVuZCBzeXNfY2xrIGNvdW50ICovCisJY2RpZmYgPSBjZW5kIC0gY3N0YXJ0OwkJCQkvKiBnZXQgZWxhcHNlZCB0aWNrcyAqLworCisJLyogYmFzZWQgb24gbnVtYmVyIG9mIHRpY2tzIGFzc2lnbiBzcGVlZCAqLworCWlmIChjZGlmZiA+IDE5MDAwKQorCQlyZXR1cm4gKFMzOF80TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxNTIwMCkKKwkJcmV0dXJuIChTMjZNKTsKKwllbHNlIGlmIChjZGlmZiA+IDEzMDAwKQorCQlyZXR1cm4gKFMyNE0pOworCWVsc2UgaWYgKGNkaWZmID4gOTAwMCkKKwkJcmV0dXJuIChTMTlfMk0pOworCWVsc2UgaWYgKGNkaWZmID4gNzYwMCkKKwkJcmV0dXJuIChTMTNNKTsKKwllbHNlCisJCXJldHVybiAoUzEyTSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNfY2xraW5fc2VsKCkgLSByZXR1cm5zIHRoZSBzeXNfY2xraW5fc2VsIGZpZWxkIHZhbHVlIGJhc2VkIG9uCisgKiAgIC0tIGlucHV0IG9zY2lsbGF0b3IgY2xvY2sgZnJlcXVlbmN5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZ2V0X3N5c19jbGtpbl9zZWwodTMyIG9zY19jbGssIHUzMiAqc3lzX2Nsa2luX3NlbCkKK3sKKwlpZihvc2NfY2xrID09IFMzOF80TSkKKwkJKnN5c19jbGtpbl9zZWw9ICA0OworCWVsc2UgaWYob3NjX2NsayA9PSBTMjZNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDM7CisJZWxzZSBpZihvc2NfY2xrID09IFMxOV8yTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAyOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTNNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDE7CisJZWxzZSBpZihvc2NfY2xrID09IFMxMk0pCisJCSpzeXNfY2xraW5fc2VsID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHJjbV9pbml0KCkgLSBpbml0cyBjbG9ja3MgZm9yIFBSQ00gYXMgZGVmaW5lZCBpbiBjbG9ja3MuaAorICogICAtLSBjYWxsZWQgZnJvbSBTUkFNLCBvciBGbGFzaCAodXNpbmcgdGVtcCBTUkFNIHN0YWNrKS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJjbV9pbml0KHZvaWQpCit7CisJdTMyIG9zY19jbGs9MCwgc3lzX2Nsa2luX3NlbDsKKwlkcGxsX3BhcmFtICpkcGxsX3BhcmFtX3A7CisJdTMyIGNsa19pbmRleCwgc2lsX2luZGV4OworCisJLyogR2F1Z2UgdGhlIGlucHV0IGNsb2NrIHNwZWVkIGFuZCBmaW5kIG91dCB0aGUgc3lzX2Nsa2luX3NlbAorCSAqIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGNsb2NrLgorCSAqLworCW9zY19jbGsgPSBnZXRfb3NjX2Nsa19zcGVlZCgpOworCWdldF9zeXNfY2xraW5fc2VsKG9zY19jbGssICZzeXNfY2xraW5fc2VsKTsKKworCXNyMzIoUFJNX0NMS1NFTCwgMCwgMywgc3lzX2Nsa2luX3NlbCk7IC8qIHNldCBpbnB1dCBjcnlzdGFsIHNwZWVkICovCisKKwkvKiBJZiB0aGUgaW5wdXQgY2xvY2sgaXMgZ3JlYXRlciB0aGFuIDE5LjJNIGFsd2F5cyBkaXZpZGUvMiAqLworCWlmKHN5c19jbGtpbl9zZWwgPiAyKSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAyKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwvMjsKKwl9IGVsc2UgeworCQlzcjMyKFBSTV9DTEtTUkNfQ1RSTCwgNiwgMiwgMSk7LyogaW5wdXQgY2xvY2sgZGl2aWRlciAqLworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsOworCX0KKworCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCSAqIHNpbGljb24gcmV2aXNpb24uIFRoZSBjbGtfaW5kZXggdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGdldAorCSAqIHRoZSB2YWx1ZXMgZm9yIHRoYXQgaW5wdXQgc3lzY2xrIGZyb20gdGhlIERQTEwgcGFyYW0gdGFibGUKKwkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUKKwkgKiBhcHByb3ByaWF0ZSBzaWxpY29uIHJldi4KKwkgKi8KKwlpZihjcHVfaXNfMzQxMCgpKQorCQlzaWxfaW5kZXggPSAyOworCWVsc2UgeworCQlpZihnZXRfY3B1X3JldigpID09IENQVV8zNDMwX0VTMSkKKwkJCXNpbF9pbmRleCA9IDA7CisJCWVsc2UgaWYoZ2V0X2NwdV9yZXYoKSA9PSBDUFVfMzQzMF9FUzIpCisJCQlzaWxfaW5kZXggPSAxOworCX0JCisKKwkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBNQVhfU0lMX0lOREVYKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBzcjMyKENNX0NMS1NFTDJfRU1VKSBzZXQgb3ZlcnJpZGUgdG8gd29yayB3aGVuIGFzbGVlcCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsJLyogbTN4MiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCAyLCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogU2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBTZXQgTSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CQkJLyogOTZNIFNyYyAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAwLCAzLCBHRlhfRElWKTsJCS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIFBFUiAgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgY2xrX2luZGV4OworCS8qIFBFUiBEUExMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJLyogc2V0IE0zICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIHNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBzZXQgbSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIHNldCBuICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOy8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgTUFYX1NJTF9JTkRFWCpjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBTZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIFNldCBNICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7IC8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgTUFYX1NJTF9JTkRFWCpjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogSVZBIERQTEwgKHNldCB0byAxMioyMD0yNDBNSHopICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIHNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIHNldCBNICovCisgIAlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIHNldCBOICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsJLyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRyeV91bmxvY2tfbWVtb3J5KHZvaWQpCit7CisJaW50IG1vZGU7CisKKwkvKiBpZiBHUCBkZXZpY2UgdW5sb2NrIGRldmljZSBTUkFNIGZvciBnZW5lcmFsIHVzZSAqLworCS8qIHNlY3VyZSBjb2RlIGJyZWFrcyBmb3IgU2VjdXJlL0VtdWxhdGlvbiBkZXZpY2UgLSBIUy9FL1QqLworCW1vZGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKwlpZiAobW9kZSA9PSBHUF9ERVZJQ0UpIHsKKwkJc2VjdXJlX3VubG9jaygpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzX2luaXQKKyAqIERlc2NyaXB0aW9uOiBEb2VzIGVhcmx5IHN5c3RlbSBpbml0IG9mIG11eGluZyBhbmQgY2xvY2tzLgorICogLSBDYWxsZWQgYXQgdGltZSB3aGVuIG9ubHkgc3RhY2sgaXMgYXZhaWxhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworI2lmZGVmIENPTkZJR18zNDMwX0FTXzM0MTAKKwkvKiBzZXR1cCB0aGUgc2NhbGFiaWxpdHkgY29udHJvbCByZWdpc3RlciBmb3IgCisJICogMzQzMCB0byB3b3JrIGluIDM0MTAgbW9kZQorCSAqLworCV9fcmF3X3dyaXRlbCgweDVBQkYsQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX09DUCk7CisjZW5kaWYKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKwlkZWxheSgxMDApOworCXByY21faW5pdCgpOworCXBlcl9jbG9ja3NfZW5hYmxlKCk7CisJY29uZmlnXzM0MzBzZHJhbV9kZHIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG1pc2NfaW5pdF9yCisgKiBEZXNjcmlwdGlvbjogSW5pdCBldGhlcm5ldCAoZG9uZSBoZXJlIHNvIHVkZWxheSB3b3JrcykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRyYW1faW5pdAorICogRGVzY3JpcHRpb246IHNldHMgdWJvb3RzIGlkZWEgb2Ygc2RyYW0gc2l6ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisjZW5kaWYKKwlkZWxheSgxMDAwKTsKK30KKworLyogU2V0IE1VWCBmb3IgVUFSVCwgR1BNQywgU0RSQywgR1BJTyAqLworCisjZGVmaW5lIAlNVVhfVkFMKE9GRlNFVCxWQUxVRSlcCisJCV9fcmF3X3dyaXRldygoVkFMVUUpLCBPTUFQMzRYWF9DVFJMX0JBU0UgKyAoT0ZGU0VUKSk7CisKKyNkZWZpbmUJCUNQKHgpCShDT05UUk9MX1BBRENPTkZfIyN4KQorLyoKKyAqIElFTiAgLSBJbnB1dCBFbmFibGUKKyAqIElESVMgLSBJbnB1dCBEaXNhYmxlCisgKiBQVEQgIC0gUHVsbCB0eXBlIERvd24KKyAqIFBUVSAgLSBQdWxsIHR5cGUgVXAKKyAqIERJUyAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGluYWN0aXZlCisgKiBFTiAgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBhY3RpdmUKKyAqIE0wICAgLSBNb2RlIDAKKyAqIFRoZSBjb21tZW50ZWQgc3RyaW5nIGdpdmVzIHRoZSBmaW5hbCBtdXggY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwaW4KKyAqLworI2RlZmluZSBNVVhfREVGQVVMVCgpXAorCU1VWF9WQUwoQ1AoU0RSQ19EMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzKi9cCisJTVVYX1ZBTChDUChTRFJDX0Q0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENSovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q3KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDgpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDExKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEzKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxOCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxOSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIxKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIzKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyOCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyOSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QzMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMxKi9cCisJTVVYX1ZBTChDUChTRFJDX0NMSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfQ0xLKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMyKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0ExKi9cCisJTVVYX1ZBTChDUChHUE1DX0EyKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTMpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNCksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E1KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTYpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E4KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTgqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTkpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMTApLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0ExMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QzKi9cCisJTVVYX1ZBTChDUChHUE1DX0Q0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENSovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q3KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDcqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDgpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0QxMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDExKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEzKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDE0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0QxNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDE1Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzApLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzEqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMiksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MyKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M0KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzQqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M1Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzYpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M3KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzcqL1wKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19DTEsqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLCAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQURWX0FMRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OT0UpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05PRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV0UpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQkUwX0NMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05CRTBfQ0xFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTEpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNjEqL1wKKwlNVVhfVkFMKENQKEdQTUNfTldQKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OV1AqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDApLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19XQUlUMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQxKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQyKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTQpKSAvKkdQSU9fNjQqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDMpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT182NSovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzg4Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE5KSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fODkqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMjApLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT185MCovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMSksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzkxKi9cCisJTVVYX1ZBTChDUChDQU1fV0VOKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTY3Ki9cCisJTVVYX1ZBTChDUChVQVJUMV9UWCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1RYKi9cCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfQ1RTKSwgICAgICAoSUVOIHwgUFRVIHwgRElTIHwgTTApKSAvKlVBUlQxX0NUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfUlgpLCAgICAgICAoSUVOIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JYKi9cCisJTVVYX1ZBTChDUChNQ0JTUDFfRFgpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTU4Ki9cCisJTVVYX1ZBTChDUChTWVNfMzJLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNZU18zMksqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzMgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNCAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT181ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184ICovXAorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzE4NiovXAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX25UUlNUKi9cCisJTVVYX1ZBTChDUChKVEFHX1RDSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVENLKi9cCisJTVVYX1ZBTChDUChKVEFHX1RNUyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVE1TKi9cCisJTVVYX1ZBTChDUChKVEFHX1RESSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVERJKi9cCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfRU1VMCovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTEqL1wKKwlNVVhfVkFMKENQKEVUS19DTEspLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMiovXAorCU1VWF9WQUwoQ1AoRVRLX0NUTCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzEzKi9cCisJTVVYX1ZBTChDUChFVEtfRDAgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTQqL1wKKwlNVVhfVkFMKENQKEVUS19EMSApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QyICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjQqL1wKKwlNVVhfVkFMKENQKEVUS19EMTEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjcqL1wKKwlNVVhfVkFMKENQKEVUS19EMTQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxNSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI5Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNldF9tdXhjb25mX3JlZ3MKKyAqIERlc2NyaXB0aW9uOiBTZXR0aW5nIHVwIHRoZSBjb25maWd1cmF0aW9uIE11eCByZWdpc3RlcnMKKyAqICAgICAgICAgICAgICBzcGVjaWZpYyB0byB0aGUgaGFyZHdhcmUuIE1hbnkgcGlucyBuZWVkCisgKiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQgZnJvbSBwcm90ZWN0IHRvIHByaW1hcnkgbW9kZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwlNVVhfREVGQVVMVCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbmFuZCtfaW5pdAorICogRGVzY3JpcHRpb246IFNldCB1cCBuYW5kIGZvciBuYW5kIGFuZCBqZmZzMiBjb21tYW5kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBuYW5kX2luaXQodm9pZCkKK3sKKwkvKiBnbG9iYWwgc2V0dGluZ3MgKi8KKwlfX3Jhd193cml0ZWwoMHgxMCwgR1BNQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlICovCisJX19yYXdfd3JpdGVsKDB4MCwgR1BNQ19JUlFFTkFCTEUpOwkvKiBpc3IncyBzb3VyY2VzIG1hc2tlZCAqLworCV9fcmF3X3dyaXRlbCgwLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7LyogdGltZW91dCBkaXNhYmxlICovCisjaWZkZWYgQ0ZHX05BTkQKKwlfX3Jhd193cml0ZWwoMHgwMDEsIEdQTUNfQ09ORklHKTsJLyogc2V0IG5XUCwgZGlzYWJsZSBsaW1pdGVkIGFkZHIgKi8KKyNlbmRpZgorCisJLyogU2V0IHRoZSBHUE1DIFZhbHMgLiBGb3IgTkFORCBib290IG9uIDM0MzBTRFAsIE5BTkQgaXMgbWFwcGVkIGF0IENTMAorICAgICAgICAgKiAgLCBOT1IgYXQgQ1MxIGFuZCBNUERCIGF0IENTMy4gQW5kIG9uZU5BTkQgYm9vdCwgd2UgbWFwIG9uZU5BTkQgYXQgQ1MwLgorCSAqICBXZSBjb25maWd1cmUgb25seSBHUE1DIENTMCB3aXRoIHJlcXVpcmVkIHZhbHVlcy4gQ29uZmlnaXJpbmcgb3RoZXIgZGV2aWNlcworCSAqICBhdCBvdGhlciBDUyBpbiBkb25lIGluIHUtYm9vdCBhbnl3YXkuIFNvIHdlIGRvbid0IGhhdmUgdG8gYm90aGVyIGRvaW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCV9fcmF3X3dyaXRlbCgwICwgR1BNQ19DT05GSUc3ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlkZWxheSgxMDAwKTsKKworI2lmZGVmIENGR19OQU5ECisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHMiwgR1BNQ19DT05GSUcyICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHMyArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHNSwgR1BNQ19DT05GSUc1ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNiArIEdQTUNfQ09ORklHX0NTMCk7CisKKyNlbHNlIC8qIENGR19PTkVOQU5EICovCisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHMyArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNiArIEdQTUNfQ09ORklHX0NTMCk7CisjZW5kaWYKKworCS8qIEVuYWJsZSB0aGUgR1BNQyBNYXBwaW5nICovCisJX19yYXdfd3JpdGVsKCggKChPTUFQMzRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorCQkgICAgICgoT01BUDM0WFhfR1BNQ19DUzBfTUFQPj4yNCkgJiAweDNGKSB8CisJCSAgICAgKDE8PDYpICksICAoR1BNQ19DT05GSUc3ICsgR1BNQ19DT05GSUdfQ1MwKSk7CisJZGVsYXkoMjAwMCk7CisjaWYgZGVmaW5lZChDRkdfTkFORCkKKyAJaWYgKG5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisJCXByaW50ZigiVW5zdXBwb3J0ZWQgQ2hpcCFcbiIpOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKyNlbGlmIGRlZmluZWQoQ0ZHX09ORU5BTkQpCisJaWYgKG9uZW5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisJCXByaW50ZigiT25lTkFORCBVbnN1cHBvcnRlZCAhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENGR19DTURfRkFUCit0eXBlZGVmIGludCAobW1jX2Jvb3RfYWRkcikgKHZvaWQpOworaW50IG1tY19ib290KHZvaWQpCit7CisgICAgICAgbG9uZyBzaXplLCBpOworICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gQ0ZHX0xPQURBRERSOworICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7CisgICAgICAgY2hhciBidWZbMTJdOworICAgICAgIGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjID0gTlVMTDsKKyAgICAgICBpbnQgZGV2ID0gMDsKKyAgICAgICBpbnQgcGFydCA9IDE7CisgICAgICAgY2hhciAqZXA7CisgICAgICAgdW5zaWduZWQgY2hhciByZXQgPSAwOworCisgICAgICAgcHJpbnRmKCJTdGFydGluZyBYLWxvYWRlciBvbiBNTUMgXG4iKTsKKworICAgICAgIHJldCA9IG1tY19pbml0KDEpOworICAgICAgIGlmKHJldCA9PSAwKXsKKyAgICAgICAgICAgICAgIHByaW50ZigiXG4gTU1DIGluaXQgZmFpbGVkIFxuIik7CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisKKyAgICAgICBkZXZfZGVzYyA9IG1tY19nZXRfZGV2KDApOworICAgICAgIGZhdF9yZWdpc3Rlcl9kZXZpY2UoZGV2X2Rlc2MsIDEpOworICAgICAgIHNpemUgPSBmaWxlX2ZhdF9yZWFkKCJ1LWJvb3QuYmluIiwgKHVuc2lnbmVkIGNoYXIgKilvZmZzZXQsIDApOworICAgICAgIGlmIChzaXplID09IC0xKSB7CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgICAgcHJpbnRmKCJcbiVsZCBCeXRlcyBSZWFkIGZyb20gTU1DIFxuIiwgc2l6ZSk7CisKKyAgICAgICBwcmludGYoIlN0YXJ0aW5nIE9TIEJvb3Rsb2FkZXIgZnJvbSBNTUMuLi5cbiIpOworCisgICAgICAgKChtbWNfYm9vdF9hZGRyICopIENGR19MT0FEQUREUikgKCk7CisKKyAgICAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBvcHRpb25hbGx5IGRvIHNvbWV0aGluZyBsaWtlIGJsaW5raW5nIExFRCAqLwordm9pZCBib2FyZF9oYW5nICh2b2lkKQoreyB3aGlsZSAoMCkge307fQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2OTI3MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL3BsYXRmb3JtLlMKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovIAorICAgICAgICBhZHIgICAgIHIwLCBnb190b19zcGVlZCAgICAgICAgIC8qIGdldCBhZGRyIG9mIGNsb2NrIHNldHRpbmcgY29kZSAqLworICAgICAgICBtb3YgICAgIHIyLCAjMzg0ICAgICAgICAgICAgICAgIC8qIHIyIHNpemUgdG8gY29weSAoZGl2IGJ5IDMyIGJ5dGVzKSAqLworICAgICAgICBtb3YgICAgIHIxLCByMSAgICAgICAgICAgICAgICAgIC8qIHIxIDwtIGRlc3QgYWRkcmVzcyAocGFzc2VkIGluKSAqLworICAgICAgICBhZGQgICAgIHIyLCByMiwgcjAgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworbmV4dDI6CisgICAgICAgIGxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKyAgICAgICAgc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworICAgICAgICBjbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisgICAgICAgIGJuZSAgICAgbmV4dDIKKwltb3YJcGMsIGxyICAgICAgICAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIE5PVEU6IDM0MzAgWC1sb2FkZXIgY3VycmVudGx5IGRvZXMgbm90IHVzZSB0aGlzIGNvZGUuICAKKyogICBJdCBjb3VsZCBiZSByZW1vdmVkIGl0cyBpcyBrZXB0IGZvciBjb21wYXRhYmlseSB3aXRoIHUtYm9vdC4KKyAqCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBDTV9DTEtFTl9QTEwtYnlwYXNzIHZhbHVlCisgKiAgUjEgPSBDTV9DTEtTRUwxX1BMTC1tLCBuLCBhbmQgZGl2aWRlciB2YWx1ZXMKKyAqICBSMiA9IENNX0NMS1NFTF9DT1JFLWRpdmlkZXIgdmFsdWVzCisgKiAgUjMgPSBDTV9JRExFU1RfQ0tHRU4gLSBhZGRyIGRwbGwgbG9jayB3YWl0CisgKgorICogIE5vdGU6IElmIGNvcmUgdW5sb2Nrcy9yZWxvY2tzIGFuZCBTRFJBTSBpcyBydW5uaW5nIGZhc3QgYWxyZWFkeSBpdCBnZXRzCisgKiAgICAgICAgY29uZnVzZWQuICBBIHJlc2V0IG9mIHRoZSBjb250cm9sbGVyIGdldHMgaXQgYmFjay4gIFRha2luZyBhd2F5IGl0cworICogICAgICAgIEwzIHdoZW4gaXRzIG5vdCBpbiBzZWxmIHJlZnJlc2ggc2VlbXMgYmFkIGZvciBpdC4gIE5vcm1hbGx5LCB0aGlzIGNvZGUKKyAqICAgICAgICBydW5zIGZyb20gZmxhc2ggYmVmb3JlIFNEUiBpcyBpbml0IHNvIHRoYXQgc2hvdWxkIGJlIG9rLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN0bWZkIHNwISwge3I0LXI2fQorCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByNCwgcGxsX2N0bF9hZGQKKyAgICAgICAgc3RyICAgICByMCwgW3I0XQord2FpdDE6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJlcSAgICAgd2FpdDEgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNSwgcGxsX2Rpdl9hZGQxCisgICAgICAgIHN0ciAgICAgcjEsIFtyNV0gICAgICAgICAgLyogc2V0IG0sIG4sIG0yICovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMgorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIC8qIHNldCBsMy9sNC8uLiBkaXZpZGVycyovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMyAgLyogd2t1cCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDMgIC8qIHJzbSB2YWwgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAKKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0IAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNSAgLyogZW11ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNSAKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgCisKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmczX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnM192YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc0X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNF92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc1X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNV92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmcxX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgW3I1XQorICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBsb2NrIERQTEwzIGFuZCB3YWl0IGEgYml0ICovCisgICAgICAgIG9yciAgICAgcjAsIHIwLCAjMHg3ICAgLyogc2V0IHVwIGZvciBsb2NrIG1vZGUgKi8gICAgIAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovICAgICAgICAKKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKy8qIFRoZSBOb3IgaGFzIHRvIGJlIGluIHRoZSBGbGFzaCBCYXNlIENTMCBmb3IgdGhpcyBjb25kaXRpb24gdG8gaGFwcGVuICovCitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHMSkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHMykKK2ZsYXNoX2NmZzNfdmFsOiAKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc1KQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwgCitwbGxfZGl2X2FkZDI6CisgICAgLndvcmQgQ01fQ0xLU0VMX0NPUkUKK3BsbF9kaXZfYWRkMzoKKyAgICAud29yZCBDTV9DTEtTRUxfV0tVUAorcGxsX2Rpdl92YWwzOgorICAgIC53b3JkIChXS1VQX1JTTSA8PCAxKSAKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkgCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorCisjZW5kaWYKKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKwlibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuIAorICogVGhlIHZhbHVlcyBhcmUgZGVmaW5lZCBmb3IgYWxsIHBvc3NpYmxlIHN5c2NsayBhbmQgZm9yIEVTMSBhbmQgRVMyLgorICovCisKK21wdV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkUsMHgwNywweDA1LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEsMHgwNSwweDA3LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MDg1LDB4MDUsMHgwNywweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdELDB4MEMsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MUY0LDB4MEMsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDEwQSwweDBDLDB4MDMsMHgwMQorIAorLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3OSwweDEyLDB4MDQsMHgwMQorLyogRVMyICovCisud29yZCAweDI3MSwweDE3LDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgxNywweDAzLDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QsMHgxOSwweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEsMHgwQywweDA3LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MDg1LDB4MEMsMHgwNywweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEsMHgzMiwweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEsMHgyRiwweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MkYsMHgwMywweDAxCisKKworLmdsb2JsIGdldF9tcHVfZHBsbF9wYXJhbQorZ2V0X21wdV9kcGxsX3BhcmFtOgorCWFkciByMCwgbXB1X2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2l2YV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QsMHgwNSwweDA3LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQsMHgwNSwweDA3LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MDg1LDB4MDUsMHgwNywweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZBLDB4MEMsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTY4LDB4MEMsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDEwQSwweDBDLDB4MDMsMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyLDB4MDksMHgwNywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxLDB4MEIsMHgwNiwweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDE3LDB4MDMsMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RCwweDBDLDB4MDcsMHgwMQorLyogRVMyICovCisud29yZCAweDBCNCwweDBDLDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwQywweDA3LDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDEzRiwweDMwLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDBFMSwweDE3LDB4MDYsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgyRiwweDAzLDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogQ29yZSBEUExMIHRhcmdldHMgZm9yIEwzIGF0IDE2NiAmIEwxMzMgKi8KK2NvcmVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMTJfRVMxLE1fMTJfRVMxLEZTTF8xMl9FUzEsTTJfMTJfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMTIsTl8xMixGU0VMXzEyLE0yXzEyCisvKiAzNDEwICovCisud29yZCBNXzEyLE5fMTIsRlNFTF8xMixNMl8xMgorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCBNXzEzX0VTMSxOXzEzX0VTMSxGU0xfMTNfRVMxLE0yXzEzX0VTMQorLyogRVMyICovCisud29yZCBNXzEzLE5fMTMsRlNFTF8xMyxNMl8xMworLyogMzQxMCAqLworLndvcmQgTV8xMyxOXzEzLEZTRUxfMTMsTTJfMTMKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCBNXzE5cDJfRVMxLE5fMTlwMl9FUzEsRlNMXzE5cDJfRVMxLE0yXzE5cDJfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMTlwMixOXzE5cDIsRlNFTF8xOXAyLE0yXzE5cDIKKy8qIDM0MTAgKi8KKy53b3JkIE1fMTlwMixOXzE5cDIsRlNFTF8xOXAyLE0yXzE5cDIKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8yNl9FUzEsTl8yNl9FUzEsRlNMXzI2X0VTMSxNMl8yNl9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8yNixOXzI2LEZTRUxfMjYsTTJfMjYKKy8qIDM0MTAgKi8KKy53b3JkIE1fMjYsTl8yNixGU0VMXzI2LE0yXzI2CisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8zOHA0X0VTMSxOXzM4cDRfRVMxLEZTTF8zOHA0X0VTMSxNMl8zOHA0X0VTMQorLyogRVMyICovCisud29yZCBNXzM4cDQsTl8zOHA0LEZTRUxfMzhwNCxNMl8zOHA0CisvKiAzNDEwICovCisud29yZCBNXzM4cDQsTl8zOHA0LEZTRUxfMzhwNCxNMl8zOHA0CisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgsMHgwNSwweDA3LDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwLDB4MEMsMHgwMywweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEsMHgwOSwweDA3LDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgsMHgwQywweDA3LDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMSwweDEzLDB4MDcsMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwMmY3NAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIE5vdmVtYmVyIDIwMDYgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgMzQzMHNkcCBkZXZpY2UgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBUZXhhcyBJbnN0cnVtZW50cyAKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMzk5YzViCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworT0JKUwk6PSBvbWFwM2V2bS5vIAorU09CSlMJOj0gcGxhdGZvcm0ubworCiskKExJQik6CSQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDVlYzIyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vY29uZmlnLm1rCkBAIC0wLDAgKzEsMTkgQEAKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgT01BUDNFVk0gYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cyMKKyMKKyMgT01BUDNFVk0gaGFzIDEgYmFuayBvZiAxMjhNQiBtUE9QLVNEUkFNIG9uIENTMAorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwMDgwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vb21hcDNldm0uYyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL29tYXAzZXZtLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWQ3Yjk5NAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL29tYXAzZXZtLmMKQEAgLTAsMCArMSwxMjM5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHBhcnQuaD4KKyNpbmNsdWRlIDxmYXQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworc3RydWN0IGRwbGxfcGFyYW0geworICAgICAgICB1bnNpZ25lZCBpbnQgbTsKKyAgICAgICAgdW5zaWduZWQgaW50IG47CisgICAgICAgIHVuc2lnbmVkIGludCBmc2VsOworICAgICAgICB1bnNpZ25lZCBpbnQgbTI7Cit9OworCitzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtIHsKKwl1bnNpZ25lZCBpbnQgc3lzX2NsazsKKwl1bnNpZ25lZCBpbnQgbTsKKwl1bnNpZ25lZCBpbnQgbjsKKwl1bnNpZ25lZCBpbnQgbTI7CisJdW5zaWduZWQgaW50IG0zOworCXVuc2lnbmVkIGludCBtNDsKKwl1bnNpZ25lZCBpbnQgbTU7CisJdW5zaWduZWQgaW50IG02OworCXVuc2lnbmVkIGludCBtMmRpdjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworI2RlZmluZSBNQVhfU0lMX0lOREVYCTMKKworLyogRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsb3dsZXZlbF9pbml0LlMgKi8KK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF8zNnhfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF8zNnhfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKK2V4dGVybiBpbnQgbW1jX2luaXQoaW50IHZlcmJvc2UpOworZXh0ZXJuIGJsb2NrX2Rldl9kZXNjX3QgKm1tY19nZXRfZGV2KGludCBkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIiAic3VicyAlMCwgJTEsICMxXG4iCisJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIobG9vcHMpKTsKK30KKwordm9pZCB1ZGVsYXkgKHVuc2lnbmVkIGxvbmcgdXNlY3MpIHsKKwlkZWxheSh1c2Vjcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogYm9hcmRfaW5pdAorICogRGVzY3JpcHRpb246IEVhcmx5IGhhcmR3YXJlIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBnZXRfZGV2aWNlX3R5cGUoKTogdGVsbCBpZiBHUC9IUy9FTVUvVFNUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoREVWSUNFX01BU0spOworICAgICAgICByZXR1cm4obW9kZSA+Pj0gOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNib290X3ZhbHVlKHZvaWQpIC0gcmV0dXJuIFNZU19CT09UWzQ6MF0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoU1lTQk9PVF9NQVNLKTsKKyAgICAgICAgcmV0dXJuIG1vZGU7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZ2V0X21lbV90eXBlKHZvaWQpIC0gcmV0dXJucyB0aGUga2luZCBvZiBtZW1vcnkgY29ubmVjdGVkCisgKiB0byBHUE1DIHRoYXQgd2UgYXJlIHRyeWluZyB0byBib290IGZvcm0uIFVzZXMgU1lTIEJPT1Qgc2V0dGluZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfbWVtX3R5cGUodm9pZCkKK3sKKyAgICAgICAgdTMyICAgbWVtX3R5cGUgPSBnZXRfc3lzYm9vdF92YWx1ZSgpOworICAgICAgICBzd2l0Y2ggKG1lbV90eXBlKXsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICBjYXNlIDIyOiAgICByZXR1cm4gR1BNQ19PTkVOQU5EOworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICBjYXNlIDI3OiAgICByZXR1cm4gR1BNQ19OQU5EOworCisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBjYXNlIDY6ICAgICByZXR1cm4gTU1DX09ORU5BTkQ7CisKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgIGNhc2UgMjY6ICAgIHJldHVybiBHUE1DX01ET0M7CisKKyAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgY2FzZSAyNDoJcmV0dXJuIE1NQ19OQU5EOworCisgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgZGVmYXVsdDogICAgcmV0dXJuIEdQTUNfTk9SOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwl1MzIgY3B1aWQ9MDsKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIiAoY3B1aWQpKTsKKwlpZigoY3B1aWQgICYgMHhmKSA9PSAweDApCisJCXJldHVybiBDUFVfMzQzMF9FUzE7CisJZWxzZQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMyOworCit9CisKK3UzMiBpc19jcHVfZmFtaWx5KHZvaWQpCit7CisJdTMyIGNwdWlkID0gMCwgY3B1X2ZhbWlseSA9IDA7CisJdTE2IGhhd2tleWU7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIihjcHVpZCkpOworCWlmICgoY3B1aWQgJiAweGYpID09IDB4MCkgeworCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCX0gZWxzZSB7CisJCWNwdWlkID0gX19yYXdfcmVhZGwoT01BUDM0WFhfQ09OVFJPTF9JRCk7CisJCWhhd2tleWUgID0gKGNwdWlkID4+IEhBV0tFWUVfU0hJRlQpICYgMHhmZmZmOworCisJCXN3aXRjaCAoaGF3a2V5ZSkgeworCQkJY2FzZSBIQVdLRVlFX09NQVAzNFhYOgorCQkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisJCQkJYnJlYWs7CisJCQljYXNlIEhBV0tFWUVfQU0zNVhYOgorCQkJCWNwdV9mYW1pbHkgPSBDUFVfQU0zNVhYOworCQkJCWJyZWFrOworCQkJY2FzZSBIQVdLRVlFX09NQVAzNlhYOgorCQkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM2WFg7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGNwdV9mYW1pbHk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBjcHVfaXNfMzQxMCh2b2lkKQoreworCWludCBzdGF0dXM7CisJaWYoZ2V0X2NwdV9yZXYoKSA8IENQVV8zNDMwX0VTMikgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiByZWFkIHNjYWxhYmlsaXR5IHN0YXR1cyBhbmQgcmV0dXJuIDEgZm9yIDM0MTAqLworCQlzdGF0dXMgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NDQUxBQkxFX09NQVBfU1RBVFVTKTsKKwkJLyogQ2hlY2sgd2hldGhlciBNUFUgZnJlcXVlbmN5IGlzIHNldCB0byAyNjYgTUh6IHdoaWNoCisJCSAqIGlzIG5vbWluYWwgZm9yIDM0MTAuIElmIHllcyByZXR1cm4gdHJ1ZSBlbHNlIGZhbHNlCisJCSAqLworCQlpZiAoKChzdGF0dXMgPj4gOCkgJiAweDMpID09IDB4MikKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3IzMiAtIGNsZWFyICYgc2V0IGEgdmFsdWUgaW4gYSBiaXQgcmFuZ2UgZm9yIGEgMzIgYml0IGFkZHJlc3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpCit7CisJdTMyIHRtcCwgbXNrID0gMDsKKwltc2sgPSAxIDw8IG51bV9iaXRzOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FpdF9vbl92YWx1ZSgpIC0gY29tbW9uIHJvdXRpbmUgdG8gYWxsb3cgd2FpdGluZyBmb3IgY2hhbmdlcyBpbgorICogICB2b2xhdGlsZSByZWdzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKyNpZmRlZiBDRkdfT01BUEVWTV9ERFIKKyNpZmRlZiBDT05GSUdfRERSXzI1Nk1CX1NUQUNLRUQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbWFrZV9jczFfY29udGlndW91cygpIC0gZm9yIGVzMiBhbmQgYWJvdmUgcmVtYXAgY3MxIGJlaGluZCBjczAgdG8gYWxsb3cKKyAqICBjb21tYW5kIGxpbmUgbWVtPXh5eiB1c2UgYWxsIG1lbW9yeSB3aXRoIG91dCBkaXNjb250aW51b3VzIHN1cHBvcnQKKyAqICBjb21waWxlZCBpbi4gIENvdWxkIGRvIGl0IGF0IHRoZSBBVEFHLCBidXQgdGhlcmUgcmVhbGx5IGlzIHR3byBiYW5rcy4uLgorICogQ2FsbGVkIGFzIHBhcnQgb2YgMm5kIHBoYXNlIEREUiBpbml0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtYWtlX2NzMV9jb250aWd1b3VzKHZvaWQpCit7CisJdTMyIHNpemUsIGFfYWRkX2xvdywgYV9hZGRfaGlnaDsKKworCXNpemUgPSBnZXRfc2RyX2NzX3NpemUoU0RSQ19DUzBfT1NFVCk7CisJc2l6ZSAvPSBTWl8zMk07ICAgICAgICAgLyogZmluZCBzaXplIHRvIG9mZnNldCBDUzEgKi8KKwlhX2FkZF9oaWdoID0gKHNpemUgJiAzKSA8PCA4OyAgIC8qIHNldCB1cCBsb3cgZmllbGQgKi8KKwlhX2FkZF9sb3cgPSAoc2l6ZSAmIDB4M0MpID4+IDI7IC8qIHNldCB1cCBoaWdoIGZpZWxkICovCisJX19yYXdfd3JpdGVsKChhX2FkZF9oaWdoIHwgYV9hZGRfbG93KSwgU0RSQ19DU19DRkcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jczBfc2l6ZSgpIC0gZ2V0IHNpemUgb2YgY2hpcCBzZWxlY3QgMC8xCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9zZHJfY3Nfc2l6ZSh1MzIgb2Zmc2V0KQoreworCXUzMiBzaXplOworCisJLyogZ2V0IHJhbSBzaXplIGZpZWxkICovCisJc2l6ZSA9IF9fcmF3X3JlYWRsKFNEUkNfTUNGR18wICsgb2Zmc2V0KSA+PiA4OworCXNpemUgJj0gMHgzRkY7ICAgICAgICAgIC8qIHJlbW92ZSB1bndhbnRlZCBiaXRzICovCisJc2l6ZSAqPSBTWl8yTTsgICAgICAgICAgLyogZmluZCBzaXplIGluIE1CICovCisJcmV0dXJuIHNpemU7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY29uZmlnXzM0MzBzZHJhbV9kZHIoKSAtIEluaXQgRERSIG9uIDM0MzBTRFAgZGV2IGJvYXJkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY29uZmlnXzM0MzBzZHJhbV9kZHIodm9pZCkKK3sKKworI2lmbmRlZiBDT05GSUdfRERSXzI1Nk1CX1NUQUNLRUQKKwkvKiByZXNldCBzZHJjIGNvbnRyb2xsZXIgKi8KKwlfX3Jhd193cml0ZWwoU09GVFJFU0VULCBTRFJDX1NZU0NPTkZJRyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCBCSVQwLCBTRFJDX1NUQVRVUywgMTIwMDAwMDApOworCV9fcmF3X3dyaXRlbCgwLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKiBzZXR1cCBzZHJjIHRvIGJhbGwgbXV4ICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwkvKiBzZXQgbWRjZmcgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKworCS8qIHNldCB0aW1pbmcgKi8KKwlpZiAoaXNfY3B1X2ZhbWlseSgpID09IENQVV9PTUFQMzZYWCkgeworCQlfX3Jhd193cml0ZWwoSFlOSVhfU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCQlfX3Jhd193cml0ZWwoSFlOSVhfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJfSBlbHNlIHsKKwkJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX09ORU5BTkQpIHx8IChnZXRfbWVtX3R5cGUoKSA9PSBNTUNfT05FTkFORCkpeworCQkJX19yYXdfd3JpdGVsKElORklORU9OX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwkJCV9fcmF3X3dyaXRlbChJTkZJTkVPTl9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJCX0KKwkJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX05BTkQpIHx8KGdldF9tZW1fdHlwZSgpID09IE1NQ19OQU5EKSl7CisJCQlfX3Jhd193cml0ZWwoTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwkJCV9fcmF3X3dyaXRlbChNSUNST05fU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCQl9CisJIH0KKworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19SRlJfQ1RSTCwgU0RSQ19SRlJfQ1RSTCk7CisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1BPV0VSX1BPUCwgU0RSQ19QT1dFUik7CisKKwkvKiBpbml0IHNlcXVlbmNlIGZvciBtRERSL21TRFIgdXNpbmcgbWFudWFsIGNvbW1hbmRzIChERFIgaXMgZGlmZmVyZW50KSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlkZWxheSg1MDAwKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisKKwkvKiBzZXQgbXIwICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01SXzBfRERSLCBTRFJDX01SXzApOworCisJLyogc2V0IHVwIGRsbCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEFfQ1RSTCk7CisJZGVsYXkoMHgyMDAwKTsJLyogZ2l2ZSB0aW1lIHRvIGxvY2sgKi8KKyNlbHNlCisgICAgICAgLyogcmVzZXQgc2RyYyBjb250cm9sbGVyICovCisgICAgICAgICBfX3Jhd193cml0ZWwoU09GVFJFU0VULCBTRFJDX1NZU0NPTkZJRyk7CisgICAgICAgICB3YWl0X29uX3ZhbHVlKEJJVDAsIEJJVDAsIFNEUkNfU1RBVFVTLCAxMjAwMDAwMCk7CisgICAgICAgICBfX3Jhd193cml0ZWwoMCwgU0RSQ19TWVNDT05GSUcpOworCisgICAgICAgICAvKiBzZXR1cCBzZHJjIHRvIGJhbGwgbXV4ICovCisgICAgICAgICBfX3Jhd193cml0ZWwoU0RQX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworICAgICAgICAgLyogU0RSQ19NQ0ZHMCByZWdpc3RlciAqLworICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMDgwKSA9IDB4MDI1ODQwOTk7Ly9mcm9tIE1pY3JvbgorCisJIGlmIChpc19jcHVfZmFtaWx5KCkgPT0gQ1BVX09NQVAzNlhYKSB7CisJCSAvKiBTRFJDX0FDVElNX0NUUkxBMCByZWdpc3RlciAqLworCQkgKCoodW5zaWduZWQgaW50KikweDZEMDAwMDljKSA9IDB4OTJlMWM0YzY7Ly8gZm9yIDIwME0KKwkJIC8qIFNEUkNfQUNUSU1fQ1RSTEIwIHJlZ2lzdGVyICovCisJCSAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwYTApID0gMHgwMDAyMTExYzsKKwkgfSBlbHNlIHsKKwkJIC8qIFNEUkNfQUNUSU1fQ1RSTEEwIHJlZ2lzdGVyICovCisJCSAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwOWMpID0gMHhhYTlkYjRjNjsvLyBmb3IgMTY2TSBmcm9tIHJrdworCQkgLyogU0RSQ19BQ1RJTV9DVFJMQjAgcmVnaXN0ZXIgKi8KKwkJICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDBhMCkgPSAweDAwMDExNTE3OworCSB9CisKKworICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMGE0KSA9MHgwMDA0REMwMTsKKworICAgICAgICAgLyogRGlzYmxlIFBvd2VyIERvd24gb2YgQ0tFIGN1eiBvZiAxIENLRSBvbiBjb21ibyBwYXJ0ICovCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwNzApID0gMHgwMDAwMDA4MTsKKworICAgICAgICAgLyogU0RSQ19NYW51YWwgY29tbWFuZCByZWdpc3RlciAqLworICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMGE4KSA9IDB4MDAwMDAwMDA7IC8vIE5PUCBjb21tYW5kCisgICAgICAgICBkZWxheSg1MDAwKTsKKyAgICAgICAgICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDBhOCkgPSAweDAwMDAwMDAxOyAvLyBQcmVjaGFyZ2UgY29tbWFuZAorICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMGE4KSA9IDB4MDAwMDAwMDI7IC8vIEF1dG8tcmVmcmVzaCBjb21tYW5kCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwYTgpID0gMHgwMDAwMDAwMjsgLy8gQXV0by1yZWZyZXNoIGNvbW1hbmQKKworICAgICAgICAgLyogU0RSQyBNUjAgcmVnaXN0ZXIgKi8KKyAgICAgICAgICgqKGludCopMHg2RDAwMDA4NCkgPSAweDAwMDAwMDMyOyAvLyBCdXJzdCBsZW5ndGggPTQKKyAgICAgICAgIC8vIENBUyBsYXRlbmN5ID0gMworICAgICAgICAgLy8gV3JpdGUgQnVyc3QgPSBSZWFkIEJ1cnN0CisgICAgICAgICAvLyBTZXJpYWwgTW9kZQorCisgICAgICAgICAvKiBTRFJDIERMTEEgY29udHJvbCByZWdpc3RlciAqLworICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMDYwKSA9IDB4MDAwMEE7CisgICAgICAgICBkZWxheSgweDIwMDAwKTsgLy8gc29tZSBkZWxheQorCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ERFJfMjU2TUJfU1RBQ0tFRAorCW1ha2VfY3MxX2NvbnRpZ3VvdXMoKTsKKworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzAgKyBTRFJDX0NTMV9PU0VUKTsKKwlfX3Jhd193cml0ZWwoTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8xKTsKKwlfX3Jhd193cml0ZWwoTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8xKTsKKworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19SRlJfQ1RSTCwgU0RSQ19SRlJfQ1RSTCArIFNEUkNfQ1MxX09TRVQpOworCS8qIGluaXQgc2VxdWVuY2UgZm9yIG1ERFIvbVNEUiB1c2luZyBtYW51YWwgY29tbWFuZHMgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCArIFNEUkNfQ1MxX09TRVQpOworCWRlbGF5KDUwMDApOyAgIC8qIHN1cHBvc2VkIHRvIGJlIDEwMHVzIHBlciBkZXNpZ24gc3BlYyBmb3IgbWRkci9tc2RyICovCisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzAgKyBTRFJDX0NTMV9PU0VUKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wICsgU0RSQ19DUzFfT1NFVCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCArIFNEUkNfQ1MxX09TRVQpOworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8wICsgU0RSQ19DUzFfT1NFVCk7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBDRkdfT01BUEVWTV9ERFIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNfY2xrX3NwZWVkIC0gZGV0ZXJtaW5lIHJlZmVyZW5jZSBvc2NpbGxhdG9yIHNwZWVkCisgKiAgYmFzZWQgb24ga25vd24gMzJrSHogY2xvY2sgYW5kIGdwdGltZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfb3NjX2Nsa19zcGVlZCh2b2lkKQoreworCXUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgY2RpdiwgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJNX0NMS1NSQ19DVFJMKTsKKworCWlmICh2YWwgJiBCSVQ3KQorCQljZGl2ID0gMjsKKwllbHNlIGlmICh2YWwgJiBCSVQ2KQorCQljZGl2ID0gMTsKKwllbHNlCisJCS8qCisJCSAqIFNob3VsZCBuZXZlciByZWFjaCBoZXJlIQorCQkgKiBUQkQ6IEFkZCBhIFdBUk4oKS9CVUcoKQorCQkgKiAgICAgIEZvciBub3csIGFzc3VtZSBkaXZpZGVyIGFzIDEuCisJCSAqLworCQljZGl2ID0gMTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwlpZiAoY2RpdiA9PSAyKQorCXsKKwkJY2RpZmYgKj0gMjsKKwl9CisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtpbl9zZWwoKSAtIHJldHVybnMgdGhlIHN5c19jbGtpbl9zZWwgZmllbGQgdmFsdWUgYmFzZWQgb24KKyAqICAgLS0gaW5wdXQgb3NjaWxsYXRvciBjbG9jayBmcmVxdWVuY3kuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBnZXRfc3lzX2Nsa2luX3NlbCh1MzIgb3NjX2NsaywgdTMyICpzeXNfY2xraW5fc2VsKQoreworCWlmKG9zY19jbGsgPT0gUzM4XzRNKQorCQkqc3lzX2Nsa2luX3NlbD0gIDQ7CisJZWxzZSBpZihvc2NfY2xrID09IFMyNk0pCisJCSpzeXNfY2xraW5fc2VsID0gMzsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzE5XzJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDI7CisJZWxzZSBpZihvc2NfY2xrID09IFMxM00pCisJCSpzeXNfY2xraW5fc2VsID0gMTsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEyTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAwOworfQorCisvKgorICogT01BUDM0eC8zNXggc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkIGRwbGwzX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzRYKTsJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZCBkcGxsNF9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciA9IHB0ciArIGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CQkvKiBzZXQgTTUgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDUsIFBFUl9NNFgyKTsJCS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkJLyogc2V0IE0zICovCisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChQRVJJUEhfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzIwOjIzXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAyMCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpIDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZCBtcHVfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChNUFVfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9NUFVbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgNCwgNCwgcHRyLT5mc2VsKTsKK30KKworc3RhdGljIHZvaWQgaXZhX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoSVZBMl9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX0lWQTJbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDQsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiBPTUFQMzYzMCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQgZHBsbDNfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNlgpOwkJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZCBkcGxsNF9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICpwdHI7CisKKwlwdHIgPSAoc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqKWdldF8zNnhfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIE02IChESVZfRFBMTDQpOiBDTV9DTEtTRUwxX0VNVVsyNDoyOV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNiwgcHRyLT5tNik7CisKKwkvKiBNNSAoQ0xLU0VMX0NBTSk6IENNX0NMS1NFTDFfRU1VWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDYsIHB0ci0+bTUpOworCisJLyogTTQgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1swOjVdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA2LCBwdHItPm00KTsKKworCS8qIE0zIChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbODoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDYsIHB0ci0+bTMpOworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOV0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMiwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogTTJESVYgKENMS1NFTF85Nk0pOiBDTV9DTEtTRUxfQ09SRVsxMjoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAxMiwgMiwgcHRyLT5tMmRpdik7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKTogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZCBtcHVfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX01QVV9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZCBpdmFfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHJjbV9pbml0KCkgLSBpbml0cyBjbG9ja3MgZm9yIFBSQ00gYXMgZGVmaW5lZCBpbiBjbG9ja3MuaAorICogICAtLSBjYWxsZWQgZnJvbSBTUkFNLCBvciBGbGFzaCAodXNpbmcgdGVtcCBTUkFNIHN0YWNrKS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJjbV9pbml0KHZvaWQpCit7CisJdTMyIG9zY19jbGs9MCwgc3lzX2Nsa2luX3NlbDsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJb3NjX2NsayA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwob3NjX2NsaywgJnN5c19jbGtpbl9zZWwpOworCisJc3IzMihQUk1fQ0xLU0VMLCAwLCAzLCBzeXNfY2xraW5fc2VsKTsgLyogc2V0IGlucHV0IGNyeXN0YWwgc3BlZWQgKi8KKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZS8yICovCisJLyoKKwkgKiBPbiBPTUFQMzYzMCwgRERSIGRhdGEgY29ycnVwdGlvbiBoYXMgYmVlbiBvYnNlcnZlZCBvbiBPRkYgbW9kZQorCSAqIGV4aXQgaWYgdGhlIHN5cyBjbG9jayB3YXMgbG93ZXIgdGhhbiAyNk0uIEFzIGEgd29yayBhcm91bmQsCisJICogT01BUDM2MzAgaXMgb3BlcmF0ZWQgYXQgMjZNIHN5cyBjbG9jayBhbmQgdGhpcyBpbnRlcm5hbCBkaXZpc2lvbgorCSAqIGlzIG5vdCBwZXJmb3JtZWQuCisJICovCisJaWYoKGlzX2NwdV9mYW1pbHkoKSAhPSBDUFVfT01BUDM2WFgpICYmIChzeXNfY2xraW5fc2VsID4gMikpIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDIpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbC8yOworCX0gZWxzZSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAxKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWw7CisJfQorCisJaWYgKGlzX2NwdV9mYW1pbHkoKSA9PSBDUFVfT01BUDM2WFgpIHsKKwkJZHBsbDNfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwl9IGVsc2UgeworCQlzaWxfaW5kZXggPSBnZXRfY3B1X3JldigpIC0gMTsKKworCQkvKiBUaGUgRFBMTCB0YWJsZXMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHN5c2NsayB2YWx1ZSBhbmQKKwkJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJCSAqIHRoZSB2YWx1ZXMgZm9yIHRoYXQgaW5wdXQgc3lzY2xrIGZyb20gdGhlIERQTEwgcGFyYW0gdGFibGUKKwkJICogYW5kIHNpbF9pbmRleCB3aWxsIGdldCB0aGUgdmFsdWVzIGZvciB0aGF0IFN5c0NsayBmb3IgdGhlCisJCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LgorCQkgKi8KKworCQkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT1dfUE9XRVJfQllQQVNTKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCQlkcGxsM19pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisKKwkJLyogTG9jayBNUFUgRFBMTCB0byBzZXQgZnJlcXVlbmN5ICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCX0KKworCS8qIFNldCB1cCBHUFRpbWVycyB0byBzeXNfY2xrIHNvdXJjZSBvbmx5ICovCisgCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgOCwgMHhmZik7CisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMCwgMSwgMSk7CisKKwlkZWxheSg1MDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZWN1cmVfdW5sb2NrCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgc2VjdXJpdHkgcmVnaXN0ZXJzIGZvciBhY2Nlc3MKKyAqIChHUCBEZXZpY2Ugb25seSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwlpbnQgbW9kZTsKKworCS8qIGlmIEdQIGRldmljZSB1bmxvY2sgZGV2aWNlIFNSQU0gZm9yIGdlbmVyYWwgdXNlICovCisJLyogc2VjdXJlIGNvZGUgYnJlYWtzIGZvciBTZWN1cmUvRW11bGF0aW9uIGRldmljZSAtIEhTL0UvVCovCisJbW9kZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCWlmIChtb2RlID09IEdQX0RFVklDRSkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNfaW5pdAorICogRGVzY3JpcHRpb246IERvZXMgZWFybHkgc3lzdGVtIGluaXQgb2YgbXV4aW5nIGFuZCBjbG9ja3MuCisgKiAtIENhbGxlZCBhdCB0aW1lIHdoZW4gb25seSBzdGFjayBpcyBhdmFpbGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBzX2luaXQodm9pZCkKK3sKKwl3YXRjaGRvZ19pbml0KCk7CisjaWZkZWYgQ09ORklHXzM0MzBfQVNfMzQxMAorCS8qIHNldHVwIHRoZSBzY2FsYWJpbGl0eSBjb250cm9sIHJlZ2lzdGVyIGZvcgorCSAqIDM0MzAgdG8gd29yayBpbiAzNDEwIG1vZGUKKwkgKi8KKwlfX3Jhd193cml0ZWwoMHg1QUJGLENPTlRST0xfU0NBTEFCTEVfT01BUF9PQ1ApOworI2VuZGlmCisJdHJ5X3VubG9ja19tZW1vcnkoKTsKKwlzZXRfbXV4Y29uZl9yZWdzKCk7CisJZGVsYXkoMTAwKTsKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ18zNDMwc2RyYW1fZGRyKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBtaXNjX2luaXRfcgorICogRGVzY3JpcHRpb246IEluaXQgZXRoZXJuZXQgKGRvbmUgaGVyZSBzbyB1ZGVsYXkgd29ya3MpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkcmFtX2luaXQKKyAqIERlc2NyaXB0aW9uOiBzZXRzIHVib290cyBpZGVhIG9mIHNkcmFtIHNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBlcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTU1DCisJLyogRW5hYmxlIE1NQzEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKyNlbmRpZgorCWRlbGF5KDEwMDApOworfQorCisvKiBTZXQgTVVYIGZvciBVQVJULCBHUE1DLCBTRFJDLCBHUElPICovCisKKy8qCisgKiBJRU4gIC0gSW5wdXQgRW5hYmxlCisgKiBJRElTIC0gSW5wdXQgRGlzYWJsZQorICogUFREICAtIFB1bGwgdHlwZSBEb3duCisgKiBQVFUgIC0gUHVsbCB0eXBlIFVwCisgKiBESVMgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBpbmFjdGl2ZQorICogRU4gICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgYWN0aXZlCisgKiBNMCAgIC0gTW9kZSAwCisgKiBUaGUgY29tbWVudGVkIHN0cmluZyBnaXZlcyB0aGUgZmluYWwgbXV4IGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcGluCisgKi8KKyNkZWZpbmUgTVVYX0RFRkFVTFQoKVwKKwlNVVhfVkFMKENQKFNEUkNfRDApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDYpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENiovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q4KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDkpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTYpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjcpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMzApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMzEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19DTEspLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0NMSyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMxKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMzKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzMqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTEpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EyKi9cCisJTVVYX1ZBTChDUChHUE1DX0EzKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTQpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E2KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTYqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTcpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOCksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E5KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTkqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxKi9cCisJTVVYX1ZBTChDUChHUE1DX0QyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDUqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDYpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENiovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q4KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDgqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDkpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EOSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MwKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzAqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMSksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MxKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzMqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M0Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M2KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzYqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0NMSyksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQ0xLKi9cCisJTVVYX1ZBTChDUChHUE1DX05BRFZfQUxFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkFEVl9BTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OT0UqL1wKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OV0UqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLCAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQkUwX0NMRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYxKi9cCisJTVVYX1ZBTChDUChHUE1DX05XUCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldQKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDEpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19XQUlUMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMiksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzY0Ki9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTQpKSAvKkdQSU9fNjUqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTgpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184OCovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzg5Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOTAqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMjEpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT185MSovXAorCU1VWF9WQUwoQ1AoQ0FNX1dFTiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2NyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfVFgpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9UWCovXAorCU1VWF9WQUwoQ1AoVUFSVDFfUlRTKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQxX0NUUyksICAgICAgKElFTiB8IFBUVSB8IERJUyB8IE0wKSkgLypVQVJUMV9DVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1JYKSwgICAgICAgKElFTiB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SWCovXAorCU1VWF9WQUwoQ1AoTUNCU1AxX0RYKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE1OCovXAorCU1VWF9WQUwoQ1AoU1lTXzMySyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTWVNfMzJLKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMiAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18zICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzQgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNSAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzcgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOCAqL1wKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT18xODYqL1wKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19uVFJTVCovXAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RDSyovXAorCU1VWF9WQUwoQ1AoSlRBR19UTVMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RNUyovXAorCU1VWF9WQUwoQ1AoSlRBR19UREkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RESSovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTAqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUxKi9cCisJTVVYX1ZBTChDUChFVEtfQ0xLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTIqL1wKKwlNVVhfVkFMKENQKEVUS19DVEwpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMyovXAorCU1VWF9WQUwoQ1AoRVRLX0QwICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTUqL1wKKwlNVVhfVkFMKENQKEVUS19EMiApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDExKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjUqL1wKKwlNVVhfVkFMKENQKEVUS19EMTIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI3Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjgqL1wKKwlNVVhfVkFMKENQKEVUS19EMTUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZXRfbXV4Y29uZl9yZWdzCisgKiBEZXNjcmlwdGlvbjogU2V0dGluZyB1cCB0aGUgY29uZmlndXJhdGlvbiBNdXggcmVnaXN0ZXJzCisgKiAgICAgICAgICAgICAgc3BlY2lmaWMgdG8gdGhlIGhhcmR3YXJlLiBNYW55IHBpbnMgbmVlZAorICogICAgICAgICAgICAgIHRvIGJlIG1vdmVkIGZyb20gcHJvdGVjdCB0byBwcmltYXJ5IG1vZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJTVVYX0RFRkFVTFQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG5hbmQrX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTZXQgdXAgbmFuZCBmb3IgbmFuZCBhbmQgamZmczIgY29tbWFuZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBuYW5kX2luaXQodm9pZCkKK3sKKwkvKiBnbG9iYWwgc2V0dGluZ3MgKi8KKwlfX3Jhd193cml0ZWwoMHgxMCwgR1BNQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlICovCisJX19yYXdfd3JpdGVsKDB4MCwgR1BNQ19JUlFFTkFCTEUpOwkvKiBpc3IncyBzb3VyY2VzIG1hc2tlZCAqLworCV9fcmF3X3dyaXRlbCgwLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7LyogdGltZW91dCBkaXNhYmxlICovCisKKwkvKiBTZXQgdGhlIEdQTUMgVmFscyAuIEZvciBOQU5EIGJvb3Qgb24gMzQzMFNEUCwgTkFORCBpcyBtYXBwZWQgYXQgQ1MwCisgICAgICAgICAqICAsIE5PUiBhdCBDUzEgYW5kIE1QREIgYXQgQ1MzLiBBbmQgb25lTkFORCBib290LCB3ZSBtYXAgb25lTkFORCBhdCBDUzAuCisJICogIFdlIGNvbmZpZ3VyZSBvbmx5IEdQTUMgQ1MwIHdpdGggcmVxdWlyZWQgdmFsdWVzLiBDb25maWdpcmluZyBvdGhlciBkZXZpY2VzCisJICogIGF0IG90aGVyIENTIGluIGRvbmUgaW4gdS1ib290IGFueXdheS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBib3RoZXIgZG9pbmcgaXQgaGVyZS4KKyAgICAgICAgICovCisJX19yYXdfd3JpdGVsKDAgLCBHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApOworCWRlbGF5KDEwMDApOworCisJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX05BTkQpIHx8IChnZXRfbWVtX3R5cGUoKSA9PSBNTUNfTkFORCkpeworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworCisgICAgICAgIAkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworICAgICAgICAJX19yYXdfd3JpdGVsKCggKChPTUFQMzRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorICAgICAgICAJCSAgICAgKChOQU5EX0JBU0VfQURSPj4yNCkgJiAweDNGKSB8CisgICAgICAgIAkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKyAgICAgICAgCWRlbGF5KDIwMDApOworCisgICAgICAgICAJaWYgKG5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisgICAgICAgIAkJcHJpbnRmKCJVbnN1cHBvcnRlZCBDaGlwIVxuIik7CisjZW5kaWYKKyAgICAgICAgCQlyZXR1cm4gMTsKKyAgICAgICAgCX0KKworCX0KKworCWlmICgoZ2V0X21lbV90eXBlKCkgPT0gR1BNQ19PTkVOQU5EKSB8fCAoZ2V0X21lbV90eXBlKCkgPT0gTU1DX09ORU5BTkQpKXsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKworICAgICAgICAJLyogRW5hYmxlIHRoZSBHUE1DIE1hcHBpbmcgKi8KKyAgICAgICAgCV9fcmF3X3dyaXRlbCgoICgoT01BUDM0WFhfR1BNQ19DUzBfU0laRSAmIDB4Rik8PDgpIHwKKyAgICAgICAgCQkgICAgICgoT05FTkFORF9CQVNFPj4yNCkgJiAweDNGKSB8CisgICAgICAgIAkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKyAgICAgICAgCWRlbGF5KDIwMDApOworCisgICAgICAgIAlpZiAob25lbmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKyAgICAgICAgCQlwcmludGYoIk9uZU5BTkQgVW5zdXBwb3J0ZWQgIVxuIik7CisjZW5kaWYKKyAgICAgICAgCQlyZXR1cm4gMTsKKyAgICAgICAgCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKwordHlwZWRlZiBpbnQgKG1tY19ib290X2FkZHIpICh2b2lkKTsKK2ludCBtbWNfYm9vdCh1bnNpZ25lZCBjaGFyICpidWYpCit7CisKKyAgICAgICBsb25nIHNpemUgPSAwOworI2lmZGVmIENGR19DTURfRkFUCisgICAgICAgYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MgPSBOVUxMOworICAgICAgIHVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgWC1sb2FkZXIgb24gTU1DXG4iKTsKKworICAgICAgIHJldCA9IG1tY19pbml0KDEpOworICAgICAgIGlmKHJldCA9PSAwKXsKKyAgICAgICAgICAgICAgIHByaW50ZigiXG4gTU1DIGluaXQgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKworICAgICAgIGRldl9kZXNjID0gbW1jX2dldF9kZXYoMCk7CisgICAgICAgZmF0X3JlZ2lzdGVyX2RldmljZShkZXZfZGVzYywgMSk7CisgICAgICAgc2l6ZSA9IGZpbGVfZmF0X3JlYWQoInUtYm9vdC5iaW4iLCBidWYsIDApOworICAgICAgIGlmIChzaXplID09IC0xKSB7CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgICAgcHJpbnRmKCJcbiVsZCBCeXRlcyBSZWFkIGZyb20gTU1DXG4iLCBzaXplKTsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgT1MgQm9vdGxvYWRlciBmcm9tIE1NQy4uLlxuIik7CisjZW5kaWYKKyAgICAgICByZXR1cm4gc2l6ZTsKK30KKworLyogb3B0aW9uYWxseSBkbyBzb21ldGhpbmcgbGlrZSBibGlua2luZyBMRUQgKi8KK3ZvaWQgYm9hcmRfaGFuZyAodm9pZCkKK3sgd2hpbGUgKDApIHt9O30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjczYTNjNDgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworI2lmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLworICAgICAgICBhZHIgICAgIHIwLCBnb190b19zcGVlZCAgICAgICAgIC8qIGdldCBhZGRyIG9mIGNsb2NrIHNldHRpbmcgY29kZSAqLworICAgICAgICBtb3YgICAgIHIyLCAjMzg0ICAgICAgICAgICAgICAgIC8qIHIyIHNpemUgdG8gY29weSAoZGl2IGJ5IDMyIGJ5dGVzKSAqLworICAgICAgICBtb3YgICAgIHIxLCByMSAgICAgICAgICAgICAgICAgIC8qIHIxIDwtIGRlc3QgYWRkcmVzcyAocGFzc2VkIGluKSAqLworICAgICAgICBhZGQgICAgIHIyLCByMiwgcjAgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworbmV4dDI6CisgICAgICAgIGxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKyAgICAgICAgc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworICAgICAgICBjbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisgICAgICAgIGJuZSAgICAgbmV4dDIKKwltb3YJcGMsIGxyICAgICAgICAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTk9URTogMzQzMCBYLWxvYWRlciBjdXJyZW50bHkgZG9lcyBub3QgdXNlIHRoaXMgY29kZS4KKyogICBJdCBjb3VsZCBiZSByZW1vdmVkIGl0cyBpcyBrZXB0IGZvciBjb21wYXRhYmlseSB3aXRoIHUtYm9vdC4KKyAqCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBDTV9DTEtFTl9QTEwtYnlwYXNzIHZhbHVlCisgKiAgUjEgPSBDTV9DTEtTRUwxX1BMTC1tLCBuLCBhbmQgZGl2aWRlciB2YWx1ZXMKKyAqICBSMiA9IENNX0NMS1NFTF9DT1JFLWRpdmlkZXIgdmFsdWVzCisgKiAgUjMgPSBDTV9JRExFU1RfQ0tHRU4gLSBhZGRyIGRwbGwgbG9jayB3YWl0CisgKgorICogIE5vdGU6IElmIGNvcmUgdW5sb2Nrcy9yZWxvY2tzIGFuZCBTRFJBTSBpcyBydW5uaW5nIGZhc3QgYWxyZWFkeSBpdCBnZXRzCisgKiAgICAgICAgY29uZnVzZWQuICBBIHJlc2V0IG9mIHRoZSBjb250cm9sbGVyIGdldHMgaXQgYmFjay4gIFRha2luZyBhd2F5IGl0cworICogICAgICAgIEwzIHdoZW4gaXRzIG5vdCBpbiBzZWxmIHJlZnJlc2ggc2VlbXMgYmFkIGZvciBpdC4gIE5vcm1hbGx5LCB0aGlzIGNvZGUKKyAqICAgICAgICBydW5zIGZyb20gZmxhc2ggYmVmb3JlIFNEUiBpcyBpbml0IHNvIHRoYXQgc2hvdWxkIGJlIG9rLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3RtZmQgc3AhLCB7cjQtcjZ9CisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI0LCBwbGxfY3RsX2FkZAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdCit3YWl0MToKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYmVxICAgICB3YWl0MSAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDEKKyAgICAgICAgc3RyICAgICByMSwgW3I1XSAgICAgICAgICAvKiBzZXQgbSwgbiwgbTIgKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQyCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgLyogc2V0IGwzL2w0Ly4uIGRpdmlkZXJzKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQzICAvKiB3a3VwICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsMyAgLyogcnNtIHZhbCAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNCAgLyogZ2Z4ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNSAgLyogZW11ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNQorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmczX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnM192YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc0X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNF92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc1X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNV92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmcxX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgW3I1XQorICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBsb2NrIERQTEwzIGFuZCB3YWl0IGEgYml0ICovCisgICAgICAgIG9yciAgICAgcjAsIHIwLCAjMHg3ICAgLyogc2V0IHVwIGZvciBsb2NrIG1vZGUgKi8KKyAgICAgICAgc3RyICAgICByMCwgW3I0XSAgICAgICAvKiBsb2NrICovCisgICAgICAgIG5vcCAgICAgICAgICAgICAgICAgICAgLyogQVJNIHNsb3cgYXQgdGhpcyBwb2ludCB3b3JraW5nIGF0IHN5c19jbGsgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKK3dhaXQyOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBibmUgICAgIHdhaXQyICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIGxkbWZkIHNwISwge3I0LXI2fQorICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLworCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworLyogVGhlIE5vciBoYXMgdG8gYmUgaW4gdGhlIEZsYXNoIEJhc2UgQ1MwIGZvciB0aGlzIGNvbmRpdGlvbiB0byBoYXBwZW4gKi8KK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUcxKQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkICAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUczKQorZmxhc2hfY2ZnM192YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzQpCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc0CitmbGFzaF9jZmc1X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc1CitmbGFzaF9jZmc1X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNSkKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX2Rpdl9hZGQxOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMCitwbGxfZGl2X2FkZDI6CisgICAgLndvcmQgQ01fQ0xLU0VMX0NPUkUKK3BsbF9kaXZfYWRkMzoKKyAgICAud29yZCBDTV9DTEtTRUxfV0tVUAorcGxsX2Rpdl92YWwzOgorICAgIC53b3JkIChXS1VQX1JTTSA8PCAxKQorcGxsX2Rpdl9hZGQ0OgorICAgIC53b3JkIENNX0NMS1NFTF9HRlgKK3BsbF9kaXZfdmFsNDoKKyAgICAud29yZCAoR0ZYX0RJViA8PCAwKQorcGxsX2Rpdl9hZGQ1OgorICAgIC53b3JkIENNX0NMS1NFTDFfRU1VCitwbGxfZGl2X3ZhbDU6CisgICAgLndvcmQgQ0xTRUwxX0VNVV9WQUwKKworI2VuZGlmCisKKy5nbG9ibCBsb3dsZXZlbF9pbml0Citsb3dsZXZlbF9pbml0OgorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisgICAgICAgIGJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCisKKy8qIERQTEwoMS00KSBQQVJBTSBUQUJMRVMgKi8KKy8qIEVhY2ggb2YgdGhlIHRhYmxlcyBoYXMgTSwgTiwgRlJFUVNFTCwgTTIgdmFsdWVzIGRlZmluZWQgZm9yIG5vbWluYWwKKyAqIE9QUCAoMS4yVikuIFRoZSBmaWVsZHMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIGRwbGxfcGFyYW0gc3RydWN0KGNsb2NrLmMpLgorICogVGhlIHZhbHVlcyBhcmUgZGVmaW5lZCBmb3IgYWxsIHBvc3NpYmxlIHN5c2NsayBhbmQgZm9yIEVTMSBhbmQgRVMyLgorICovCisKK21wdV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDUKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxRjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3OQorLndvcmQgMHgxMgorLndvcmQgMHgwNAorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgxOQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUZBCisud29yZCAweDMyCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9tcHVfZHBsbF9wYXJhbQorZ2V0X21wdV9kcGxsX3BhcmFtOgorCWFkciByMCwgbXB1X2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2l2YV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNjgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA4MgorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgwQgorLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTNGCisud29yZCAweDMwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDE3Cisud29yZCAweDA2Cisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9pdmFfZHBsbF9wYXJhbQorZ2V0X2l2YV9kcGxsX3BhcmFtOgorCWFkciByMCwgaXZhX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2NvcmVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDBFCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDEwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTRDCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MjEKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisuZ2xvYmwgZ2V0X2NvcmVfZHBsbF9wYXJhbQorZ2V0X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGNvcmVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogUEVSIERQTEwgdmFsdWVzIGFyZSBzYW1lIGZvciBib3RoIEVTMSBhbmQgRVMyICovCitwZXJfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDEzTUh6ICovCisud29yZCAweDFCMAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwOQorCisvKiAxOS4yTUh6ICovCisud29yZCAweEUxCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDI2TUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDM4LjRNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MTMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLmdsb2JsIGdldF9wZXJfZHBsbF9wYXJhbQorZ2V0X3Blcl9kcGxsX3BhcmFtOgorCWFkciByMCwgcGVyX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qCisgKiBUYWJsZXMgZm9yIDM2eC8zN3ggZGV2aWNlcworICoKKyAqIChQb3B1bGF0ZWQgZm9yIDEzTUh6IG9ubHkpCisgKi8KK21wdV8zNnhfZHBsbF9wYXJhbToKKy53b3JkIDMwMCwgMTIsIDAsIDEKKy53b3JkIDMwMCwgMTIsIDAsIDEKKy53b3JkIDMwMCwgMTIsIDAsIDEKKy53b3JkIDMwMCwgMTIsIDAsIDEKKworaXZhXzM2eF9kcGxsX3BhcmFtOgorLndvcmQgMTAsIDAsIDAsIDEKKy53b3JkIDEwLCAwLCAwLCAxCisud29yZCAxMCwgMCwgMCwgMQorLndvcmQgMTAsIDAsIDAsIDEKKworY29yZV8zNnhfZHBsbF9wYXJhbToKKy53b3JkIDIwMCwgMTIsIDAsIDEKKy53b3JkIDIwMCwgMTIsIDAsIDEKKy53b3JkIDIwMCwgMTIsIDAsIDEKKy53b3JkIDIwMCwgMTIsIDAsIDEKKworcGVyXzM2eF9kcGxsX3BhcmFtOgorLyogICAgU1lTQ0xLICAgICBNICAgICAgTiAgICAgIE0yICAgICAgTTMgICAgICBNNCAgICAgTTUgICAgICBNNiAgICAgIG0yRElWICovCisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQorLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEKKy53b3JkIDI2MDAwLCAgICA0MzIsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQorCisuZ2xvYmwgZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbQorZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIG1wdV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0KK2dldF8zNnhfaXZhX2RwbGxfcGFyYW06CisJYWRyCXIwLCBpdmFfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbQorZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW06CisJYWRyCXIwLCBjb3JlXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbQorZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbToKKwlhZHIJcjAsIHBlcl8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVmMzUyZDMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS94LWxvYWQubGRzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBOb3ZlbWJlciAyMDA2IC0gQ2hhbmdlZCB0byBzdXBwb3J0IDM0MzBzZHAgZGV2aWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZHMuY2ZnIGIveC1sb2FkZXIvYm9hcmRzLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTBhOTIxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmRzLmNmZwpAQCAtMCwwICsxLDI2IEBACisjCisjIExpc3Qgb2YgYm9hcmRzCisjCisjIFN5bnRheDoKKyMgICAgICAgIHdoaXRlLXNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGVudHJpZXM7CisjICAgICAgICBlYWNoIGVudHJ5IGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyMKKyMgICAgICAgIFRhcmdldG5hbWUgIEFyY2hpdGVjdHVyZSAgQ1BVICBCb2FyZG5hbWUgIFZlbmRvciAgU29DCisjCisjICAgICAgICBVbnVzZWQgZmllbGRzIGNhbiBiZSBzcGVjaWZpZWQgYXMgIi0iLCBvciBvbWl0dGVkIGlmIHRoZXkKKyMgICAgICAgIGFyZSB0aGUgbGFzdCBmaWVsZCBvbiB0aGUgbGluZS4KKyMKKyMgICAgICAgIExpbmVzIHN0YXJ0aW5nIHdpdGggJyMnIGFyZSBjb21tZW50cy4KKyMgICAgICAgIEJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkLgorIworIyBUbyBrZWVwIHRoZSBsaXN0IHNvcnRlZCwgdXNlIHNvbWV0aGluZyBsaWtlCisjCisjICAgICAgICA6LiwkISBzb3J0IC1mIC1rMiwyIC1rMywzIC1rNiw2IC1rNSw1IC1rMSwxCisjCisjIFRhcmdldCAgICAgICAgICAgIEFSQ0ggICAgICAgU29DICAgICAgICAgICAgIEJvYXJkIG5hbWUgICAgICAgIFZlbmRvciAgICAgICAgICAgICAgICBTb0MKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkaWFtb25kICAgICAgICAgICAgIGFybSAgICAgICAgb21hcDMgICAgICAgICAgIGRpYW1vbmQgICAgICAgICAgIG5lc3QKK2RpYW1vbmQtdXNiLWxvYWRlciAgYXJtICAgICAgICBvbWFwMyAgICAgICAgICAgZGlhbW9uZC11c2ItbG9hZGVyIG5lc3QKK2o0OSAgICAgICAgICAgICAgICAgYXJtICAgICAgICBvbWFwMyAgICAgICAgICAgajQ5ICAgICAgICAgICAgICAgbmVzdAorajQ5LXVzYi1sb2FkZXIgICAgICBhcm0gICAgICAgIG9tYXAzICAgICAgICAgICBqNDktdXNiLWxvYWRlciAgICBuZXN0CmRpZmYgLS1naXQgYS94LWxvYWRlci9jb21tb24vTWFrZWZpbGUgYi94LWxvYWRlci9jb21tb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmNzJiYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NvbW1vbi9NYWtlZmlsZQpAQCAtMCwwICsxLDU0IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYmNvbW1vbi5hCisKK0FPQkpTCT0KKworIyBjb3JlCitDT0JKUy15ICs9IGJvb3RtLm8KK0NPQkpTLXkgKz0gbWFpbi5vCitDT0JKUy15ICs9IGNvbnNvbGUubworQ09CSlMteSArPSBpbWFnZS5vCisKK0NPQkpTCTo9ICQoc29ydCAkKENPQkpTLXkpKQorU1JDUwk6PSAkKEFPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChBT0JKUykgJChDT0JKUykpCisKK0NQUEZMQUdTICs9IC1JLi4KKworYWxsOgkkKExJQikgJChBT0JKUykKKworJChMSUIpOiAkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NvbW1vbi9ib290bS5jIGIveC1sb2FkZXIvY29tbW9uL2Jvb3RtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiYTIyMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NvbW1vbi9ib290bS5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwIEdyYW50IEVyaWNrc29uIDxtYXJhdGhvbjk2QGdtYWlsLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdGhhdCBib290IHRoZSBzZWNvbmQtc3RhZ2UKKyAqICAgICAgYm9vdCBsb2FkZXIgZnJvbSBtZW1vcnksIGluIGVpdGhlciByYXcsIGJpbmFyeSBmb3JtYXQgb3IKKyAqICAgICAgaW4gdS1ib290ICdta2ltYWdlJyBmb3JtYXQuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGJvb3RtLmg+CisjaW5jbHVkZSA8aW1hZ2UuaD4KKwordHlwZWRlZiB2b2lkIChzcGwpKHZvaWQpOworCitzdGF0aWMgdm9pZCBleGVjKHVsb25nIGFkZHJlc3MsIGNvbnN0IGNoYXIgKndoYXQpCit7CisJcHJpbnRmKCJcblN0YXJ0aW5nICVzIC4uLiIsIHdoYXQpOworCisJKChzcGwgKilhZGRyZXNzKSgpOworfQorCitpbnQgYm9vdG0oY29uc3QgdWludDhfdCAqYnVmZmVyKQoreworCWludCBzdGF0dXMgPSBCT09UTV9TVEFUVVNfRkFJTFVSRTsKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkKKwljb25zdCBpbnQgZm9ybWF0ID0gZ2VuaW1nX2dldF9mb3JtYXQoKHZvaWQgKilidWZmZXIpOworCWNvbnN0IGltYWdlX2hlYWRlcl90ICogaGVhZGVyID0gKGNvbnN0IGltYWdlX2hlYWRlcl90ICopYnVmZmVyOworCisJc3dpdGNoIChmb3JtYXQpIHsKKworCWNhc2UgSU1BR0VfRk9STUFUX0xFR0FDWToKKwkJc3RhdHVzID0gYm9vdG1faW1hZ2UoaGVhZGVyKTsKKwkJYnJlYWs7CisKKwljYXNlIElNQUdFX0ZPUk1BVF9GSVQ6CisJCXByaW50ZigiVW5zdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0IEZJVCAoJWQpXG4iLCBmb3JtYXQpOworCQlicmVhazsKKworCWNhc2UgSU1BR0VfRk9STUFUX0lOVkFMSUQ6CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJVbmtub3duIG9yIGludmFsaWQgaW1hZ2UgZm9ybWF0ICglZClcbiIsIGZvcm1hdCk7CisJCWJyZWFrOworCisJfQorI2Vsc2UKKwlzdGF0dXMgPSBib290bV9iaW5hcnkoYnVmZmVyKTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkgKi8KKworCXJldHVybiAoc3RhdHVzKTsKK30KKworaW50IGJvb3RtX2JpbmFyeShjb25zdCB1aW50OF90ICpidWZmZXIpCit7CisJLyogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuLiAqLworCisJZXhlYygodWxvbmcpYnVmZmVyLCAic2Vjb25kLXN0YWdlIGJvb3QgbG9hZGVyIik7CisKKwkvKiBIb3dldmVyLCBpZiBpdCBkb2VzLCByZXR1cm4gZmFpbGVkIHN0YXR1cy4gKi8KKworCXJldHVybiAoQk9PVE1fU1RBVFVTX0ZBSUxVUkUpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVE1fSU1BR0UpCitpbnQgYm9vdG1faW1hZ2UoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhlYWRlcikKK3sKKwljb25zdCBjaGFyICogZmFpbHVyZSA9IE5VTEw7CisJY29uc3QgY2hhciAqIHR5cGVfbmFtZSA9IE5VTEw7CisJdWludDMyX3QgbG9hZCwgaW1hZ2Vfc3RhcnQsIGltYWdlX2xlbjsKKworCS8qIERpc3BsYXkgdG8gc3RhbmRhcmQgb3V0cHV0IHRoZSBpbWFnZSBjb250ZW50cy4gKi8KKworCWltYWdlX3ByaW50X2NvbnRlbnRzKGhlYWRlcik7CisKKwkvKiBWYWxpZGF0ZSB0aGUgaW1hZ2UgaGVhZGVyIGFuZCBpbWFnZSBkYXRhIENSQ3MgKi8KKworCXB1dHMoIiAgIFZlcmlmeWluZyBDaGVja3N1bSAuLi4gIik7CisKKwl7CisJCWlmICghaW1hZ2VfY2hlY2tfaGNyYyhoZWFkZXIpKSB7CisJCQlmYWlsdXJlID0gIkhlYWRlciBJbnZhbGlkXG4iOworCQkJZ290byBmYWlsOworCQl9CisKKwkJaWYgKCFpbWFnZV9jaGVja19kY3JjKGhlYWRlcikpIHsKKwkJCWZhaWx1cmUgPSAiRGF0YSBJbnZhbGlkXG4iOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJcHV0cygiT0tcbiIpOworCisJLyogV2UgT05MWSBzdXBwb3J0IHVuY29tcHJlc3NlZCBBUk0gVS1Cb290IGZpcm13YXJlIGltYWdlcy4gQ2hlY2sKKwkgKiB0byBtYWtlIHN1cmUgdGhhdCdzIHdoYXQgd2UgYXJlIGdvaW5nIHRvIGJvb3QuCisJICovCisKKwlpZiAoIWltYWdlX2NoZWNrX3R5cGUoaGVhZGVyLCBJSF9UWVBFX0ZJUk1XQVJFKSkgeworCQlmYWlsdXJlID0gIkltYWdlIGlzIG5vdCBhIGZpcm13YXJlIGltYWdlXG4iOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCFpbWFnZV9jaGVja19vcyhoZWFkZXIsIElIX09TX1VfQk9PVCkpIHsKKwkJZmFpbHVyZSA9ICJJbWFnZSBpcyBub3QgdS1ib290IGZpcm13YXJlXG4iOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKGltYWdlX2dldF9jb21wKGhlYWRlcikgIT0gSUhfQ09NUF9OT05FKSB7CisJCWZhaWx1cmUgPSAiSW1hZ2UgaXMgY29tcHJlc3NlZFxuIjsKKwkJZ290byBmYWlsOworCX0KKworCWlmICghaW1hZ2VfY2hlY2tfdGFyZ2V0X2FyY2goaGVhZGVyKSkgeworCQlmYWlsdXJlID0gIkltYWdlIGlzIG5vdCBidWlsdCBmb3IgdGhpcyBwcm9jZXNzb3JcbiI7CisJCWdvdG8gZmFpbDsKKwl9CisKKwl0eXBlX25hbWUgPSBnZW5pbWdfZ2V0X3R5cGVfbmFtZShpbWFnZV9nZXRfdHlwZShoZWFkZXIpKTsKKworCXByaW50ZigiICAgTG9hZGluZyAlcyAuLi4gIiwgdHlwZV9uYW1lKTsKKworCXsKKwkJbG9hZCA9IGltYWdlX2dldF9sb2FkKGhlYWRlcik7CisJCWltYWdlX3N0YXJ0ID0gaW1hZ2VfZ2V0X2RhdGEoaGVhZGVyKTsKKwkJaW1hZ2VfbGVuID0gaW1hZ2VfZ2V0X2RhdGFfc2l6ZShoZWFkZXIpOworCisJCW1lbW1vdmVfd2QoKHZvaWQgKilsb2FkLCAodm9pZCAqKWltYWdlX3N0YXJ0LCBpbWFnZV9sZW4sIENIVU5LU1opOworCX0KKworCXB1dHMoIk9LXG4iKTsKKworCS8qIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybi4gKi8KKworCWV4ZWMobG9hZCwgdHlwZV9uYW1lKTsKKworCS8qIEhvd2V2ZXIsIGlmIGl0IGRvZXMsIHJldHVybiBmYWlsZWQgc3RhdHVzLiAqLworCisgZmFpbDoKKwlwdXRzKGZhaWx1cmUpOworCisJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQk9PVE1fSU1BR0UpICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9jb21tb24vY29uc29sZS5jIGIveC1sb2FkZXIvY29tbW9uL2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWEzY2I3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY29tbW9uL2NvbnNvbGUuYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBQYW9sbyBTY2FmZmFyZGksIEFJUlZFTlQgU0FNIHMucC5hIC0gUklNSU5JKElUQUxZKSwgYXJzZW5pb0B0aW4uaXQKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKK3ZvaWQgcHV0cyhjb25zdCBjaGFyICpzKQoreworCXNlcmlhbF9wdXRzKHMpOworfQorCmRpZmYgLS1naXQgYS94LWxvYWRlci9jb21tb24vaW1hZ2UuYyBiL3gtbG9hZGVyL2NvbW1vbi9pbWFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTZlOTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jb21tb24vaW1hZ2UuYwpAQCAtMCwwICsxLDI1NDEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDggU2VtaWhhbGYKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIFVTRV9IT1NUQ0MKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorCisjaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUworI2luY2x1ZGUgPHN0YXR1c19sZWQuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0hBU19EQVRBRkxBU0gKKyNpbmNsdWRlIDxkYXRhZmxhc2guaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0xPR0JVRkZFUgorI2luY2x1ZGUgPGxvZ2J1ZmYuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKSB8fCBkZWZpbmVkKENPTkZJR19DTURfREFURSkKKyNpbmNsdWRlIDxydGMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8aW1hZ2UuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkgfHwgZGVmaW5lZCAoQ09ORklHX09GX0xJQkZEVCkKKyNpbmNsdWRlIDxmZHQuaD4KKyNpbmNsdWRlIDxsaWJmZHQuaD4KKyNpbmNsdWRlIDxmZHRfc3VwcG9ydC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisjaW5jbHVkZSA8dS1ib290L21kNS5oPgorI2luY2x1ZGUgPHNoYTEuaD4KKworc3RhdGljIGludCBmaXRfY2hlY2tfcmFtZGlzayAoY29uc3Qgdm9pZCAqZml0LCBpbnQgb3Nfbm9mZnNldCwKKwkJdWludDhfdCBhcmNoLCBpbnQgdmVyaWZ5KTsKKyNlbmRpZgorCisjZWxzZQorI2luY2x1ZGUgIm1raW1hZ2UuaCIKKyNpbmNsdWRlIDx1LWJvb3QvbWQ1Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGltYWdlLmg+CisjZW5kaWYgLyogIVVTRV9IT1NUQ0MqLworCitzdGF0aWMgdGFibGVfZW50cnlfdCB1aW1hZ2VfYXJjaFtdID0geworCXsJSUhfQVJDSF9JTlZBTElELAlOVUxMLAkJIkludmFsaWQgQVJDSCIsCX0sCisJewlJSF9BUkNIX0FMUEhBLAkJImFscGhhIiwJIkFscGhhIiwJfSwKKwl7CUlIX0FSQ0hfQVJNLAkJImFybSIsCQkiQVJNIiwJCX0sCisJewlJSF9BUkNIX0kzODYsCQkieDg2IiwJCSJJbnRlbCB4ODYiLAl9LAorCXsJSUhfQVJDSF9JQTY0LAkJImlhNjQiLAkJIklBNjQiLAkJfSwKKwl7CUlIX0FSQ0hfTTY4SywJCSJtNjhrIiwJCSJNNjhLIiwJCX0sCisJewlJSF9BUkNIX01JQ1JPQkxBWkUsCSJtaWNyb2JsYXplIiwJIk1pY3JvQmxhemUiLAl9LAorCXsJSUhfQVJDSF9NSVBTLAkJIm1pcHMiLAkJIk1JUFMiLAkJfSwKKwl7CUlIX0FSQ0hfTUlQUzY0LAkJIm1pcHM2NCIsCSJNSVBTIDY0IEJpdCIsCX0sCisJewlJSF9BUkNIX05JT1MyLAkJIm5pb3MyIiwJIk5JT1MgSUkiLAl9LAorCXsJSUhfQVJDSF9QUEMsCQkicG93ZXJwYyIsCSJQb3dlclBDIiwJfSwKKwl7CUlIX0FSQ0hfUFBDLAkJInBwYyIsCQkiUG93ZXJQQyIsCX0sCisJewlJSF9BUkNIX1MzOTAsCQkiczM5MCIsCQkiSUJNIFMzOTAiLAl9LAorCXsJSUhfQVJDSF9TSCwJCSJzaCIsCQkiU3VwZXJIIiwJfSwKKwl7CUlIX0FSQ0hfU1BBUkMsCQkic3BhcmMiLAkiU1BBUkMiLAl9LAorCXsJSUhfQVJDSF9TUEFSQzY0LAkic3BhcmM2NCIsCSJTUEFSQyA2NCBCaXQiLAl9LAorCXsJSUhfQVJDSF9CTEFDS0ZJTiwJImJsYWNrZmluIiwJIkJsYWNrZmluIiwJfSwKKwl7CUlIX0FSQ0hfQVZSMzIsCQkiYXZyMzIiLAkiQVZSMzIiLAl9LAorCXsJLTEsCQkJIiIsCQkiIiwJCX0sCit9OworCitzdGF0aWMgdGFibGVfZW50cnlfdCB1aW1hZ2Vfb3NbXSA9IHsKKwl7CUlIX09TX0lOVkFMSUQsCU5VTEwsCQkiSW52YWxpZCBPUyIsCQl9LAorCXsJSUhfT1NfTElOVVgsCSJsaW51eCIsCSJMaW51eCIsCQl9LAorI2lmIGRlZmluZWQoQ09ORklHX0xZTlhLREkpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKKwl7CUlIX09TX0xZTlhPUywJImx5bnhvcyIsCSJMeW54T1MiLAkJfSwKKyNlbmRpZgorCXsJSUhfT1NfTkVUQlNELAkibmV0YnNkIiwJIk5ldEJTRCIsCQl9LAorCXsJSUhfT1NfUlRFTVMsCSJydGVtcyIsCSJSVEVNUyIsCQl9LAorCXsJSUhfT1NfVV9CT09ULAkidS1ib290IiwJIlUtQm9vdCIsCQl9LAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FTEYpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKKwl7CUlIX09TX1FOWCwJInFueCIsCQkiUU5YIiwJCQl9LAorCXsJSUhfT1NfVlhXT1JLUywJInZ4d29ya3MiLAkiVnhXb3JrcyIsCQl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfSU5URUdSSVRZKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCisJewlJSF9PU19JTlRFR1JJVFksImludGVncml0eSIsCSJJTlRFR1JJVFkiLAkJfSwKKyNlbmRpZgorI2lmZGVmIFVTRV9IT1NUQ0MKKwl7CUlIX09TXzRfNEJTRCwJIjRfNGJzZCIsCSI0XzRCU0QiLAkJfSwKKwl7CUlIX09TX0RFTEwsCSJkZWxsIiwJCSJEZWxsIiwJCQl9LAorCXsJSUhfT1NfRVNJWCwJImVzaXgiLAkJIkVzaXgiLAkJCX0sCisJewlJSF9PU19GUkVFQlNELAkiZnJlZWJzZCIsCSJGcmVlQlNEIiwJCX0sCisJewlJSF9PU19JUklYLAkiaXJpeCIsCQkiSXJpeCIsCQkJfSwKKwl7CUlIX09TX05DUiwJIm5jciIsCQkiTkNSIiwJCQl9LAorCXsJSUhfT1NfT1BFTkJTRCwJIm9wZW5ic2QiLAkiT3BlbkJTRCIsCQl9LAorCXsJSUhfT1NfUFNPUywJInBzb3MiLAkJInBTT1MiLAkJCX0sCisJewlJSF9PU19TQ08sCSJzY28iLAkJIlNDTyIsCQkJfSwKKwl7CUlIX09TX1NPTEFSSVMsCSJzb2xhcmlzIiwJIlNvbGFyaXMiLAkJfSwKKwl7CUlIX09TX1NWUjQsCSJzdnI0IiwJCSJTVlI0IiwJCQl9LAorI2VuZGlmCisJewktMSwJCSIiLAkJIiIsCQkJfSwKK307CisKK3N0YXRpYyB0YWJsZV9lbnRyeV90IHVpbWFnZV90eXBlW10gPSB7CisJewlJSF9UWVBFX0lOVkFMSUQsICAgIE5VTEwsCSAgIkludmFsaWQgSW1hZ2UiLAl9LAorCXsJSUhfVFlQRV9GSUxFU1lTVEVNLCAiZmlsZXN5c3RlbSIsICJGaWxlc3lzdGVtIEltYWdlIiwJfSwKKwl7CUlIX1RZUEVfRklSTVdBUkUsICAgImZpcm13YXJlIiwJICAiRmlybXdhcmUiLAkJfSwKKwl7CUlIX1RZUEVfS0VSTkVMLAkgICAgImtlcm5lbCIsCSAgIktlcm5lbCBJbWFnZSIsCX0sCisJewlJSF9UWVBFX01VTFRJLAkgICAgIm11bHRpIiwJICAiTXVsdGktRmlsZSBJbWFnZSIsCX0sCisJewlJSF9UWVBFX1JBTURJU0ssICAgICJyYW1kaXNrIiwJICAiUkFNRGlzayBJbWFnZSIsCX0sCisJewlJSF9UWVBFX1NDUklQVCwgICAgICJzY3JpcHQiLAkgICJTY3JpcHQiLAkJfSwKKwl7CUlIX1RZUEVfU1RBTkRBTE9ORSwgInN0YW5kYWxvbmUiLCAiU3RhbmRhbG9uZSBQcm9ncmFtIiwgfSwKKwl7CUlIX1RZUEVfRkxBVERULCAgICAgImZsYXRfZHQiLCAgICAiRmxhdCBEZXZpY2UgVHJlZSIsCX0sCisJewlJSF9UWVBFX0tXQklNQUdFLCAgICJrd2JpbWFnZSIsICAgIktpcmt3b29kIEJvb3QgSW1hZ2UiLH0sCisJewlJSF9UWVBFX0lNWElNQUdFLCAgICJpbXhpbWFnZSIsICAgIkZyZWVzY2FsZSBpLk1YIEJvb3QgSW1hZ2UiLH0sCisJewktMSwJCSAgICAiIiwJCSAgIiIsCQkJfSwKK307CisKK3N0YXRpYyB0YWJsZV9lbnRyeV90IHVpbWFnZV9jb21wW10gPSB7CisJewlJSF9DT01QX05PTkUsCSJub25lIiwJCSJ1bmNvbXByZXNzZWQiLAkJfSwKKwl7CUlIX0NPTVBfQlpJUDIsCSJiemlwMiIsCSJiemlwMiBjb21wcmVzc2VkIiwJfSwKKwl7CUlIX0NPTVBfR1pJUCwJImd6aXAiLAkJImd6aXAgY29tcHJlc3NlZCIsCX0sCisJewlJSF9DT01QX0xaTUEsCSJsem1hIiwJCSJsem1hIGNvbXByZXNzZWQiLAl9LAorCXsJSUhfQ09NUF9MWk8sCSJsem8iLAkJImx6byBjb21wcmVzc2VkIiwJfSwKKwl7CS0xLAkJIiIsCQkiIiwJCQl9LAorfTsKKwordWludDMyX3QgY3JjMzIgKHVpbnQzMl90LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVpbnQpOwordWludDMyX3QgY3JjMzJfd2QgKHVpbnQzMl90LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVpbnQsIHVpbnQpOworI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKK3N0YXRpYyB2b2lkIGdlbmltZ19wcmludF90aW1lICh0aW1lX3QgdGltZXN0YW1wKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMZWdhY3kgZm9ybWF0IHJvdXRpbmVzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaW1hZ2VfY2hlY2tfaGNyYyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwl1bG9uZyBoY3JjOworCXVsb25nIGxlbiA9IGltYWdlX2dldF9oZWFkZXJfc2l6ZSAoKTsKKwlpbWFnZV9oZWFkZXJfdCBoZWFkZXI7CisKKwkvKiBDb3B5IGhlYWRlciBzbyB3ZSBjYW4gYmxhbmsgQ1JDIGZpZWxkIGZvciByZS1jYWxjdWxhdGlvbiAqLworCW1lbW1vdmUgKCZoZWFkZXIsIChjaGFyICopaGRyLCBpbWFnZV9nZXRfaGVhZGVyX3NpemUgKCkpOworCWltYWdlX3NldF9oY3JjICgmaGVhZGVyLCAwKTsKKworCWhjcmMgPSBjcmMzMiAoMCwgKHVuc2lnbmVkIGNoYXIgKikmaGVhZGVyLCBsZW4pOworCisJcmV0dXJuIChoY3JjID09IGltYWdlX2dldF9oY3JjIChoZHIpKTsKK30KKworaW50IGltYWdlX2NoZWNrX2RjcmMgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJdWxvbmcgZGF0YSA9IGltYWdlX2dldF9kYXRhIChoZHIpOworCXVsb25nIGxlbiA9IGltYWdlX2dldF9kYXRhX3NpemUgKGhkcik7CisJdWxvbmcgZGNyYyA9IGNyYzMyX3dkICgwLCAodW5zaWduZWQgY2hhciAqKWRhdGEsIGxlbiwgQ0hVTktTWl9DUkMzMik7CisKKwlyZXR1cm4gKGRjcmMgPT0gaW1hZ2VfZ2V0X2RjcmMgKGhkcikpOworfQorCisvKioKKyAqIGltYWdlX211bHRpX2NvdW50IC0gZ2V0IGNvbXBvbmVudCAoc3ViLWltYWdlKSBjb3VudAorICogQGhkcjogcG9pbnRlciB0byB0aGUgaGVhZGVyIG9mIHRoZSBtdWx0aSBjb21wb25lbnQgaW1hZ2UKKyAqCisgKiBpbWFnZV9tdWx0aV9jb3VudCgpIHJldHVybnMgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gYSBtdWx0aQorICogY29tcG9uZW50IGltYWdlLgorICoKKyAqIE5vdGU6IG5vIGNoZWNraW5nIG9mIHRoZSBpbWFnZSB0eXBlIGlzIGRvbmUsIGNhbGxlciBtdXN0IHBhc3MKKyAqIGEgdmFsaWQgbXVsdGkgY29tcG9uZW50IGltYWdlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgbnVtYmVyIG9mIGNvbXBvbmVudHMKKyAqLwordWxvbmcgaW1hZ2VfbXVsdGlfY291bnQgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJdWxvbmcgaSwgY291bnQgPSAwOworCXVpbnQzMl90ICpzaXplOworCisJLyogZ2V0IHN0YXJ0IG9mIHRoZSBpbWFnZSBwYXlsb2FkLCB3aGljaCBpbiBjYXNlIG9mIG11bHRpCisJICogY29tcG9uZW50IGltYWdlcyB0aGF0IHBvaW50cyB0byBhIHRhYmxlIG9mIGNvbXBvbmVudCBzaXplcyAqLworCXNpemUgPSAodWludDMyX3QgKilpbWFnZV9nZXRfZGF0YSAoaGRyKTsKKworCS8qIGNvdW50IG5vbiBlbXB0eSBzbG90cyAqLworCWZvciAoaSA9IDA7IHNpemVbaV07ICsraSkKKwkJY291bnQrKzsKKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBpbWFnZV9tdWx0aV9nZXRpbWcgLSBnZXQgY29tcG9uZW50IGRhdGEgYWRkcmVzcyBhbmQgc2l6ZQorICogQGhkcjogcG9pbnRlciB0byB0aGUgaGVhZGVyIG9mIHRoZSBtdWx0aSBjb21wb25lbnQgaW1hZ2UKKyAqIEBpZHg6IGluZGV4IG9mIHRoZSByZXF1ZXN0ZWQgY29tcG9uZW50CisgKiBAZGF0YTogcG9pbnRlciB0byBhIHVsb25nIHZhcmlhYmxlLCB3aWxsIGhvbGQgY29tcG9uZW50IGRhdGEgYWRkcmVzcworICogQGxlbjogcG9pbnRlciB0byBhIHVsb25nIHZhcmlhYmxlLCB3aWxsIGhvbGQgY29tcG9uZW50IHNpemUKKyAqCisgKiBpbWFnZV9tdWx0aV9nZXRpbWcoKSByZXR1cm5zIHNpemUgYW5kIGRhdGEgYWRkcmVzcyBmb3IgdGhlIHJlcXVlc3RlZAorICogY29tcG9uZW50IGluIGEgbXVsdGkgY29tcG9uZW50IGltYWdlLgorICoKKyAqIE5vdGU6IG5vIGNoZWNraW5nIG9mIHRoZSBpbWFnZSB0eXBlIGlzIGRvbmUsIGNhbGxlciBtdXN0IHBhc3MKKyAqIGEgdmFsaWQgbXVsdGkgY29tcG9uZW50IGltYWdlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgZGF0YSBhZGRyZXNzIGFuZCBzaXplIG9mIHRoZSBjb21wb25lbnQsIGlmIGlkeCBpcyB2YWxpZAorICogICAgIDAgaW4gZGF0YSBhbmQgbGVuLCBpZiBpZHggaXMgb3V0IG9mIHJhbmdlCisgKi8KK3ZvaWQgaW1hZ2VfbXVsdGlfZ2V0aW1nIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyLCB1bG9uZyBpZHgsCisJCQl1bG9uZyAqZGF0YSwgdWxvbmcgKmxlbikKK3sKKwlpbnQgaTsKKwl1aW50MzJfdCAqc2l6ZTsKKwl1bG9uZyBvZmZzZXQsIGNvdW50LCBpbWdfZGF0YTsKKworCS8qIGdldCBudW1iZXIgb2YgY29tcG9uZW50ICovCisJY291bnQgPSBpbWFnZV9tdWx0aV9jb3VudCAoaGRyKTsKKworCS8qIGdldCBzdGFydCBvZiB0aGUgaW1hZ2UgcGF5bG9hZCwgd2hpY2ggaW4gY2FzZSBvZiBtdWx0aQorCSAqIGNvbXBvbmVudCBpbWFnZXMgdGhhdCBwb2ludHMgdG8gYSB0YWJsZSBvZiBjb21wb25lbnQgc2l6ZXMgKi8KKwlzaXplID0gKHVpbnQzMl90ICopaW1hZ2VfZ2V0X2RhdGEgKGhkcik7CisKKwkvKiBnZXQgYWRkcmVzcyBvZiB0aGUgcHJvcGVyIGNvbXBvbmVudCBkYXRhIHN0YXJ0LCB3aGljaCBtZWFucworCSAqIHNraXBwaW5nIHNpemVzIHRhYmxlIChhZGQgMSBmb3IgbGFzdCwgbnVsbCBlbnRyeSkgKi8KKwlpbWdfZGF0YSA9IGltYWdlX2dldF9kYXRhIChoZHIpICsgKGNvdW50ICsgMSkgKiBzaXplb2YgKHVpbnQzMl90KTsKKworCWlmIChpZHggPCBjb3VudCkgeworCQkqbGVuID0gdWltYWdlX3RvX2NwdSAoc2l6ZVtpZHhdKTsKKwkJb2Zmc2V0ID0gMDsKKworCQkvKiBnbyBvdmVyIGFsbCBpbmRpY2VzIHByZWNlZGluZyByZXF1ZXN0ZWQgY29tcG9uZW50IGlkeCAqLworCQlmb3IgKGkgPSAwOyBpIDwgaWR4OyBpKyspIHsKKwkJCS8qIGFkZCB1cCBpLXRoIGNvbXBvbmVudCBzaXplLCByb3VuZGluZyB1cCB0byA0IGJ5dGVzICovCisJCQlvZmZzZXQgKz0gKHVpbWFnZV90b19jcHUgKHNpemVbaV0pICsgMykgJiB+MyA7CisJCX0KKworCQkvKiBjYWxjdWxhdGUgaWR4LXRoIGNvbXBvbmVudCBkYXRhIGFkZHJlc3MgKi8KKwkJKmRhdGEgPSBpbWdfZGF0YSArIG9mZnNldDsKKwl9IGVsc2UgeworCQkqbGVuID0gMDsKKwkJKmRhdGEgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgaW1hZ2VfcHJpbnRfdHlwZSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwljb25zdCBjaGFyICpvcywgKmFyY2gsICp0eXBlLCAqY29tcDsKKworCW9zID0gZ2VuaW1nX2dldF9vc19uYW1lIChpbWFnZV9nZXRfb3MgKGhkcikpOworCWFyY2ggPSBnZW5pbWdfZ2V0X2FyY2hfbmFtZSAoaW1hZ2VfZ2V0X2FyY2ggKGhkcikpOworCXR5cGUgPSBnZW5pbWdfZ2V0X3R5cGVfbmFtZSAoaW1hZ2VfZ2V0X3R5cGUgKGhkcikpOworCWNvbXAgPSBnZW5pbWdfZ2V0X2NvbXBfbmFtZSAoaW1hZ2VfZ2V0X2NvbXAgKGhkcikpOworCisJcHJpbnRmICgiJXMgJXMgJXMgKCVzKVxuIiwgYXJjaCwgb3MsIHR5cGUsIGNvbXApOworfQorCisvKioKKyAqIGltYWdlX3ByaW50X2NvbnRlbnRzIC0gcHJpbnRzIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGxlZ2FjeSBmb3JtYXQgaW1hZ2UKKyAqIEBwdHI6IHBvaW50ZXIgdG8gdGhlIGxlZ2FjeSBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAcDogcG9pbnRlciB0byBwcmVmaXggc3RyaW5nCisgKgorICogaW1hZ2VfcHJpbnRfY29udGVudHMoKSBmb3JtYXRzIGEgbXVsdGkgbGluZSBsZWdhY3kgaW1hZ2UgY29udGVudHMgZGVzY3JpcHRpb24uCisgKiBUaGUgcm91dGluZSBwcmludHMgb3V0IGFsbCBoZWFkZXIgZmllbGRzIGZvbGxvd2VkIGJ5IHRoZSBzaXplL29mZnNldCBkYXRhCisgKiBmb3IgTVVMVEkvU0NSSVBUIGltYWdlcy4KKyAqCisgKiByZXR1cm5zOgorICogICAgIG5vIHJldHVybmVkIHJlc3VsdHMKKyAqLwordm9pZCBpbWFnZV9wcmludF9jb250ZW50cyAoY29uc3Qgdm9pZCAqcHRyKQoreworCWNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIgPSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKilwdHI7CisJY29uc3QgY2hhciAqcDsKKworI2lmZGVmIFVTRV9IT1NUQ0MKKwlwID0gIiI7CisjZWxzZQorCXAgPSAiICAgIjsKKyNlbmRpZgorCisJcHJpbnRmICgiJXNJbWFnZSBOYW1lOiAgICUuKnNcbiIsIHAsIElIX05NTEVOLCBpbWFnZV9nZXRfbmFtZSAoaGRyKSk7CisjaWYgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKSB8fCBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorCXByaW50ZiAoIiVzQ3JlYXRlZDogICAgICAiLCBwKTsKKwlnZW5pbWdfcHJpbnRfdGltZSAoKHRpbWVfdClpbWFnZV9nZXRfdGltZSAoaGRyKSk7CisjZW5kaWYKKwlwcmludGYgKCIlc0ltYWdlIFR5cGU6ICAgIiwgcCk7CisJaW1hZ2VfcHJpbnRfdHlwZSAoaGRyKTsKKwlwcmludGYgKCIlc0RhdGEgU2l6ZTogICAgIiwgcCk7CisJZ2VuaW1nX3ByaW50X3NpemUgKGltYWdlX2dldF9kYXRhX3NpemUgKGhkcikpOworCXByaW50ZiAoIiVzTG9hZCBBZGRyZXNzOiAlMDh4XG4iLCBwLCBpbWFnZV9nZXRfbG9hZCAoaGRyKSk7CisJcHJpbnRmICgiJXNFbnRyeSBQb2ludDogICUwOHhcbiIsIHAsIGltYWdlX2dldF9lcCAoaGRyKSk7CisKKwlpZiAoaW1hZ2VfY2hlY2tfdHlwZSAoaGRyLCBJSF9UWVBFX01VTFRJKSB8fAorCQkJaW1hZ2VfY2hlY2tfdHlwZSAoaGRyLCBJSF9UWVBFX1NDUklQVCkpIHsKKwkJaW50IGk7CisJCXVsb25nIGRhdGEsIGxlbjsKKwkJdWxvbmcgY291bnQgPSBpbWFnZV9tdWx0aV9jb3VudCAoaGRyKTsKKworCQlwcmludGYgKCIlc0NvbnRlbnRzOlxuIiwgcCk7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpbWFnZV9tdWx0aV9nZXRpbWcgKGhkciwgaSwgJmRhdGEsICZsZW4pOworCisJCQlwcmludGYgKCIlcyAgIEltYWdlICVkOiAiLCBwLCBpKTsKKwkJCWdlbmltZ19wcmludF9zaXplIChsZW4pOworCisJCQlpZiAoaW1hZ2VfY2hlY2tfdHlwZSAoaGRyLCBJSF9UWVBFX1NDUklQVCkgJiYgaSA+IDApIHsKKwkJCQkvKgorCQkJCSAqIHRoZSB1c2VyIG1heSBuZWVkIHRvIGtub3cgb2Zmc2V0cworCQkJCSAqIGlmIHBsYW5uaW5nIHRvIGRvIHNvbWV0aGluZyB3aXRoCisJCQkJICogbXVsdGlwbGUgZmlsZXMKKwkJCQkgKi8KKwkJCQlwcmludGYgKCIlcyAgICBPZmZzZXQgPSAweCUwOGx4XG4iLCBwLCBkYXRhKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2hhcmVkIGR1YWwtZm9ybWF0IHJvdXRpbmVzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFVTRV9IT1NUQ0MKK3ZvaWQgbWVtbW92ZV93ZCAodm9pZCAqdG8sIHZvaWQgKmZyb20sIHNpemVfdCBsZW4sIHVsb25nIGNodW5rc3opCit7CisJaWYgKHRvID09IGZyb20pCisJCXJldHVybjsKKworI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKSB8fCBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKwl3aGlsZSAobGVuID4gMCkgeworCQlzaXplX3QgdGFpbCA9IChsZW4gPiBjaHVua3N6KSA/IGNodW5rc3ogOiBsZW47CisJCVdBVENIRE9HX1JFU0VUICgpOworCQltZW1tb3ZlICh0bywgZnJvbSwgdGFpbCk7CisJCXRvICs9IHRhaWw7CisJCWZyb20gKz0gdGFpbDsKKwkJbGVuIC09IHRhaWw7CisJfQorI2Vsc2UJLyogIShDT05GSUdfSFdfV0FUQ0hET0cgfHwgQ09ORklHX1dBVENIRE9HKSAqLworCW1lbW1vdmUgKHRvLCBmcm9tLCBsZW4pOworI2VuZGlmCS8qIENPTkZJR19IV19XQVRDSERPRyB8fCBDT05GSUdfV0FUQ0hET0cgKi8KK30KKyNlbmRpZiAvKiAhVVNFX0hPU1RDQyAqLworCit2b2lkIGdlbmltZ19wcmludF9zaXplICh1aW50MzJfdCBzaXplKQoreworI2lmbmRlZiBVU0VfSE9TVENDCisJcHJpbnRmICgiJWQgQnl0ZXMgPSAiLCBzaXplKTsKKwlwcmludF9zaXplIChzaXplLCAiXG4iKTsKKyNlbHNlCisJcHJpbnRmICgiJWQgQnl0ZXMgPSAlLjJmIGtCID0gJS4yZiBNQlxuIiwKKwkJCXNpemUsIChkb3VibGUpc2l6ZSAvIDEuMDI0ZTMsCisJCQkoZG91YmxlKXNpemUgLyAxLjA0ODU3NmU2KTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKSB8fCBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorc3RhdGljIHZvaWQgZ2VuaW1nX3ByaW50X3RpbWUgKHRpbWVfdCB0aW1lc3RhbXApCit7CisjaWZuZGVmIFVTRV9IT1NUQ0MKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwl0b190bSAodGltZXN0YW1wLCAmdG0pOworCXByaW50ZiAoIiU0ZC0lMDJkLSUwMmQgICUyZDolMDJkOiUwMmQgVVRDXG4iLAorCQkJdG0udG1feWVhciwgdG0udG1fbW9uLCB0bS50bV9tZGF5LAorCQkJdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOworI2Vsc2UKKwlwcmludGYgKCIlcyIsIGN0aW1lKCZ0aW1lc3RhbXApKTsKKyNlbmRpZgorfQorI2VuZGlmIC8qIENPTkZJR19USU1FU1RBTVAgfHwgQ09ORklHX0NNRF9EQVRFIHx8IFVTRV9IT1NUQ0MgKi8KKworLyoqCisgKiBnZXRfdGFibGVfZW50cnlfbmFtZSAtIHRyYW5zbGF0ZSBlbnRyeSBpZCB0byBsb25nIG5hbWUKKyAqIEB0YWJsZTogcG9pbnRlciB0byBhIHRyYW5zbGF0aW9uIHRhYmxlIGZvciBlbnRyaWVzIG9mIGEgc3BlY2lmaWMgdHlwZQorICogQG1zZzogbWVzc2FnZSB0byBiZSByZXR1cm5lZCB3aGVuIHRyYW5zbGF0aW9uIGZhaWxzCisgKiBAaWQ6IGVudHJ5IGlkIHRvIGJlIHRyYW5zbGF0ZWQKKyAqCisgKiBnZXRfdGFibGVfZW50cnlfbmFtZSgpIHdpbGwgZ28gb3ZlciB0cmFuc2xhdGlvbiB0YWJsZSB0cnlpbmcgdG8gZmluZAorICogZW50cnkgdGhhdCBtYXRjaGVzIGdpdmVuIGlkLiBJZiBtYXRjaGluZyBlbnRyeSBpcyBmb3VuZCwgaXRzIGxvbmcKKyAqIG5hbWUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGxvbmcgZW50cnkgbmFtZSBpZiB0cmFuc2xhdGlvbiBzdWNjZWVkcworICogICAgIG1zZyBvdGhlcndpc2UKKyAqLworY2hhciAqZ2V0X3RhYmxlX2VudHJ5X25hbWUgKHRhYmxlX2VudHJ5X3QgKnRhYmxlLCBjaGFyICptc2csIGludCBpZCkKK3sKKwlmb3IgKDsgdGFibGUtPmlkID49IDA7ICsrdGFibGUpIHsKKwkJaWYgKHRhYmxlLT5pZCA9PSBpZCkKKwkJCXJldHVybiB0YWJsZS0+bG5hbWU7CisJfQorCXJldHVybiAobXNnKTsKK30KKworY29uc3QgY2hhciAqZ2VuaW1nX2dldF9vc19uYW1lICh1aW50OF90IG9zKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X25hbWUgKHVpbWFnZV9vcywgIlVua25vd24gT1MiLCBvcykpOworfQorCitjb25zdCBjaGFyICpnZW5pbWdfZ2V0X2FyY2hfbmFtZSAodWludDhfdCBhcmNoKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X25hbWUgKHVpbWFnZV9hcmNoLCAiVW5rbm93biBBcmNoaXRlY3R1cmUiLCBhcmNoKSk7Cit9CisKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfdHlwZV9uYW1lICh1aW50OF90IHR5cGUpCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfbmFtZSAodWltYWdlX3R5cGUsICJVbmtub3duIEltYWdlIiwgdHlwZSkpOworfQorCitjb25zdCBjaGFyICpnZW5pbWdfZ2V0X2NvbXBfbmFtZSAodWludDhfdCBjb21wKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X25hbWUgKHVpbWFnZV9jb21wLCAiVW5rbm93biBDb21wcmVzc2lvbiIsIGNvbXApKTsKK30KKworLyoqCisgKiBnZXRfdGFibGVfZW50cnlfaWQgLSB0cmFuc2xhdGUgc2hvcnQgZW50cnkgbmFtZSB0byBpZAorICogQHRhYmxlOiBwb2ludGVyIHRvIGEgdHJhbnNsYXRpb24gdGFibGUgZm9yIGVudHJpZXMgb2YgYSBzcGVjaWZpYyB0eXBlCisgKiBAdGFibGVfbmFtZTogdG8gYmUgdXNlZCBpbiBjYXNlIG9mIGVycm9yCisgKiBAbmFtZTogZW50cnkgc2hvcnQgbmFtZSB0byBiZSB0cmFuc2xhdGVkCisgKgorICogZ2V0X3RhYmxlX2VudHJ5X2lkKCkgd2lsbCBnbyBvdmVyIHRyYW5zbGF0aW9uIHRhYmxlIHRyeWluZyB0byBmaW5kCisgKiBlbnRyeSB0aGF0IG1hdGNoZXMgZ2l2ZW4gc2hvcnQgbmFtZS4gSWYgbWF0Y2hpbmcgZW50cnkgaXMgZm91bmQsCisgKiBpdHMgaWQgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGVudHJ5IGlkIGlmIHRyYW5zbGF0aW9uIHN1Y2NlZWRzCisgKiAgICAgLTEgb3RoZXJ3aXNlCisgKi8KK2ludCBnZXRfdGFibGVfZW50cnlfaWQgKHRhYmxlX2VudHJ5X3QgKnRhYmxlLAorCQljb25zdCBjaGFyICp0YWJsZV9uYW1lLCBjb25zdCBjaGFyICpuYW1lKQoreworCXRhYmxlX2VudHJ5X3QgKnQ7CisjaWZkZWYgVVNFX0hPU1RDQworCWludCBmaXJzdCA9IDE7CisKKwlmb3IgKHQgPSB0YWJsZTsgdC0+aWQgPj0gMDsgKyt0KSB7CisJCWlmICh0LT5zbmFtZSAmJiBzdHJjYXNlY21wKHQtPnNuYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuICh0LT5pZCk7CisJfQorCisJZnByaW50ZiAoc3RkZXJyLCAiXG5JbnZhbGlkICVzIFR5cGUgLSB2YWxpZCBuYW1lcyBhcmUiLCB0YWJsZV9uYW1lKTsKKwlmb3IgKHQgPSB0YWJsZTsgdC0+aWQgPj0gMDsgKyt0KSB7CisJCWlmICh0LT5zbmFtZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZwcmludGYgKHN0ZGVyciwgIiVjICVzIiwgKGZpcnN0KSA/ICc6JyA6ICcsJywgdC0+c25hbWUpOworCQlmaXJzdCA9IDA7CisJfQorCWZwcmludGYgKHN0ZGVyciwgIlxuIik7CisjZWxzZQorCWZvciAodCA9IHRhYmxlOyB0LT5pZCA+PSAwOyArK3QpIHsKKwkJaWYgKHQtPnNuYW1lICYmIHN0cmNtcCh0LT5zbmFtZSwgbmFtZSkgPT0gMCkKKwkJCXJldHVybiAodC0+aWQpOworCX0KKwlkZWJ1ZyAoIkludmFsaWQgJXMgVHlwZTogJXNcbiIsIHRhYmxlX25hbWUsIG5hbWUpOworI2VuZGlmIC8qIFVTRV9IT1NUQ0MgKi8KKwlyZXR1cm4gKC0xKTsKK30KKworaW50IGdlbmltZ19nZXRfb3NfaWQgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfaWQgKHVpbWFnZV9vcywgIk9TIiwgbmFtZSkpOworfQorCitpbnQgZ2VuaW1nX2dldF9hcmNoX2lkIChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X2lkICh1aW1hZ2VfYXJjaCwgIkNQVSIsIG5hbWUpKTsKK30KKworaW50IGdlbmltZ19nZXRfdHlwZV9pZCAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gKGdldF90YWJsZV9lbnRyeV9pZCAodWltYWdlX3R5cGUsICJJbWFnZSIsIG5hbWUpKTsKK30KKworaW50IGdlbmltZ19nZXRfY29tcF9pZCAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gKGdldF90YWJsZV9lbnRyeV9pZCAodWltYWdlX2NvbXAsICJDb21wcmVzc2lvbiIsIG5hbWUpKTsKK30KKworI2lmbmRlZiBVU0VfSE9TVENDCisvKioKKyAqIGdlbmltZ19nZXRfZm9ybWF0IC0gZ2V0IGltYWdlIGZvcm1hdCB0eXBlCisgKiBAaW1nX2FkZHI6IGltYWdlIHN0YXJ0IGFkZHJlc3MKKyAqCisgKiBnZW5pbWdfZ2V0X2Zvcm1hdCgpIGNoZWNrcyB3aGV0aGVyIHByb3ZpZGVkIGFkZHJlc3MgcG9pbnRzIHRvIGEgdmFsaWQKKyAqIGxlZ2FjeSBvciBGSVQgaW1hZ2UuCisgKgorICogTmV3IHVJbWFnZSBmb3JtYXQgYW5kIEZEVCBibG9iIGFyZSBiYXNlZCBvbiBhIGxpYmZkdC4gRkRUIGJsb2IKKyAqIG1heSBiZSBwYXNzZWQgZGlyZWN0bHkgb3IgZW1iZWRkZWQgaW4gYSBGSVQgaW1hZ2UuIEluIGJvdGggc2l0dWF0aW9ucworICogZ2VuaW1nX2dldF9mb3JtYXQoKSBtdXN0IGJlIGFibGUgdG8gZGVjdGVjdCBsaWJmZHQgaGVhZGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgaW1hZ2UgZm9ybWF0IHR5cGUgb3IgSU1BR0VfRk9STUFUX0lOVkFMSUQgaWYgbm8gaW1hZ2UgaXMgcHJlc2VudAorICovCitpbnQgZ2VuaW1nX2dldF9mb3JtYXQgKHZvaWQgKmltZ19hZGRyKQoreworCXVsb25nIGZvcm1hdCA9IElNQUdFX0ZPUk1BVF9JTlZBTElEOworCWNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHI7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKSB8fCBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisJY2hhciAqZml0X2hkcjsKKyNlbmRpZgorCisJaGRyID0gKGNvbnN0IGltYWdlX2hlYWRlcl90ICopaW1nX2FkZHI7CisJaWYgKGltYWdlX2NoZWNrX21hZ2ljKGhkcikpCisJCWZvcm1hdCA9IElNQUdFX0ZPUk1BVF9MRUdBQ1k7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKSB8fCBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisJZWxzZSB7CisJCWZpdF9oZHIgPSAoY2hhciAqKWltZ19hZGRyOworCQlpZiAoZmR0X2NoZWNrX2hlYWRlciAoZml0X2hkcikgPT0gMCkKKwkJCWZvcm1hdCA9IElNQUdFX0ZPUk1BVF9GSVQ7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZm9ybWF0OworfQorCisvKioKKyAqIGdlbmltZ19nZXRfaW1hZ2UgLSBnZXQgaW1hZ2UgZnJvbSBzcGVjaWFsIHN0b3JhZ2UgKGlmIG5lY2Vzc2FyeSkKKyAqIEBpbWdfYWRkcjogaW1hZ2Ugc3RhcnQgYWRkcmVzcworICoKKyAqIGdlbmltZ19nZXRfaW1hZ2UoKSBjaGVja3MgaWYgcHJvdmlkZWQgaW1hZ2Ugc3RhcnQgYWRkZHJlc3MgaXMgbG9jYXRlZAorICogaW4gYSBkYXRhZmxhc2ggc3RvcmFnZS4gSWYgc28sIGltYWdlIGlzIG1vdmVkIHRvIGEgc3lzdGVtIFJBTSBtZW1vcnkuCisgKgorICogcmV0dXJuczoKKyAqICAgICBpbWFnZSBzdGFydCBhZGRyZXNzIGFmdGVyIHBvc3NpYmxlIHJlbG9jYXRpb24gZnJvbSBzcGVjaWFsIHN0b3JhZ2UKKyAqLwordWxvbmcgZ2VuaW1nX2dldF9pbWFnZSAodWxvbmcgaW1nX2FkZHIpCit7CisJdWxvbmcgcmFtX2FkZHIgPSBpbWdfYWRkcjsKKworI2lmZGVmIENPTkZJR19IQVNfREFUQUZMQVNICisJdWxvbmcgaF9zaXplLCBkX3NpemU7CisKKwlpZiAoYWRkcl9kYXRhZmxhc2ggKGltZ19hZGRyKSl7CisJCS8qIGdlciBSQU0gYWRkcmVzcyAqLworCQlyYW1fYWRkciA9IENPTkZJR19TWVNfTE9BRF9BRERSOworCisJCS8qIGdldCBoZWFkZXIgc2l6ZSAqLworCQloX3NpemUgPSBpbWFnZV9nZXRfaGVhZGVyX3NpemUgKCk7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCQlpZiAoc2l6ZW9mKHN0cnVjdCBmZHRfaGVhZGVyKSA+IGhfc2l6ZSkKKwkJCWhfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmR0X2hlYWRlcik7CisjZW5kaWYKKworCQkvKiByZWFkIGluIGhlYWRlciAqLworCQlkZWJ1ZyAoIiAgIFJlYWRpbmcgaW1hZ2UgaGVhZGVyIGZyb20gZGF0YWZsYXNoIGFkZHJlc3MgIgorCQkJIiUwOGx4IHRvIFJBTSBhZGRyZXNzICUwOGx4XG4iLCBpbWdfYWRkciwgcmFtX2FkZHIpOworCisJCXJlYWRfZGF0YWZsYXNoIChpbWdfYWRkciwgaF9zaXplLCAoY2hhciAqKXJhbV9hZGRyKTsKKworCQkvKiBnZXQgZGF0YSBzaXplICovCisJCXN3aXRjaCAoZ2VuaW1nX2dldF9mb3JtYXQgKCh2b2lkICopcmFtX2FkZHIpKSB7CisJCWNhc2UgSU1BR0VfRk9STUFUX0xFR0FDWToKKwkJCWRfc2l6ZSA9IGltYWdlX2dldF9kYXRhX3NpemUgKChjb25zdCBpbWFnZV9oZWFkZXJfdCAqKXJhbV9hZGRyKTsKKwkJCWRlYnVnICgiICAgTGVnYWN5IGZvcm1hdCBpbWFnZSBmb3VuZCBhdCAweCUwOGx4LCBzaXplIDB4JTA4bHhcbiIsCisJCQkJCXJhbV9hZGRyLCBkX3NpemUpOworCQkJYnJlYWs7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCQljYXNlIElNQUdFX0ZPUk1BVF9GSVQ6CisJCQlkX3NpemUgPSBmaXRfZ2V0X3NpemUgKChjb25zdCB2b2lkICopcmFtX2FkZHIpIC0gaF9zaXplOworCQkJZGVidWcgKCIgICBGSVQvRkRUIGZvcm1hdCBpbWFnZSBmb3VuZCBhdCAweCUwOGx4LCBzaXplIDB4JTA4bHhcbiIsCisJCQkJCXJhbV9hZGRyLCBkX3NpemUpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXByaW50ZiAoIiAgIE5vIHZhbGlkIGltYWdlIGZvdW5kIGF0IDB4JTA4bHhcbiIsIGltZ19hZGRyKTsKKwkJCXJldHVybiByYW1fYWRkcjsKKwkJfQorCisJCS8qIHJlYWQgaW4gaW1hZ2UgZGF0YSAqLworCQlkZWJ1ZyAoIiAgIFJlYWRpbmcgaW1hZ2UgcmVtYWluaW5nIGRhdGEgZnJvbSBkYXRhZmxhc2ggYWRkcmVzcyAiCisJCQkiJTA4bHggdG8gUkFNIGFkZHJlc3MgJTA4bHhcbiIsIGltZ19hZGRyICsgaF9zaXplLAorCQkJcmFtX2FkZHIgKyBoX3NpemUpOworCisJCXJlYWRfZGF0YWZsYXNoIChpbWdfYWRkciArIGhfc2l6ZSwgZF9zaXplLAorCQkJCShjaGFyICopKHJhbV9hZGRyICsgaF9zaXplKSk7CisKKwl9CisjZW5kaWYgLyogQ09ORklHX0hBU19EQVRBRkxBU0ggKi8KKworCXJldHVybiByYW1fYWRkcjsKK30KKworLyoqCisgKiBmaXRfaGFzX2NvbmZpZyAtIGNoZWNrIGlmIHRoZXJlIGlzIGEgdmFsaWQgRklUIGNvbmZpZ3VyYXRpb24KKyAqIEBpbWFnZXM6IHBvaW50ZXIgdG8gdGhlIGJvb3RtIGNvbW1hbmQgaGVhZGVycyBzdHJ1Y3R1cmUKKyAqCisgKiBmaXRfaGFzX2NvbmZpZygpIGNoZWNrcyBpZiB0aGVyZSBpcyBhIEZJVCBjb25maWd1cmF0aW9uIGluIHVzZQorICogKGlmIEZUSSBzdXBwb3J0IGlzIHByZXNlbnQpLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgbm8gRklUIHN1cHBvcnQgb3Igbm8gY29uZmlndXJhdGlvbiBmb3VuZAorICogICAgIDEsIGNvbmZpZ3VyYXRpb24gZm91bmQKKyAqLworaW50IGdlbmltZ19oYXNfY29uZmlnIChib290bV9oZWFkZXJzX3QgKmltYWdlcykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJaWYgKGltYWdlcy0+Zml0X3VuYW1lX2NmZykKKwkJcmV0dXJuIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19PRl9MSUJGRFQKK3N0YXRpYyB2b2lkIGZkdF9lcnJvciAoY29uc3QgY2hhciAqbXNnKQoreworCXB1dHMgKCJFUlJPUjogIik7CisJcHV0cyAobXNnKTsKKwlwdXRzICgiIC0gbXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworfQorCitzdGF0aWMgY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmltYWdlX2dldF9mZHQgKHVsb25nIGZkdF9hZGRyKQoreworCWNvbnN0IGltYWdlX2hlYWRlcl90ICpmZHRfaGRyID0gKGNvbnN0IGltYWdlX2hlYWRlcl90ICopZmR0X2FkZHI7CisKKwlpbWFnZV9wcmludF9jb250ZW50cyAoZmR0X2hkcik7CisKKwlwdXRzICgiICAgVmVyaWZ5aW5nIENoZWNrc3VtIC4uLiAiKTsKKwlpZiAoIWltYWdlX2NoZWNrX2hjcmMgKGZkdF9oZHIpKSB7CisJCWZkdF9lcnJvciAoImZkdCBoZWFkZXIgY2hlY2tzdW0gaW52YWxpZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWltYWdlX2NoZWNrX2RjcmMgKGZkdF9oZHIpKSB7CisJCWZkdF9lcnJvciAoImZkdCBjaGVja3N1bSBpbnZhbGlkIik7CisJCXJldHVybiBOVUxMOworCX0KKwlwdXRzICgiT0tcbiIpOworCisJaWYgKCFpbWFnZV9jaGVja190eXBlIChmZHRfaGRyLCBJSF9UWVBFX0ZMQVREVCkpIHsKKwkJZmR0X2Vycm9yICgidUltYWdlIGlzIG5vdCBhIGZkdCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKGltYWdlX2dldF9jb21wIChmZHRfaGRyKSAhPSBJSF9DT01QX05PTkUpIHsKKwkJZmR0X2Vycm9yICgidUltYWdlIGlzIGNvbXByZXNzZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChmZHRfY2hlY2tfaGVhZGVyICgoY2hhciAqKWltYWdlX2dldF9kYXRhIChmZHRfaGRyKSkgIT0gMCkgeworCQlmZHRfZXJyb3IgKCJ1SW1hZ2UgZGF0YSBpcyBub3QgYSBmZHQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBmZHRfaGRyOworfQorCisvKioKKyAqIGZpdF9jaGVja19mZHQgLSB2ZXJpZnkgRklUIGZvcm1hdCBGRFQgc3ViaW1hZ2UKKyAqIEBmaXRfaGRyOiBwb2ludGVyIHRvIHRoZSBGSVQgIGhlYWRlcgorICogZmR0X25vZmZzZXQ6IEZEVCBzdWJpbWFnZSBub2RlIG9mZnNldCB3aXRoaW4gRklUIGltYWdlCisgKiBAdmVyaWZ5OiBkYXRhIENSQyB2ZXJpZmljYXRpb24gZmxhZworICoKKyAqIGZpdF9jaGVja19mZHQoKSB2ZXJpZmllcyBpbnRlZ3JpdHkgb2YgdGhlIEZEVCBzdWJpbWFnZSBhbmQgZnJvbQorICogc3BlY2lmaWVkIEZJVCBpbWFnZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEsIG9uIHN1Y2Nlc3MKKyAqICAgICAwLCBvbiBmYWlsdXJlCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCitzdGF0aWMgaW50IGZpdF9jaGVja19mZHQgKGNvbnN0IHZvaWQgKmZpdCwgaW50IGZkdF9ub2Zmc2V0LCBpbnQgdmVyaWZ5KQoreworCWZpdF9pbWFnZV9wcmludCAoZml0LCBmZHRfbm9mZnNldCwgIiAgICIpOworCisJaWYgKHZlcmlmeSkgeworCQlwdXRzICgiICAgVmVyaWZ5aW5nIEhhc2ggSW50ZWdyaXR5IC4uLiAiKTsKKwkJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfaGFzaGVzIChmaXQsIGZkdF9ub2Zmc2V0KSkgeworCQkJZmR0X2Vycm9yICgiQmFkIERhdGEgSGFzaCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHV0cyAoIk9LXG4iKTsKKwl9CisKKwlpZiAoIWZpdF9pbWFnZV9jaGVja190eXBlIChmaXQsIGZkdF9ub2Zmc2V0LCBJSF9UWVBFX0ZMQVREVCkpIHsKKwkJZmR0X2Vycm9yICgiTm90IGEgRkRUIGltYWdlIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghZml0X2ltYWdlX2NoZWNrX2NvbXAgKGZpdCwgZmR0X25vZmZzZXQsIElIX0NPTVBfTk9ORSkpIHsKKwkJZmR0X2Vycm9yICgiRkRUIGltYWdlIGlzIGNvbXByZXNzZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogQ09ORklHX0ZJVCAqLworCisjaWZuZGVmIENPTkZJR19TWVNfRkRUX1BBRAorI2RlZmluZSBDT05GSUdfU1lTX0ZEVF9QQUQgMHgzMDAwCisjZW5kaWYKKworLyoqCisgKiBib290X3JlbG9jYXRlX2ZkdCAtIHJlbG9jYXRlIGZsYXQgZGV2aWNlIHRyZWUKKyAqIEBsbWI6IHBvaW50ZXIgdG8gbG1iIGhhbmRsZSwgd2lsbCBiZSB1c2VkIGZvciBtZW1vcnkgbWdtdAorICogQGJvb3RtYXBfYmFzZTogYmFzZSBhZGRyZXNzIG9mIHRoZSBib290bWFwIHJlZ2lvbgorICogQG9mX2ZsYXRfdHJlZTogcG9pbnRlciB0byBhIGNoYXIqIHZhcmlhYmxlLCB3aWxsIGhvbGQgZmR0IHN0YXJ0IGFkZHJlc3MKKyAqIEBvZl9zaXplOiBwb2ludGVyIHRvIGEgdWxvbmcgdmFyaWFibGUsIHdpbGwgaG9sZCBmZHQgbGVuZ3RoCisgKgorICogYm9vdF9yZWxvY2F0ZV9mZHQoKSBkZXRlcm1pbmVzIGlmIHRoZSBvZl9mbGF0X3RyZWUgYWRkcmVzcyBpcyB3aXRoaW4KKyAqIHRoZSBib290bWFwIGFuZCBpZiBub3QgcmVsb2NhdGVzIGl0IGludG8gdGhhdCByZWdpb24KKyAqCisgKiBvZl9mbGF0X3RyZWUgYW5kIG9mX3NpemUgYXJlIHNldCB0byBmaW5hbCAoYWZ0ZXIgcmVsb2NhdGlvbikgdmFsdWVzCisgKgorICogcmV0dXJuczoKKyAqICAgICAgMCAtIHN1Y2Nlc3MKKyAqICAgICAgMSAtIGZhaWx1cmUKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CT09UTUFQU1opCitpbnQgYm9vdF9yZWxvY2F0ZV9mZHQgKHN0cnVjdCBsbWIgKmxtYiwgdWxvbmcgYm9vdG1hcF9iYXNlLAorCQljaGFyICoqb2ZfZmxhdF90cmVlLCB1bG9uZyAqb2Zfc2l6ZSkKK3sKKwljaGFyCSpmZHRfYmxvYiA9ICpvZl9mbGF0X3RyZWU7CisJdWxvbmcJcmVsb2NhdGUgPSAwOworCXVsb25nCW9mX2xlbiA9IDA7CisKKwkvKiBub3RoaW5nIHRvIGRvICovCisJaWYgKCpvZl9zaXplID09IDApCisJCXJldHVybiAwOworCisJaWYgKGZkdF9jaGVja19oZWFkZXIgKGZkdF9ibG9iKSAhPSAwKSB7CisJCWZkdF9lcnJvciAoImltYWdlIGlzIG5vdCBhIGZkdCIpOworCQlnb3RvIGVycm9yOworCX0KKworI2lmbmRlZiBDT05GSUdfU1lTX05PX0ZMQVNICisJLyogbW92ZSB0aGUgYmxvYiBpZiBpdCBpcyBpbiBmbGFzaCAoc2V0IHJlbG9jYXRlKSAqLworCWlmIChhZGRyMmluZm8gKCh1bG9uZylmZHRfYmxvYikgIT0gTlVMTCkKKwkJcmVsb2NhdGUgPSAxOworI2VuZGlmCisKKwkvKgorCSAqIFRoZSBibG9iIG5lZWRzIHRvIGJlIGluc2lkZSB0aGUgYm9vdCBtYXBwaW5nLgorCSAqLworCWlmIChmZHRfYmxvYiA8IChjaGFyICopYm9vdG1hcF9iYXNlKQorCQlyZWxvY2F0ZSA9IDE7CisKKwlpZiAoKGZkdF9ibG9iICsgKm9mX3NpemUgKyBDT05GSUdfU1lTX0ZEVF9QQUQpID49CisJCQkoKGNoYXIgKilDT05GSUdfU1lTX0JPT1RNQVBTWiArIGJvb3RtYXBfYmFzZSkpCisJCXJlbG9jYXRlID0gMTsKKworCS8qIG1vdmUgZmxhdHRlbmQgZGV2aWNlIHRyZWUgaWYgbmVlZGVkICovCisJaWYgKHJlbG9jYXRlKSB7CisJCWludCBlcnI7CisJCXVsb25nIG9mX3N0YXJ0ID0gMDsKKworCQkvKiBwb3NpdGlvbiBvbiBhIDRLIGJvdW5kYXJ5IGJlZm9yZSB0aGUgYWxsb2NfY3VycmVudCAqLworCQkvKiBQYWQgdGhlIEZEVCBieSBhIHNwZWNpZmllZCBhbW91bnQgKi8KKwkJb2ZfbGVuID0gKm9mX3NpemUgKyBDT05GSUdfU1lTX0ZEVF9QQUQ7CisJCW9mX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpbG1iX2FsbG9jX2Jhc2UobG1iLCBvZl9sZW4sIDB4MTAwMCwKKwkJCQkoQ09ORklHX1NZU19CT09UTUFQU1ogKyBib290bWFwX2Jhc2UpKTsKKworCQlpZiAob2Zfc3RhcnQgPT0gMCkgeworCQkJcHV0cygiZGV2aWNlIHRyZWUgLSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlkZWJ1ZyAoIiMjIGRldmljZSB0cmVlIGF0IDB4JTA4bFggLi4uIDB4JTA4bFggKGxlbj0lbGQ9MHglbFgpXG4iLAorCQkJKHVsb25nKWZkdF9ibG9iLCAodWxvbmcpZmR0X2Jsb2IgKyAqb2Zfc2l6ZSAtIDEsCisJCQlvZl9sZW4sIG9mX2xlbik7CisKKwkJcHJpbnRmICgiICAgTG9hZGluZyBEZXZpY2UgVHJlZSB0byAlMDhseCwgZW5kICUwOGx4IC4uLiAiLAorCQkJb2Zfc3RhcnQsIG9mX3N0YXJ0ICsgb2ZfbGVuIC0gMSk7CisKKwkJZXJyID0gZmR0X29wZW5faW50byAoZmR0X2Jsb2IsICh2b2lkICopb2Zfc3RhcnQsIG9mX2xlbik7CisJCWlmIChlcnIgIT0gMCkgeworCQkJZmR0X2Vycm9yICgiZmR0IG1vdmUgZmFpbGVkIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJCXB1dHMgKCJPS1xuIik7CisKKwkJKm9mX2ZsYXRfdHJlZSA9IChjaGFyICopb2Zfc3RhcnQ7CisJCSpvZl9zaXplID0gb2ZfbGVuOworCX0gZWxzZSB7CisJCSpvZl9mbGF0X3RyZWUgPSBmZHRfYmxvYjsKKwkJb2ZfbGVuID0gKENPTkZJR19TWVNfQk9PVE1BUFNaICsgYm9vdG1hcF9iYXNlKSAtICh1bG9uZylmZHRfYmxvYjsKKwkJbG1iX3Jlc2VydmUobG1iLCAodWxvbmcpZmR0X2Jsb2IsIG9mX2xlbik7CisJCWZkdF9zZXRfdG90YWxzaXplKCpvZl9mbGF0X3RyZWUsIG9mX2xlbik7CisKKwkJKm9mX3NpemUgPSBvZl9sZW47CisJfQorCisJc2V0X3dvcmtpbmdfZmR0X2FkZHIoKm9mX2ZsYXRfdHJlZSk7CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXJldHVybiAxOworfQorI2VuZGlmIC8qIENPTkZJR19TWVNfQk9PVE1BUFNaICovCisKKy8qKgorICogYm9vdF9nZXRfZmR0IC0gbWFpbiBmZHQgaGFuZGxpbmcgcm91dGluZQorICogQGFyZ2M6IGNvbW1hbmQgYXJndW1lbnQgY291bnQKKyAqIEBhcmd2OiBjb21tYW5kIGFyZ3VtZW50IGxpc3QKKyAqIEBpbWFnZXM6IHBvaW50ZXIgdG8gdGhlIGJvb3RtIGltYWdlcyBzdHJ1Y3R1cmUKKyAqIEBvZl9mbGF0X3RyZWU6IHBvaW50ZXIgdG8gYSBjaGFyKiB2YXJpYWJsZSwgd2lsbCBob2xkIGZkdCBzdGFydCBhZGRyZXNzCisgKiBAb2Zfc2l6ZTogcG9pbnRlciB0byBhIHVsb25nIHZhcmlhYmxlLCB3aWxsIGhvbGQgZmR0IGxlbmd0aAorICoKKyAqIGJvb3RfZ2V0X2ZkdCgpIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgdmFsaWQgZmxhdCBkZXZpY2UgdHJlZSBpbWFnZS4KKyAqIEN1cmVudGx5IHN1cHBvcnRlZCBhcmUgdGhlIGZvbGxvd2luZyByYW1kaXNrIHNvdXJjZXM6CisgKiAgICAgIC0gbXVsdGljb21wb25lbnQga2VybmVsL3JhbWRpc2sgaW1hZ2UsCisgKiAgICAgIC0gY29tbWFuZGxpbmUgcHJvdmlkZWQgYWRkcmVzcyBvZiBkZWNpY2F0ZWQgcmFtZGlzayBpbWFnZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIGlmIGZkdCBpbWFnZSB3YXMgZm91bmQgYW5kIHZhbGlkLCBvciBza2lwcGVkCisgKiAgICAgb2ZfZmxhdF90cmVlIGFuZCBvZl9zaXplIGFyZSBzZXQgdG8gZmR0IHN0YXJ0IGFkZHJlc3MgYW5kIGxlbmd0aCBpZgorICogICAgIGZkdCBpbWFnZSBpcyBmb3VuZCBhbmQgdmFsaWQKKyAqCisgKiAgICAgMSwgaWYgZmR0IGltYWdlIGlzIGZvdW5kIGJ1dCBjb3JydXB0ZWQKKyAqICAgICBvZl9mbGF0X3RyZWUgYW5kIG9mX3NpemUgYXJlIHNldCB0byAwIGlmIG5vIGZkdCBleGlzdHMKKyAqLworaW50IGJvb3RfZ2V0X2ZkdCAoaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdLCBib290bV9oZWFkZXJzX3QgKmltYWdlcywKKwkJY2hhciAqKm9mX2ZsYXRfdHJlZSwgdWxvbmcgKm9mX3NpemUpCit7CisJY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmZkdF9oZHI7CisJdWxvbmcJCWZkdF9hZGRyOworCWNoYXIJCSpmZHRfYmxvYiA9IE5VTEw7CisJdWxvbmcJCWltYWdlX3N0YXJ0LCBpbWFnZV9lbmQ7CisJdWxvbmcJCWxvYWRfc3RhcnQsIGxvYWRfZW5kOworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKwl2b2lkCQkqZml0X2hkcjsKKwljb25zdCBjaGFyCSpmaXRfdW5hbWVfY29uZmlnID0gTlVMTDsKKwljb25zdCBjaGFyCSpmaXRfdW5hbWVfZmR0ID0gTlVMTDsKKwl1bG9uZwkJZGVmYXVsdF9hZGRyOworCWludAkJY2ZnX25vZmZzZXQ7CisJaW50CQlmZHRfbm9mZnNldDsKKwljb25zdCB2b2lkCSpkYXRhOworCXNpemVfdAkJc2l6ZTsKKyNlbmRpZgorCisJKm9mX2ZsYXRfdHJlZSA9IE5VTEw7CisJKm9mX3NpemUgPSAwOworCisJaWYgKGFyZ2MgPiAzIHx8IGdlbmltZ19oYXNfY29uZmlnIChpbWFnZXMpKSB7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCQlpZiAoYXJnYyA+IDMpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgRkRUIGJsb2IgY29tZXMgZnJvbSB0aGUgRklUIGltYWdlIGFuZCB0aGUKKwkJCSAqIEZJVCBpbWFnZSBhZGRyZXNzIGlzIG9taXR0ZWQgaW4gdGhlIGNvbW1hbmQgbGluZQorCQkJICogYXJndW1lbnQsIHRyeSB0byB1c2UgcmFtZGlzayBvciBvcyBGSVQgaW1hZ2UKKwkJCSAqIGFkZHJlc3Mgb3IgZGVmYXVsdCBsb2FkIGFkZHJlc3MuCisJCQkgKi8KKwkJCWlmIChpbWFnZXMtPmZpdF91bmFtZV9yZCkKKwkJCQlkZWZhdWx0X2FkZHIgPSAodWxvbmcpaW1hZ2VzLT5maXRfaGRyX3JkOworCQkJZWxzZSBpZiAoaW1hZ2VzLT5maXRfdW5hbWVfb3MpCisJCQkJZGVmYXVsdF9hZGRyID0gKHVsb25nKWltYWdlcy0+Zml0X2hkcl9vczsKKwkJCWVsc2UKKwkJCQlkZWZhdWx0X2FkZHIgPSBsb2FkX2FkZHI7CisKKwkJCWlmIChmaXRfcGFyc2VfY29uZiAoYXJndlszXSwgZGVmYXVsdF9hZGRyLAorCQkJCQkJJmZkdF9hZGRyLCAmZml0X3VuYW1lX2NvbmZpZykpIHsKKwkJCQlkZWJ1ZyAoIiogIGZkdDogY29uZmlnICclcycgZnJvbSBpbWFnZSBhdCAweCUwOGx4XG4iLAorCQkJCQkJZml0X3VuYW1lX2NvbmZpZywgZmR0X2FkZHIpOworCQkJfSBlbHNlIGlmIChmaXRfcGFyc2Vfc3ViaW1hZ2UgKGFyZ3ZbM10sIGRlZmF1bHRfYWRkciwKKwkJCQkJCSZmZHRfYWRkciwgJmZpdF91bmFtZV9mZHQpKSB7CisJCQkJZGVidWcgKCIqICBmZHQ6IHN1YmltYWdlICclcycgZnJvbSBpbWFnZSBhdCAweCUwOGx4XG4iLAorCQkJCQkJZml0X3VuYW1lX2ZkdCwgZmR0X2FkZHIpOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCXsKKwkJCQlmZHRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKwkJCQlkZWJ1ZyAoIiogIGZkdDogY21kbGluZSBpbWFnZSBhZGRyZXNzID0gMHglMDhseFxuIiwKKwkJCQkJCWZkdF9hZGRyKTsKKwkJCX0KKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJCX0gZWxzZSB7CisJCQkvKiB1c2UgRklUIGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgaW4gZmlyc3QgYm9vdG0KKwkJCSAqIGNvbW1hbmQgYXJndW1lbnQKKwkJCSAqLworCQkJZmR0X2FkZHIgPSAodWxvbmcpaW1hZ2VzLT5maXRfaGRyX29zOworCQkJZml0X3VuYW1lX2NvbmZpZyA9IGltYWdlcy0+Zml0X3VuYW1lX2NmZzsKKwkJCWRlYnVnICgiKiAgZmR0OiB1c2luZyBjb25maWcgJyVzJyBmcm9tIGltYWdlIGF0IDB4JTA4bHhcbiIsCisJCQkJCWZpdF91bmFtZV9jb25maWcsIGZkdF9hZGRyKTsKKworCQkJLyoKKwkJCSAqIENoZWNrIHdoZXRoZXIgY29uZmlndXJhdGlvbiBoYXMgRkRUIGJsb2IgZGVmaW5lZCwKKwkJCSAqIGlmIG5vdCBxdWl0IHNpbGVudGx5LgorCQkJICovCisJCQlmaXRfaGRyID0gKHZvaWQgKilmZHRfYWRkcjsKKwkJCWNmZ19ub2Zmc2V0ID0gZml0X2NvbmZfZ2V0X25vZGUgKGZpdF9oZHIsCisJCQkJCWZpdF91bmFtZV9jb25maWcpOworCQkJaWYgKGNmZ19ub2Zmc2V0IDwgMCkgeworCQkJCWRlYnVnICgiKiAgZmR0OiBubyBzdWNoIGNvbmZpZ1xuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWZkdF9ub2Zmc2V0ID0gZml0X2NvbmZfZ2V0X2ZkdF9ub2RlIChmaXRfaGRyLAorCQkJCQljZmdfbm9mZnNldCk7CisJCQlpZiAoZmR0X25vZmZzZXQgPCAwKSB7CisJCQkJZGVidWcgKCIqICBmZHQ6IG5vIGZkdCBpbiBjb25maWdcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisjZW5kaWYKKworCQlkZWJ1ZyAoIiMjIENoZWNraW5nIGZvciAnRkRUJy8nRkRUIEltYWdlJyBhdCAlMDhseFxuIiwKKwkJCQlmZHRfYWRkcik7CisKKwkJLyogY29weSBmcm9tIGRhdGFmbGFzaCBpZiBuZWVkZWQgKi8KKwkJZmR0X2FkZHIgPSBnZW5pbWdfZ2V0X2ltYWdlIChmZHRfYWRkcik7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gRkRUIGltYWdlIGF0IHRoZQorCQkgKiBhZGRyZXNzIHByb3ZpZGVkIGluIHRoZSBzZWNvbmQgYm9vdG0gYXJndW1lbnQKKwkJICogY2hlY2sgaW1hZ2UgdHlwZSwgZm9yIEZJVCBpbWFnZXMgZ2V0IGEgRklUIG5vZGUuCisJCSAqLworCQlzd2l0Y2ggKGdlbmltZ19nZXRfZm9ybWF0ICgodm9pZCAqKWZkdF9hZGRyKSkgeworCQljYXNlIElNQUdFX0ZPUk1BVF9MRUdBQ1k6CisJCQkvKiB2ZXJpZnkgZmR0X2FkZHIgcG9pbnRzIHRvIGEgdmFsaWQgaW1hZ2UgaGVhZGVyICovCisJCQlwcmludGYgKCIjIyBGbGF0dGVuZWQgRGV2aWNlIFRyZWUgZnJvbSBMZWdhY3kgSW1hZ2UgYXQgJTA4bHhcbiIsCisJCQkJCWZkdF9hZGRyKTsKKwkJCWZkdF9oZHIgPSBpbWFnZV9nZXRfZmR0IChmZHRfYWRkcik7CisJCQlpZiAoIWZkdF9oZHIpCisJCQkJZ290byBlcnJvcjsKKworCQkJLyoKKwkJCSAqIG1vdmUgaW1hZ2UgZGF0YSB0byB0aGUgbG9hZCBhZGRyZXNzLAorCQkJICogbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJ3cml0ZSBpbml0aWFsIGltYWdlCisJCQkgKi8KKwkJCWltYWdlX3N0YXJ0ID0gKHVsb25nKWZkdF9oZHI7CisJCQlpbWFnZV9lbmQgPSBpbWFnZV9nZXRfaW1hZ2VfZW5kIChmZHRfaGRyKTsKKworCQkJbG9hZF9zdGFydCA9IGltYWdlX2dldF9sb2FkIChmZHRfaGRyKTsKKwkJCWxvYWRfZW5kID0gbG9hZF9zdGFydCArIGltYWdlX2dldF9kYXRhX3NpemUgKGZkdF9oZHIpOworCisJCQlpZiAoKGxvYWRfc3RhcnQgPCBpbWFnZV9lbmQpICYmIChsb2FkX2VuZCA+IGltYWdlX3N0YXJ0KSkgeworCQkJCWZkdF9lcnJvciAoImZkdCBvdmVyd3JpdHRlbiIpOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisKKwkJCWRlYnVnICgiICAgTG9hZGluZyBGRFQgZnJvbSAweCUwOGx4IHRvIDB4JTA4bHhcbiIsCisJCQkJCWltYWdlX2dldF9kYXRhIChmZHRfaGRyKSwgbG9hZF9zdGFydCk7CisKKwkJCW1lbW1vdmUgKCh2b2lkICopbG9hZF9zdGFydCwKKwkJCQkJKHZvaWQgKilpbWFnZV9nZXRfZGF0YSAoZmR0X2hkciksCisJCQkJCWltYWdlX2dldF9kYXRhX3NpemUgKGZkdF9oZHIpKTsKKworCQkJZmR0X2Jsb2IgPSAoY2hhciAqKWxvYWRfc3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSBJTUFHRV9GT1JNQVRfRklUOgorCQkJLyoKKwkJCSAqIFRoaXMgY2FzZSB3aWxsIGNhdGNoIGJvdGg6IG5ldyB1SW1hZ2UgZm9ybWF0CisJCQkgKiAobGliZmR0IGJhc2VkKSBhbmQgcmF3IEZEVCBibG9iIChhbHNvIGxpYmZkdAorCQkJICogYmFzZWQpLgorCQkJICovCisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCQkJLyogY2hlY2sgRkRUIGJsb2IgdnMgRklUIGJsb2IgKi8KKwkJCWlmIChmaXRfY2hlY2tfZm9ybWF0ICgoY29uc3Qgdm9pZCAqKWZkdF9hZGRyKSkgeworCQkJCS8qCisJCQkJICogRklUIGltYWdlCisJCQkJICovCisJCQkJZml0X2hkciA9ICh2b2lkICopZmR0X2FkZHI7CisJCQkJcHJpbnRmICgiIyMgRmxhdHRlbmVkIERldmljZSBUcmVlIGZyb20gRklUIEltYWdlIGF0ICUwOGx4XG4iLAorCQkJCQkJZmR0X2FkZHIpOworCisJCQkJaWYgKCFmaXRfdW5hbWVfZmR0KSB7CisJCQkJCS8qCisJCQkJCSAqIG5vIEZEVCBibG9iIGltYWdlIG5vZGUgdW5pdCBuYW1lLAorCQkJCQkgKiB0cnkgdG8gZ2V0IGNvbmZpZyBub2RlIGZpcnN0LiBJZgorCQkJCQkgKiBjb25maWcgdW5pdCBub2RlIG5hbWUgaXMgTlVMTAorCQkJCQkgKiBmaXRfY29uZl9nZXRfbm9kZSgpIHdpbGwgdHJ5IHRvCisJCQkJCSAqIGZpbmQgZGVmYXVsdCBjb25maWcgbm9kZQorCQkJCQkgKi8KKwkJCQkJY2ZnX25vZmZzZXQgPSBmaXRfY29uZl9nZXRfbm9kZSAoZml0X2hkciwKKwkJCQkJCQlmaXRfdW5hbWVfY29uZmlnKTsKKworCQkJCQlpZiAoY2ZnX25vZmZzZXQgPCAwKSB7CisJCQkJCQlmZHRfZXJyb3IgKCJDb3VsZCBub3QgZmluZCBjb25maWd1cmF0aW9uIG5vZGVcbiIpOworCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCisJCQkJCWZpdF91bmFtZV9jb25maWcgPSBmZHRfZ2V0X25hbWUgKGZpdF9oZHIsCisJCQkJCQkJY2ZnX25vZmZzZXQsIE5VTEwpOworCQkJCQlwcmludGYgKCIgICBVc2luZyAnJXMnIGNvbmZpZ3VyYXRpb25cbiIsCisJCQkJCQkJZml0X3VuYW1lX2NvbmZpZyk7CisKKwkJCQkJZmR0X25vZmZzZXQgPSBmaXRfY29uZl9nZXRfZmR0X25vZGUgKGZpdF9oZHIsCisJCQkJCQkJY2ZnX25vZmZzZXQpOworCQkJCQlmaXRfdW5hbWVfZmR0ID0gZml0X2dldF9uYW1lIChmaXRfaGRyLAorCQkJCQkJCWZkdF9ub2Zmc2V0LCBOVUxMKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBnZXQgRkRUIGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldCAqLworCQkJCQlmZHRfbm9mZnNldCA9IGZpdF9pbWFnZV9nZXRfbm9kZSAoZml0X2hkciwKKwkJCQkJCQlmaXRfdW5hbWVfZmR0KTsKKwkJCQl9CisJCQkJaWYgKGZkdF9ub2Zmc2V0IDwgMCkgeworCQkJCQlmZHRfZXJyb3IgKCJDb3VsZCBub3QgZmluZCBzdWJpbWFnZSBub2RlXG4iKTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisKKwkJCQlwcmludGYgKCIgICBUcnlpbmcgJyVzJyBGRFQgYmxvYiBzdWJpbWFnZVxuIiwKKwkJCQkJCWZpdF91bmFtZV9mZHQpOworCisJCQkJaWYgKCFmaXRfY2hlY2tfZmR0IChmaXRfaGRyLCBmZHRfbm9mZnNldCwKKwkJCQkJCQlpbWFnZXMtPnZlcmlmeSkpCisJCQkJCWdvdG8gZXJyb3I7CisKKwkJCQkvKiBnZXQgcmFtZGlzayBpbWFnZSBkYXRhIGFkZHJlc3MgYW5kIGxlbmd0aCAqLworCQkJCWlmIChmaXRfaW1hZ2VfZ2V0X2RhdGEgKGZpdF9oZHIsIGZkdF9ub2Zmc2V0LAorCQkJCQkJCSZkYXRhLCAmc2l6ZSkpIHsKKwkJCQkJZmR0X2Vycm9yICgiQ291bGQgbm90IGZpbmQgRkRUIHN1YmltYWdlIGRhdGEiKTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisKKwkJCQkvKiB2ZXJpZnQgdGhhdCBpbWFnZSBkYXRhIGlzIGEgcHJvcGVyIEZEVCBibG9iICovCisJCQkJaWYgKGZkdF9jaGVja19oZWFkZXIgKChjaGFyICopZGF0YSkgIT0gMCkgeworCQkJCQlmZHRfZXJyb3IgKCJTdWJpbWFnZSBkYXRhIGlzIG5vdCBhIEZURCIpOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKworCQkJCS8qCisJCQkJICogbW92ZSBpbWFnZSBkYXRhIHRvIHRoZSBsb2FkIGFkZHJlc3MsCisJCQkJICogbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJ3cml0ZSBpbml0aWFsIGltYWdlCisJCQkJICovCisJCQkJaW1hZ2Vfc3RhcnQgPSAodWxvbmcpZml0X2hkcjsKKwkJCQlpbWFnZV9lbmQgPSBmaXRfZ2V0X2VuZCAoZml0X2hkcik7CisKKwkJCQlpZiAoZml0X2ltYWdlX2dldF9sb2FkIChmaXRfaGRyLCBmZHRfbm9mZnNldCwKKwkJCQkJCQkmbG9hZF9zdGFydCkgPT0gMCkgeworCQkJCQlsb2FkX2VuZCA9IGxvYWRfc3RhcnQgKyBzaXplOworCisJCQkJCWlmICgobG9hZF9zdGFydCA8IGltYWdlX2VuZCkgJiYKKwkJCQkJCQkobG9hZF9lbmQgPiBpbWFnZV9zdGFydCkpIHsKKwkJCQkJCWZkdF9lcnJvciAoIkZEVCBvdmVyd3JpdHRlbiIpOworCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCisJCQkJCXByaW50ZiAoIiAgIExvYWRpbmcgRkRUIGZyb20gMHglMDhseCB0byAweCUwOGx4XG4iLAorCQkJCQkJCSh1bG9uZylkYXRhLCBsb2FkX3N0YXJ0KTsKKworCQkJCQltZW1tb3ZlICgodm9pZCAqKWxvYWRfc3RhcnQsCisJCQkJCQkJKHZvaWQgKilkYXRhLCBzaXplKTsKKworCQkJCQlmZHRfYmxvYiA9IChjaGFyICopbG9hZF9zdGFydDsKKwkJCQl9IGVsc2UgeworCQkJCQlmZHRfYmxvYiA9IChjaGFyICopZGF0YTsKKwkJCQl9CisKKwkJCQlpbWFnZXMtPmZpdF9oZHJfZmR0ID0gZml0X2hkcjsKKwkJCQlpbWFnZXMtPmZpdF91bmFtZV9mZHQgPSBmaXRfdW5hbWVfZmR0OworCQkJCWltYWdlcy0+Zml0X25vZmZzZXRfZmR0ID0gZmR0X25vZmZzZXQ7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJeworCQkJCS8qCisJCQkJICogRkRUIGJsb2IKKwkJCQkgKi8KKwkJCQlmZHRfYmxvYiA9IChjaGFyICopZmR0X2FkZHI7CisJCQkJZGVidWcgKCIqICBmZHQ6IHJhdyBGRFQgYmxvYlxuIik7CisJCQkJcHJpbnRmICgiIyMgRmxhdHRlbmVkIERldmljZSBUcmVlIGJsb2IgYXQgJTA4bHhcbiIsIChsb25nKWZkdF9ibG9iKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHV0cyAoIkVSUk9SOiBEaWQgbm90IGZpbmQgYSBjbWRsaW5lIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZVxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJcHJpbnRmICgiICAgQm9vdGluZyB1c2luZyB0aGUgZmR0IGJsb2IgYXQgMHgleFxuIiwgKGludClmZHRfYmxvYik7CisKKwl9IGVsc2UgaWYgKGltYWdlcy0+bGVnYWN5X2hkcl92YWxpZCAmJgorCQkJaW1hZ2VfY2hlY2tfdHlwZSAoJmltYWdlcy0+bGVnYWN5X2hkcl9vc19jb3B5LCBJSF9UWVBFX01VTFRJKSkgeworCisJCXVsb25nIGZkdF9kYXRhLCBmZHRfbGVuOworCisJCS8qCisJCSAqIE5vdyBjaGVjayBpZiB3ZSBoYXZlIGEgbGVnYWN5IG11bHRpLWNvbXBvbmVudCBpbWFnZSwKKwkJICogZ2V0IHNlY29uZCBlbnRyeSBkYXRhIHN0YXJ0IGFkZHJlc3MgYW5kIGxlbi4KKwkJICovCisJCXByaW50ZiAoIiMjIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSBmcm9tIG11bHRpICIKKwkJCSJjb21wb25lbnQgSW1hZ2UgYXQgJTA4bFhcbiIsCisJCQkodWxvbmcpaW1hZ2VzLT5sZWdhY3lfaGRyX29zKTsKKworCQlpbWFnZV9tdWx0aV9nZXRpbWcgKGltYWdlcy0+bGVnYWN5X2hkcl9vcywgMiwgJmZkdF9kYXRhLCAmZmR0X2xlbik7CisJCWlmIChmZHRfbGVuKSB7CisKKwkJCWZkdF9ibG9iID0gKGNoYXIgKilmZHRfZGF0YTsKKwkJCXByaW50ZiAoIiAgIEJvb3RpbmcgdXNpbmcgdGhlIGZkdCBhdCAweCV4XG4iLCAoaW50KWZkdF9ibG9iKTsKKworCQkJaWYgKGZkdF9jaGVja19oZWFkZXIgKGZkdF9ibG9iKSAhPSAwKSB7CisJCQkJZmR0X2Vycm9yICgiaW1hZ2UgaXMgbm90IGEgZmR0Iik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJaWYgKGJlMzJfdG9fY3B1IChmZHRfdG90YWxzaXplIChmZHRfYmxvYikpICE9IGZkdF9sZW4pIHsKKwkJCQlmZHRfZXJyb3IgKCJmZHQgc2l6ZSAhPSBpbWFnZSBzaXplIik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRlYnVnICgiIyMgTm8gRmxhdHRlbmVkIERldmljZSBUcmVlXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJZGVidWcgKCIjIyBObyBGbGF0dGVuZWQgRGV2aWNlIFRyZWVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkqb2ZfZmxhdF90cmVlID0gZmR0X2Jsb2I7CisJKm9mX3NpemUgPSBiZTMyX3RvX2NwdSAoZmR0X3RvdGFsc2l6ZSAoZmR0X2Jsb2IpKTsKKwlkZWJ1ZyAoIiAgIG9mX2ZsYXRfdHJlZSBhdCAweCUwOGx4IHNpemUgMHglMDhseFxuIiwKKwkJCSh1bG9uZykqb2ZfZmxhdF90cmVlLCAqb2Zfc2l6ZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJKm9mX2ZsYXRfdHJlZSA9IDA7CisJKm9mX3NpemUgPSAwOworCXJldHVybiAxOworfQorI2VuZGlmIC8qIENPTkZJR19PRl9MSUJGRFQgKi8KKyNlbmRpZiAvKiAhVVNFX0hPU1RDQyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTmV3IHVJbWFnZSBmb3JtYXQgcm91dGluZXMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVVNFX0hPU1RDQworc3RhdGljIGludCBmaXRfcGFyc2Vfc3BlYyAoY29uc3QgY2hhciAqc3BlYywgY2hhciBzZXBjLCB1bG9uZyBhZGRyX2N1cnIsCisJCXVsb25nICphZGRyLCBjb25zdCBjaGFyICoqbmFtZSkKK3sKKwljb25zdCBjaGFyICpzZXA7CisKKwkqYWRkciA9IGFkZHJfY3VycjsKKwkqbmFtZSA9IE5VTEw7CisKKwlzZXAgPSBzdHJjaHIgKHNwZWMsIHNlcGMpOworCWlmIChzZXApIHsKKwkJaWYgKHNlcCAtIHNwZWMgPiAwKQorCQkJKmFkZHIgPSBzaW1wbGVfc3RydG91bCAoc3BlYywgTlVMTCwgMTYpOworCisJCSpuYW1lID0gc2VwICsgMTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X3BhcnNlX2NvbmYgLSBwYXJzZSBGSVQgY29uZmlndXJhdGlvbiBzcGVjCisgKiBAc3BlYzogaW5wdXQgc3RyaW5nLCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gc3BlYworICogQGFkZF9jdXJyOiBjdXJyZW50IGltYWdlIGFkZHJlc3MgKHRvIGJlIHVzZWQgYXMgYSBwb3NzaWJsZSBkZWZhdWx0KQorICogQGFkZHI6IHBvaW50ZXIgdG8gYSB1bG9uZyB2YXJpYWJsZSwgd2lsbCBob2xkIEZJVCBpbWFnZSBhZGRyZXNzIG9mIGEgZ2l2ZW4KKyAqIGNvbmZpZ3VyYXRpb24KKyAqIEBjb25mX25hbWUgZG91YmxlIHBvaW50ZXIgdG8gYSBjaGFyLCB3aWxsIGhvbGQgcG9pbnRlciB0byBhIGNvbmZpZ3VyYXRpb24KKyAqIHVuaXQgbmFtZQorICoKKyAqIGZpdF9wYXJzZV9jb25mKCkgZXhwZWN0cyBjb25maWd1cmF0aW9uIHNwZWMgaW4gdGhlIGZvciBvZiBbPGFkZHI+XSM8Y29uZj4sCisgKiB3aGVyZSA8YWRkcj4gaXMgYSBGSVQgaW1hZ2UgYWRkcmVzcyB0aGF0IGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24KKyAqIHdpdGggYSA8Y29uZj4gdW5pdCBuYW1lLgorICoKKyAqIEFkZHJlc3MgcGFydCBpcyBvcHRpb25hbCwgYW5kIGlmIG9taXR0ZWQgZGVmYXVsdCBhZGRfY3VyciB3aWxsCisgKiBiZSB1c2VkIGluc3RlYWQuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxIGlmIHNwZWMgaXMgYSB2YWxpZCBjb25maWd1cmF0aW9uIHN0cmluZywKKyAqICAgICBhZGRyIGFuZCBjb25mX25hbWUgYXJlIHNldCBhY2NvcmRpbmdseQorICogICAgIDAgb3RoZXJ3aXNlCisgKi8KK2lubGluZSBpbnQgZml0X3BhcnNlX2NvbmYgKGNvbnN0IGNoYXIgKnNwZWMsIHVsb25nIGFkZHJfY3VyciwKKwkJdWxvbmcgKmFkZHIsIGNvbnN0IGNoYXIgKipjb25mX25hbWUpCit7CisJcmV0dXJuIGZpdF9wYXJzZV9zcGVjIChzcGVjLCAnIycsIGFkZHJfY3VyciwgYWRkciwgY29uZl9uYW1lKTsKK30KKworLyoqCisgKiBmaXRfcGFyc2Vfc3ViaW1hZ2UgLSBwYXJzZSBGSVQgc3ViaW1hZ2Ugc3BlYworICogQHNwZWM6IGlucHV0IHN0cmluZywgY29udGFpbmluZyBzdWJpbWFnZSBzcGVjCisgKiBAYWRkX2N1cnI6IGN1cnJlbnQgaW1hZ2UgYWRkcmVzcyAodG8gYmUgdXNlZCBhcyBhIHBvc3NpYmxlIGRlZmF1bHQpCisgKiBAYWRkcjogcG9pbnRlciB0byBhIHVsb25nIHZhcmlhYmxlLCB3aWxsIGhvbGQgRklUIGltYWdlIGFkZHJlc3Mgb2YgYSBnaXZlbgorICogc3ViaW1hZ2UKKyAqIEBpbWFnZV9uYW1lOiBkb3VibGUgcG9pbnRlciB0byBhIGNoYXIsIHdpbGwgaG9sZCBwb2ludGVyIHRvIGEgc3ViaW1hZ2UgbmFtZQorICoKKyAqIGZpdF9wYXJzZV9zdWJpbWFnZSgpIGV4cGVjdHMgc3ViaW1hZ2Ugc3BlYyBpbiB0aGUgZm9yIG9mCisgKiBbPGFkZHI+XTo8c3ViaW1hZ2U+LCB3aGVyZSA8YWRkcj4gaXMgYSBGSVQgaW1hZ2UgYWRkcmVzcyB0aGF0IGNvbnRhaW5zCisgKiBzdWJpbWFnZSB3aXRoIGEgPHN1YmltZz4gdW5pdCBuYW1lLgorICoKKyAqIEFkZHJlc3MgcGFydCBpcyBvcHRpb25hbCwgYW5kIGlmIG9taXR0ZWQgZGVmYXVsdCBhZGRfY3VyciB3aWxsCisgKiBiZSB1c2VkIGluc3RlYWQuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxIGlmIHNwZWMgaXMgYSB2YWxpZCBzdWJpbWFnZSBzdHJpbmcsCisgKiAgICAgYWRkciBhbmQgaW1hZ2VfbmFtZSBhcmUgc2V0IGFjY29yZGluZ2x5CisgKiAgICAgMCBvdGhlcndpc2UKKyAqLworaW5saW5lIGludCBmaXRfcGFyc2Vfc3ViaW1hZ2UgKGNvbnN0IGNoYXIgKnNwZWMsIHVsb25nIGFkZHJfY3VyciwKKwkJdWxvbmcgKmFkZHIsIGNvbnN0IGNoYXIgKippbWFnZV9uYW1lKQoreworCXJldHVybiBmaXRfcGFyc2Vfc3BlYyAoc3BlYywgJzonLCBhZGRyX2N1cnIsIGFkZHIsIGltYWdlX25hbWUpOworfQorI2VuZGlmIC8qICFVU0VfSE9TVENDICovCisKK3N0YXRpYyB2b2lkIGZpdF9nZXRfZGVidWcgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsCisJCWNoYXIgKnByb3BfbmFtZSwgaW50IGVycikKK3sKKwlkZWJ1ZyAoIkNhbid0IGdldCAnJXMnIHByb3BlcnR5IGZyb20gRklUIDB4JTA4bHgsICIKKwkJIm5vZGU6IG9mZnNldCAlZCwgbmFtZSAlcyAoJXMpXG4iLAorCQlwcm9wX25hbWUsICh1bG9uZylmaXQsIG5vZmZzZXQsCisJCWZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJZmR0X3N0cmVycm9yIChlcnIpKTsKK30KKworLyoqCisgKiBmaXRfcHJpbnRfY29udGVudHMgLSBwcmludHMgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgRklUIGZvcm1hdCBpbWFnZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBwOiBwb2ludGVyIHRvIHByZWZpeCBzdHJpbmcKKyAqCisgKiBmaXRfcHJpbnRfY29udGVudHMoKSBmb3JtYXRzIGEgbXVsdGkgbGluZSBGSVQgaW1hZ2UgY29udGVudHMgZGVzY3JpcHRpb24uCisgKiBUaGUgcm91dGluZSBwcmludHMgb3V0IEZJVCBpbWFnZSBwcm9wZXJ0aWVzIChyb290IG5vZGUgbGV2ZWwpIGZvbGx3ZWQgYnkKKyAqIHRoZSBkZXRhaWxzIG9mIGVhY2ggY29tcG9uZW50IGltYWdlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgbm8gcmV0dXJuZWQgcmVzdWx0cworICovCit2b2lkIGZpdF9wcmludF9jb250ZW50cyAoY29uc3Qgdm9pZCAqZml0KQoreworCWNoYXIgKmRlc2M7CisJY2hhciAqdW5hbWU7CisJaW50IGltYWdlc19ub2Zmc2V0OworCWludCBjb25mc19ub2Zmc2V0OworCWludCBub2Zmc2V0OworCWludCBuZGVwdGg7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgcmV0OworCWNvbnN0IGNoYXIgKnA7CisjaWYgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKSB8fCBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorCXRpbWVfdCB0aW1lc3RhbXA7CisjZW5kaWYKKworI2lmZGVmIFVTRV9IT1NUQ0MKKwlwID0gIiI7CisjZWxzZQorCXAgPSAiICAgIjsKKyNlbmRpZgorCisJLyogUm9vdCBub2RlIHByb3BlcnRpZXMgKi8KKwlyZXQgPSBmaXRfZ2V0X2Rlc2MgKGZpdCwgMCwgJmRlc2MpOworCXByaW50ZiAoIiVzRklUIGRlc2NyaXB0aW9uOiAiLCBwKTsKKwlpZiAocmV0KQorCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJZWxzZQorCQlwcmludGYgKCIlc1xuIiwgZGVzYyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCisJcmV0ID0gZml0X2dldF90aW1lc3RhbXAgKGZpdCwgMCwgJnRpbWVzdGFtcCk7CisJcHJpbnRmICgiJXNDcmVhdGVkOiAgICAgICAgICIsIHApOworCWlmIChyZXQpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCWdlbmltZ19wcmludF90aW1lICh0aW1lc3RhbXApOworI2VuZGlmCisKKwkvKiBGaW5kIGltYWdlcyBwYXJlbnQgbm9kZSBvZmZzZXQgKi8KKwlpbWFnZXNfbm9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZml0LCBGSVRfSU1BR0VTX1BBVEgpOworCWlmIChpbWFnZXNfbm9mZnNldCA8IDApIHsKKwkJcHJpbnRmICgiQ2FuJ3QgZmluZCBpbWFnZXMgcGFyZW50IG5vZGUgJyVzJyAoJXMpXG4iLAorCQkJRklUX0lNQUdFU19QQVRILCBmZHRfc3RyZXJyb3IgKGltYWdlc19ub2Zmc2V0KSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBQcm9jZXNzIGl0cyBzdWJub2RlcywgcHJpbnQgb3V0IGNvbXBvbmVudCBpbWFnZXMgZGV0YWlscyAqLworCWZvciAobmRlcHRoID0gMCwgY291bnQgPSAwLCBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBpbWFnZXNfbm9mZnNldCwgJm5kZXB0aCk7CisJICAgICAobm9mZnNldCA+PSAwKSAmJiAobmRlcHRoID4gMCk7CisJICAgICBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBub2Zmc2V0LCAmbmRlcHRoKSkgeworCQlpZiAobmRlcHRoID09IDEpIHsKKwkJCS8qCisJCQkgKiBEaXJlY3QgY2hpbGQgbm9kZSBvZiB0aGUgaW1hZ2VzIHBhcmVudCBub2RlLAorCQkJICogaS5lLiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKwkJCSAqLworCQkJcHJpbnRmICgiJXMgSW1hZ2UgJXUgKCVzKVxuIiwgcCwgY291bnQrKywKKwkJCQkJZml0X2dldF9uYW1lKGZpdCwgbm9mZnNldCwgTlVMTCkpOworCisJCQlmaXRfaW1hZ2VfcHJpbnQgKGZpdCwgbm9mZnNldCwgcCk7CisJCX0KKwl9CisKKwkvKiBGaW5kIGNvbmZpZ3VyYXRpb25zIHBhcmVudCBub2RlIG9mZnNldCAqLworCWNvbmZzX25vZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZpdCwgRklUX0NPTkZTX1BBVEgpOworCWlmIChjb25mc19ub2Zmc2V0IDwgMCkgeworCQlkZWJ1ZyAoIkNhbid0IGdldCBjb25maWd1cmF0aW9ucyBwYXJlbnQgbm9kZSAnJXMnICglcylcbiIsCisJCQlGSVRfQ09ORlNfUEFUSCwgZmR0X3N0cmVycm9yIChjb25mc19ub2Zmc2V0KSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBnZXQgZGVmYXVsdCBjb25maWd1cmF0aW9uIHVuaXQgbmFtZSBmcm9tIGRlZmF1bHQgcHJvcGVydHkgKi8KKwl1bmFtZSA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0RFRkFVTFRfUFJPUCwgTlVMTCk7CisJaWYgKHVuYW1lKQorCQlwcmludGYgKCIlcyBEZWZhdWx0IENvbmZpZ3VyYXRpb246ICclcydcbiIsIHAsIHVuYW1lKTsKKworCS8qIFByb2Nlc3MgaXRzIHN1Ym5vZGVzLCBwcmludCBvdXQgY29uZmlndXJhdGlvbnMgZGV0YWlscyAqLworCWZvciAobmRlcHRoID0gMCwgY291bnQgPSAwLCBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBjb25mc19ub2Zmc2V0LCAmbmRlcHRoKTsKKwkgICAgIChub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkgICAgIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyoKKwkJCSAqIERpcmVjdCBjaGlsZCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9ucyBwYXJlbnQgbm9kZSwKKwkJCSAqIGkuZS4gY29uZmlndXJhdGlvbiBub2RlLgorCQkJICovCisJCQlwcmludGYgKCIlcyBDb25maWd1cmF0aW9uICV1ICglcylcbiIsIHAsIGNvdW50KyssCisJCQkJCWZpdF9nZXRfbmFtZShmaXQsIG5vZmZzZXQsIE5VTEwpKTsKKworCQkJZml0X2NvbmZfcHJpbnQgKGZpdCwgbm9mZnNldCwgcCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogZml0X2ltYWdlX3ByaW50IC0gcHJpbnRzIG91dCB0aGUgRklUIGNvbXBvbmVudCBpbWFnZSBkZXRhaWxzCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQGltYWdlX25vZmZzZXQ6IG9mZnNldCBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBwOiBwb2ludGVyIHRvIHByZWZpeCBzdHJpbmcKKyAqCisgKiBmaXRfaW1hZ2VfcHJpbnQoKSBsaXN0cyBhbGwgbWFuZGF0b3J5IHByb3BlcmllcyBmb3IgdGhlIHByb2Nlc3NlZCBjb21wb25lbnQKKyAqIGltYWdlLiBJZiBwcmVzZW50LCBoYXNoIG5vZGVzIGFyZSBwcmludGVkIG91dCBhcyB3ZWxsLiBMb2FkCisgKiBhZGRyZXNzIGZvciBpbWFnZXMgb2YgdHlwZSBmaXJtd2FyZSBpcyBhbHNvIHByaW50ZWQgb3V0LiBTaW5jZSB0aGUgbG9hZAorICogYWRkcmVzcyBpcyBub3QgbWFuZGF0b3J5IGZvciBmaXJtd2FyZSBpbWFnZXMsIGl0IHdpbGwgYmUgb3V0cHV0IGFzCisgKiAidW5hdmFpbGFibGUiIHdoZW4gbm90IHByZXNlbnQuCisgKgorICogcmV0dXJuczoKKyAqICAgICBubyByZXR1cm5lZCByZXN1bHRzCisgKi8KK3ZvaWQgZml0X2ltYWdlX3ByaW50IChjb25zdCB2b2lkICpmaXQsIGludCBpbWFnZV9ub2Zmc2V0LCBjb25zdCBjaGFyICpwKQoreworCWNoYXIgKmRlc2M7CisJdWludDhfdCB0eXBlLCBhcmNoLCBvcywgY29tcDsKKwlzaXplX3Qgc2l6ZTsKKwl1bG9uZyBsb2FkLCBlbnRyeTsKKwljb25zdCB2b2lkICpkYXRhOworCWludCBub2Zmc2V0OworCWludCBuZGVwdGg7CisJaW50IHJldDsKKworCS8qIE1hbmRhdG9yeSBwcm9wZXJ0aWVzICovCisJcmV0ID0gZml0X2dldF9kZXNjIChmaXQsIGltYWdlX25vZmZzZXQsICZkZXNjKTsKKwlwcmludGYgKCIlcyAgRGVzY3JpcHRpb246ICAiLCBwKTsKKwlpZiAocmV0KQorCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJZWxzZQorCQlwcmludGYgKCIlc1xuIiwgZGVzYyk7CisKKwlmaXRfaW1hZ2VfZ2V0X3R5cGUgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJnR5cGUpOworCXByaW50ZiAoIiVzICBUeXBlOiAgICAgICAgICVzXG4iLCBwLCBnZW5pbWdfZ2V0X3R5cGVfbmFtZSAodHlwZSkpOworCisJZml0X2ltYWdlX2dldF9jb21wIChmaXQsIGltYWdlX25vZmZzZXQsICZjb21wKTsKKwlwcmludGYgKCIlcyAgQ29tcHJlc3Npb246ICAlc1xuIiwgcCwgZ2VuaW1nX2dldF9jb21wX25hbWUgKGNvbXApKTsKKworCXJldCA9IGZpdF9pbWFnZV9nZXRfZGF0YSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmZGF0YSwgJnNpemUpOworCisjaWZuZGVmIFVTRV9IT1NUQ0MKKwlwcmludGYgKCIlcyAgRGF0YSBTdGFydDogICAiLCBwKTsKKwlpZiAocmV0KQorCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJZWxzZQorCQlwcmludGYgKCIweCUwOGx4XG4iLCAodWxvbmcpZGF0YSk7CisjZW5kaWYKKworCXByaW50ZiAoIiVzICBEYXRhIFNpemU6ICAgICIsIHApOworCWlmIChyZXQpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCWdlbmltZ19wcmludF9zaXplIChzaXplKTsKKworCS8qIFJlbWFpbmluZywgdHlwZSBkZXBlbmRlbnQgcHJvcGVydGllcyAqLworCWlmICgodHlwZSA9PSBJSF9UWVBFX0tFUk5FTCkgfHwgKHR5cGUgPT0gSUhfVFlQRV9TVEFOREFMT05FKSB8fAorCSAgICAodHlwZSA9PSBJSF9UWVBFX1JBTURJU0spIHx8ICh0eXBlID09IElIX1RZUEVfRklSTVdBUkUpIHx8CisJICAgICh0eXBlID09IElIX1RZUEVfRkxBVERUKSkgeworCQlmaXRfaW1hZ2VfZ2V0X2FyY2ggKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJmFyY2gpOworCQlwcmludGYgKCIlcyAgQXJjaGl0ZWN0dXJlOiAlc1xuIiwgcCwgZ2VuaW1nX2dldF9hcmNoX25hbWUgKGFyY2gpKTsKKwl9CisKKwlpZiAodHlwZSA9PSBJSF9UWVBFX0tFUk5FTCkgeworCQlmaXRfaW1hZ2VfZ2V0X29zIChmaXQsIGltYWdlX25vZmZzZXQsICZvcyk7CisJCXByaW50ZiAoIiVzICBPUzogICAgICAgICAgICVzXG4iLCBwLCBnZW5pbWdfZ2V0X29zX25hbWUgKG9zKSk7CisJfQorCisJaWYgKCh0eXBlID09IElIX1RZUEVfS0VSTkVMKSB8fCAodHlwZSA9PSBJSF9UWVBFX1NUQU5EQUxPTkUpIHx8CisJCSh0eXBlID09IElIX1RZUEVfRklSTVdBUkUpKSB7CisJCXJldCA9IGZpdF9pbWFnZV9nZXRfbG9hZCAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmbG9hZCk7CisJCXByaW50ZiAoIiVzICBMb2FkIEFkZHJlc3M6ICIsIHApOworCQlpZiAocmV0KQorCQkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCQllbHNlCisJCQlwcmludGYgKCIweCUwOGx4XG4iLCBsb2FkKTsKKwl9CisKKwlpZiAoKHR5cGUgPT0gSUhfVFlQRV9LRVJORUwpIHx8ICh0eXBlID09IElIX1RZUEVfU1RBTkRBTE9ORSkpIHsKKwkJZml0X2ltYWdlX2dldF9lbnRyeSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmZW50cnkpOworCQlwcmludGYgKCIlcyAgRW50cnkgUG9pbnQ6ICAiLCBwKTsKKwkJaWYgKHJldCkKKwkJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmICgiMHglMDhseFxuIiwgZW50cnkpOworCX0KKworCS8qIFByb2Nlc3MgYWxsIGhhc2ggc3Vibm9kZXMgb2YgdGhlIGNvbXBvbmVudCBpbWFnZSBub2RlICovCisJZm9yIChuZGVwdGggPSAwLCBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmbmRlcHRoKTsKKwkgICAgIChub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkgICAgIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyogRGlyZWN0IGNoaWxkIG5vZGUgb2YgdGhlIGNvbXBvbmVudCBpbWFnZSBub2RlICovCisJCQlmaXRfaW1hZ2VfcHJpbnRfaGFzaCAoZml0LCBub2Zmc2V0LCBwKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBmaXRfaW1hZ2VfcHJpbnRfaGFzaCAtIHByaW50cyBvdXQgdGhlIGhhc2ggbm9kZSBkZXRhaWxzCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IG9mZnNldCBvZiB0aGUgaGFzaCBub2RlCisgKiBAcDogcG9pbnRlciB0byBwcmVmaXggc3RyaW5nCisgKgorICogZml0X2ltYWdlX3ByaW50X2hhc2goKSBsaXN0cyBwcm9wZXJpZXMgZm9yIHRoZSBwcm9jZXNzZWQgaGFzaCBub2RlCisgKgorICogcmV0dXJuczoKKyAqICAgICBubyByZXR1cm5lZCByZXN1bHRzCisgKi8KK3ZvaWQgZml0X2ltYWdlX3ByaW50X2hhc2ggKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNvbnN0IGNoYXIgKnApCit7CisJY2hhciAqYWxnbzsKKwl1aW50OF90ICp2YWx1ZTsKKwlpbnQgdmFsdWVfbGVuOworCWludCBpLCByZXQ7CisKKwkvKgorCSAqIENoZWNrIHN1Ym5vZGUgbmFtZSwgbXVzdCBiZSBlcXVhbCB0byAiaGFzaCIuCisJICogTXVsdGlwbGUgaGFzaCBub2RlcyByZXF1aXJlIHVuaXF1ZSB1bml0IG5vZGUKKwkgKiBuYW1lcywgZS5nLiBoYXNoQDEsIGhhc2hAMiwgZXRjLgorCSAqLworCWlmIChzdHJuY21wIChmaXRfZ2V0X25hbWUoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCUZJVF9IQVNIX05PREVOQU1FLAorCQkJc3RybGVuKEZJVF9IQVNIX05PREVOQU1FKSkgIT0gMCkKKwkJcmV0dXJuOworCisJZGVidWcgKCIlcyAgSGFzaCBub2RlOiAgICAnJXMnXG4iLCBwLAorCQkJZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpKTsKKworCXByaW50ZiAoIiVzICBIYXNoIGFsZ286ICAgICIsIHApOworCWlmIChmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbyAoZml0LCBub2Zmc2V0LCAmYWxnbykpIHsKKwkJcHJpbnRmICgiaW52YWxpZC91bnN1cHBvcnRlZFxuIik7CisJCXJldHVybjsKKwl9CisJcHJpbnRmICgiJXNcbiIsIGFsZ28pOworCisJcmV0ID0gZml0X2ltYWdlX2hhc2hfZ2V0X3ZhbHVlIChmaXQsIG5vZmZzZXQsICZ2YWx1ZSwKKwkJCQkJJnZhbHVlX2xlbik7CisJcHJpbnRmICgiJXMgIEhhc2ggdmFsdWU6ICAgIiwgcCk7CisJaWYgKHJldCkgeworCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IHZhbHVlX2xlbjsgaSsrKQorCQkJcHJpbnRmICgiJTAyeCIsIHZhbHVlW2ldKTsKKwkJcHJpbnRmICgiXG4iKTsKKwl9CisKKwlkZWJ1ZyAgKCIlcyAgSGFzaCBsZW46ICAgICAlZFxuIiwgcCwgdmFsdWVfbGVuKTsKK30KKworLyoqCisgKiBmaXRfZ2V0X2Rlc2MgLSBnZXQgbm9kZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBub2RlIG9mZnNldAorICogQGRlc2M6IGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjaGFyLCB3aWxsIGhvbGQgcG9pbnRlciB0byB0aGUgZGVzY3JwdGlvbgorICoKKyAqIGZpdF9nZXRfZGVzYygpIHJlYWRzIGRlc2NyaXB0aW9uIHByb3BlcnR5IGZyb20gYSBnaXZlbiBub2RlLCBpZgorICogZGVzY3JpcHRpb24gaXMgZm91bmQgcG9pbnRlciB0byBpdCBpcyByZXR1cmVuZWQgaW4gdGhpcmQgY2FsbCBhcmd1bWVudC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2dldF9kZXNjIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjaGFyICoqZGVzYykKK3sKKwlpbnQgbGVuOworCisJKmRlc2MgPSAoY2hhciAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9ERVNDX1BST1AsICZsZW4pOworCWlmICgqZGVzYyA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX0RFU0NfUFJPUCwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9nZXRfdGltZXN0YW1wIC0gZ2V0IG5vZGUgdGltZXN0YW1wIHByb3BlcnR5CisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IG5vZGUgb2Zmc2V0CisgKiBAdGltZXN0YW1wOiBwb2ludGVyIHRvIHRoZSB0aW1lX3QsIHdpbGwgaG9sZCByZWFkIHRpbWVzdGFtcAorICoKKyAqIGZpdF9nZXRfdGltZXN0YW1wKCkgcmVhZHMgdGltZXN0YW1wIHBvcGVydHkgZnJvbSBnaXZlbiBub2RlLCBpZiB0aW1lc3RhbXAKKyAqIGlzIGZvdW5kIGFuZCBoYXMgYSBjb3JyZWN0IHNpemUgaXRzIHZhbHVlIGlzIHJldHVyZWQgaW4gdGhpcmQgY2FsbAorICogYXJndW1lbnQuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIHByb3BlcnR5IHJlYWQgZmFpbHVyZQorICogICAgIC0yLCBvbiB3cm9uZyB0aW1lc3RhbXAgc2l6ZQorICovCitpbnQgZml0X2dldF90aW1lc3RhbXAgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHRpbWVfdCAqdGltZXN0YW1wKQoreworCWludCBsZW47CisJY29uc3Qgdm9pZCAqZGF0YTsKKworCWRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfVElNRVNUQU1QX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfVElNRVNUQU1QX1BST1AsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGxlbiAhPSBzaXplb2YgKHVpbnQzMl90KSkgeworCQlkZWJ1ZyAoIkZJVCB0aW1lc3RhbXAgd2l0aCBpbmNvcnJlY3Qgc2l6ZSBvZiAoJXUpXG4iLCBsZW4pOworCQlyZXR1cm4gLTI7CisJfQorCisJKnRpbWVzdGFtcCA9IHVpbWFnZV90b19jcHUgKCooKHVpbnQzMl90ICopZGF0YSkpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfbm9kZSAtIGdldCBub2RlIG9mZnNldCBmb3IgY29tcG9uZW50IGltYWdlIG9mIGEgZ2l2ZW4gdW5pdCBuYW1lCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQGltYWdlX3VuYW1lOiBjb21wb25lbnQgaW1hZ2Ugbm9kZSB1bml0IG5hbWUKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X25vZGUoKSBmaW5kcyBhIGNvbXBvbmVudCBpbWFnZSAod2l0aGluZyB0aGUgJy9pbWFnZXMnCisgKiBub2RlKSBvZiBhIHByb3ZpZGVkIHVuaXQgbmFtZS4gSWYgaW1hZ2UgaXMgZm91bmQgaXRzIG5vZGUgb2Zmc2V0IGlzCisgKiByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgaW1hZ2Ugbm9kZSBvZmZzZXQgd2hlbiBmb3VuZCAoPj0wKQorICogICAgIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlIChGRFRfRVJSXyogY29kZSkKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBjb25zdCBjaGFyICppbWFnZV91bmFtZSkKK3sKKwlpbnQgbm9mZnNldCwgaW1hZ2VzX25vZmZzZXQ7CisKKwlpbWFnZXNfbm9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZml0LCBGSVRfSU1BR0VTX1BBVEgpOworCWlmIChpbWFnZXNfbm9mZnNldCA8IDApIHsKKwkJZGVidWcgKCJDYW4ndCBmaW5kIGltYWdlcyBwYXJlbnQgbm9kZSAnJXMnICglcylcbiIsCisJCQlGSVRfSU1BR0VTX1BBVEgsIGZkdF9zdHJlcnJvciAoaW1hZ2VzX25vZmZzZXQpKTsKKwkJcmV0dXJuIGltYWdlc19ub2Zmc2V0OworCX0KKworCW5vZmZzZXQgPSBmZHRfc3Vibm9kZV9vZmZzZXQgKGZpdCwgaW1hZ2VzX25vZmZzZXQsIGltYWdlX3VuYW1lKTsKKwlpZiAobm9mZnNldCA8IDApIHsKKwkJZGVidWcgKCJDYW4ndCBnZXQgbm9kZSBvZmZzZXQgZm9yIGltYWdlIHVuaXQgbmFtZTogJyVzJyAoJXMpXG4iLAorCQkJaW1hZ2VfdW5hbWUsIGZkdF9zdHJlcnJvciAobm9mZnNldCkpOworCX0KKworCXJldHVybiBub2Zmc2V0OworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfb3MgLSBnZXQgb3MgaWQgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAb3M6IHBvaW50ZXIgdG8gdGhlIHVpbnQ4X3QsIHdpbGwgaG9sZCBvcyBudW1lcmljIGlkCisgKgorICogZml0X2ltYWdlX2dldF9vcygpIGZpbmRzIG9zIHByb3BlcnR5IGluIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQsIGl0cyAoc3RyaW5nKSB2YWx1ZSBpcyB0cmFuc2xhdGVkIHRvIHRoZSBudW1lcmljCisgKiBpZCB3aGljaCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X29zIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICpvcykKK3sKKwlpbnQgbGVuOworCWNvbnN0IHZvaWQgKmRhdGE7CisKKwkvKiBHZXQgT1MgbmFtZSBmcm9tIHByb3BlcnR5IGRhdGEgKi8KKwlkYXRhID0gZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX09TX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfT1NfUFJPUCwgbGVuKTsKKwkJKm9zID0gLTE7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBUcmFuc2xhdGUgT1MgbmFtZSB0byBpZCAqLworCSpvcyA9IGdlbmltZ19nZXRfb3NfaWQgKGRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfYXJjaCAtIGdldCBhcmNoIGlkIGZvciBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGFyY2g6IHBvaW50ZXIgdG8gdGhlIHVpbnQ4X3QsIHdpbGwgaG9sZCBhcmNoIG51bWVyaWMgaWQKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X2FyY2goKSBmaW5kcyBhcmNoIHByb3BlcnR5IGluIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQsIGl0cyAoc3RyaW5nKSB2YWx1ZSBpcyB0cmFuc2xhdGVkIHRvIHRoZSBudW1lcmljCisgKiBpZCB3aGljaCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X2FyY2ggKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKmFyY2gpCit7CisJaW50IGxlbjsKKwljb25zdCB2b2lkICpkYXRhOworCisJLyogR2V0IGFyY2hpdGVjdHVyZSBuYW1lIGZyb20gcHJvcGVydHkgZGF0YSAqLworCWRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfQVJDSF9QUk9QLCAmbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX0FSQ0hfUFJPUCwgbGVuKTsKKwkJKmFyY2ggPSAtMTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFRyYW5zbGF0ZSBhcmNoaXRlY3R1cmUgbmFtZSB0byBpZCAqLworCSphcmNoID0gZ2VuaW1nX2dldF9hcmNoX2lkIChkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfZ2V0X3R5cGUgLSBnZXQgdHlwZSBpZCBmb3IgYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEB0eXBlOiBwb2ludGVyIHRvIHRoZSB1aW50OF90LCB3aWxsIGhvbGQgdHlwZSBudW1lcmljIGlkCisgKgorICogZml0X2ltYWdlX2dldF90eXBlKCkgZmluZHMgdHlwZSBwcm9wZXJ0eSBpbiBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kLCBpdHMgKHN0cmluZykgdmFsdWUgaXMgdHJhbnNsYXRlZCB0byB0aGUgbnVtZXJpYworICogaWQgd2hpY2ggaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2dldF90eXBlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICp0eXBlKQoreworCWludCBsZW47CisJY29uc3Qgdm9pZCAqZGF0YTsKKworCS8qIEdldCBpbWFnZSB0eXBlIG5hbWUgZnJvbSBwcm9wZXJ0eSBkYXRhICovCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9UWVBFX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfVFlQRV9QUk9QLCBsZW4pOworCQkqdHlwZSA9IC0xOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVHJhbnNsYXRlIGltYWdlIHR5cGUgbmFtZSB0byBpZCAqLworCSp0eXBlID0gZ2VuaW1nX2dldF90eXBlX2lkIChkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfZ2V0X2NvbXAgLSBnZXQgY29tcCBpZCBmb3IgYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBjb21wOiBwb2ludGVyIHRvIHRoZSB1aW50OF90LCB3aWxsIGhvbGQgY29tcCBudW1lcmljIGlkCisgKgorICogZml0X2ltYWdlX2dldF9jb21wKCkgZmluZHMgY29tcCBwcm9wZXJ0eSBpbiBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kLCBpdHMgKHN0cmluZykgdmFsdWUgaXMgdHJhbnNsYXRlZCB0byB0aGUgbnVtZXJpYworICogaWQgd2hpY2ggaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2dldF9jb21wIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICpjb21wKQoreworCWludCBsZW47CisJY29uc3Qgdm9pZCAqZGF0YTsKKworCS8qIEdldCBjb21wcmVzc2lvbiBuYW1lIGZyb20gcHJvcGVydHkgZGF0YSAqLworCWRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfQ09NUF9QUk9QLCAmbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX0NPTVBfUFJPUCwgbGVuKTsKKwkJKmNvbXAgPSAtMTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFRyYW5zbGF0ZSBjb21wcmVzc2lvbiBuYW1lIHRvIGlkICovCisJKmNvbXAgPSBnZW5pbWdfZ2V0X2NvbXBfaWQgKGRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfbG9hZCAtIGdldCBsb2FkIGFkZHJlc3MgcHJvcGVydHkgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAbG9hZDogcG9pbnRlciB0byB0aGUgdWludDMyX3QsIHdpbGwgaG9sZCBsb2FkIGFkZHJlc3MKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X2xvYWQoKSBmaW5kcyBsb2FkIGFkZHJlc3MgcHJvcGVydHkgaW4gYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCwgaXRzIHZhbHVlIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfbG9hZCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWxvbmcgKmxvYWQpCit7CisJaW50IGxlbjsKKwljb25zdCB1aW50MzJfdCAqZGF0YTsKKworCWRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfTE9BRF9QUk9QLCAmbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX0xPQURfUFJPUCwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCSpsb2FkID0gdWltYWdlX3RvX2NwdSAoKmRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfZW50cnkgLSBnZXQgZW50cnkgcG9pbnQgYWRkcmVzcyBwcm9wZXJ0eSBmb3IgYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBlbnRyeTogcG9pbnRlciB0byB0aGUgdWludDMyX3QsIHdpbGwgaG9sZCBlbnRyeSBwb2ludCBhZGRyZXNzCisgKgorICogZml0X2ltYWdlX2dldF9lbnRyeSgpIGZpbmRzIGVudHJ5IHBvaW50IGFkZHJlc3MgcHJvcGVydHkgaW4gYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCwgaXRzIHZhbHVlIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfZW50cnkgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVsb25nICplbnRyeSkKK3sKKwlpbnQgbGVuOworCWNvbnN0IHVpbnQzMl90ICpkYXRhOworCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9FTlRSWV9QUk9QLCAmbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX0VOVFJZX1BST1AsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkqZW50cnkgPSB1aW1hZ2VfdG9fY3B1ICgqZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9kYXRhIC0gZ2V0IGRhdGEgcHJvcGVydHkgYW5kIGl0cyBzaXplIGZvciBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGRhdGE6IGRvdWJsZSBwb2ludGVyIHRvIHZvaWQsIHdpbGwgaG9sZCBkYXRhIHByb3BlcnR5J3MgZGF0YSBhZGRyZXNzCisgKiBAc2l6ZTogcG9pbnRlciB0byBzaXplX3QsIHdpbGwgaG9sZCBkYXRhIHByb3BlcnR5J3MgZGF0YSBzaXplCisgKgorICogZml0X2ltYWdlX2dldF9kYXRhKCkgZmluZHMgZGF0YSBwcm9wZXJ0eSBpbiBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kIGl0cyBkYXRhIHN0YXJ0IGFkZHJlc3MgYW5kIHNpemUgYXJlIHJldHVybmVkIHRvCisgKiB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X2RhdGEgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsCisJCWNvbnN0IHZvaWQgKipkYXRhLCBzaXplX3QgKnNpemUpCit7CisJaW50IGxlbjsKKworCSpkYXRhID0gZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0RBVEFfUFJPUCwgJmxlbik7CisJaWYgKCpkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfREFUQV9QUk9QLCBsZW4pOworCQkqc2l6ZSA9IDA7CisJCXJldHVybiAtMTsKKwl9CisKKwkqc2l6ZSA9IGxlbjsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbyAtIGdldCBoYXNoIGFsZ29yaXRobSBuYW1lCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGhhc2ggbm9kZSBvZmZzZXQKKyAqIEBhbGdvOiBkb3VibGUgcG9pbnRlciB0byBjaGFyLCB3aWxsIGhvbGQgcG9pbnRlciB0byB0aGUgYWxnb3JpdGhtIG5hbWUKKyAqCisgKiBmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbygpIGZpbmRzIGhhc2ggYWxnb3JpdGhtIHByb3BlcnR5IGluIGEgZ2l2ZW4gaGFzaCBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kIGl0cyBkYXRhIHN0YXJ0IGFkZHJlc3MgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2hhc2hfZ2V0X2FsZ28gKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNoYXIgKiphbGdvKQoreworCWludCBsZW47CisKKwkqYWxnbyA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0FMR09fUFJPUCwgJmxlbik7CisJaWYgKCphbGdvID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfQUxHT19QUk9QLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2hhc2hfZ2V0X3ZhbHVlIC0gZ2V0IGhhc2ggdmFsdWUgYW5kIGxlbmd0aAorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBoYXNoIG5vZGUgb2Zmc2V0CisgKiBAdmFsdWU6IGRvdWJsZSBwb2ludGVyIHRvIHVpbnQ4X3QsIHdpbGwgaG9sZCBhZGRyZXNzIG9mIGEgaGFzaCB2YWx1ZSBkYXRhCisgKiBAdmFsdWVfbGVuOiBwb2ludGVyIHRvIGFuIGludCwgd2lsbCBob2xkIGhhc2ggZGF0YSBsZW5ndGgKKyAqCisgKiBmaXRfaW1hZ2VfaGFzaF9nZXRfdmFsdWUoKSBmaW5kcyBoYXNoIHZhbHVlIHByb3BlcnR5IGluIGEgZ2l2ZW4gaGFzaCBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kIGl0cyBkYXRhIHN0YXJ0IGFkZHJlc3MgYW5kIHNpemUgYXJlIHJldHVybmVkIHRvCisgKiB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfaGFzaF9nZXRfdmFsdWUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKip2YWx1ZSwKKwkJCQlpbnQgKnZhbHVlX2xlbikKK3sKKwlpbnQgbGVuOworCisJKnZhbHVlID0gKHVpbnQ4X3QgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfVkFMVUVfUFJPUCwgJmxlbik7CisJaWYgKCp2YWx1ZSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX1ZBTFVFX1BST1AsIGxlbik7CisJCSp2YWx1ZV9sZW4gPSAwOworCQlyZXR1cm4gLTE7CisJfQorCisJKnZhbHVlX2xlbiA9IGxlbjsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfc2V0X3RpbWVzdGFtcCAtIHNldCBub2RlIHRpbWVzdGFtcCBwcm9wZXJ0eQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBub2RlIG9mZnNldAorICogQHRpbWVzdGFtcDogdGltZXN0YW1wIHZhbHVlIHRvIGJlIHNldAorICoKKyAqIGZpdF9zZXRfdGltZXN0YW1wKCkgYXR0ZW1wdHMgdG8gc2V0IHRpbWVzdGFtcCBwcm9wZXJ0eSBpbiB0aGUgcmVxdWVzdGVkCisgKiBub2RlIGFuZCByZXR1cm5zIG9wZXJhdGlvbiBzdGF0dXMgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gcHJvcGVydHkgcmVhZCBmYWlsdXJlCisgKi8KK2ludCBmaXRfc2V0X3RpbWVzdGFtcCAodm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdGltZV90IHRpbWVzdGFtcCkKK3sKKwl1aW50MzJfdCB0OworCWludCByZXQ7CisKKwl0ID0gY3B1X3RvX3VpbWFnZSAodGltZXN0YW1wKTsKKwlyZXQgPSBmZHRfc2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfVElNRVNUQU1QX1BST1AsICZ0LAorCQkJCXNpemVvZiAodWludDMyX3QpKTsKKwlpZiAocmV0KSB7CisJCXByaW50ZiAoIkNhbid0IHNldCAnJXMnIHByb3BlcnR5IGZvciAnJXMnIG5vZGUgKCVzKVxuIiwKKwkJCUZJVF9USU1FU1RBTVBfUFJPUCwgZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJZmR0X3N0cmVycm9yIChyZXQpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGN1bGF0ZV9oYXNoIC0gY2FsY3VsYXRlIGFuZCByZXR1cm4gaGFzaCBmb3IgcHJvdmlkZWQgaW5wdXQgZGF0YQorICogQGRhdGE6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEKKyAqIEBkYXRhX2xlbjogZGF0YSBsZW5ndGgKKyAqIEBhbGdvOiByZXF1ZXN0ZWQgaGFzaCBhbGdvcml0aG0KKyAqIEB2YWx1ZTogcG9pbnRlciB0byB0aGUgY2hhciwgd2lsbCBob2xkIGhhc2ggdmFsdWUgZGF0YSAoY2FsbGVyIG11c3QKKyAqIGFsbG9jYXRlIGVub3VnaCBmcmVlIHNwYWNlKQorICogdmFsdWVfbGVuOiBsZW5ndGggb2YgdGhlIGNhbGN1bGF0ZWQgaGFzaAorICoKKyAqIGNhbGN1bGF0ZV9oYXNoKCkgY29tcHV0ZXMgaW5wdXQgZGF0YSBoYXNoIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIGFsZ29yaXRobS4KKyAqIFJlc3VsdGluZyBoYXNoIHZhbHVlIGlzIHBsYWNlZCBpbiBjYWxsZXIgcHJvdmlkZWQgJ3ZhbHVlJyBidWZmZXIsIGxlbmd0aAorICogb2YgdGhlIGNhbGN1bGF0ZWQgaGFzaCBpcyByZXR1cm5lZCB2aWEgdmFsdWVfbGVuIHBvaW50ZXIgYXJndW1lbnQuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAtMSwgd2hlbiBhbGdvIGlzIHVuc3VwcG9ydGVkCisgKi8KK3N0YXRpYyBpbnQgY2FsY3VsYXRlX2hhc2ggKGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbiwgY29uc3QgY2hhciAqYWxnbywKKwkJCXVpbnQ4X3QgKnZhbHVlLCBpbnQgKnZhbHVlX2xlbikKK3sKKwlpZiAoc3RyY21wIChhbGdvLCAiY3JjMzIiKSA9PSAwICkgeworCQkqKCh1aW50MzJfdCAqKXZhbHVlKSA9IGNyYzMyX3dkICgwLCBkYXRhLCBkYXRhX2xlbiwKKwkJCQkJCQlDSFVOS1NaX0NSQzMyKTsKKwkJKigodWludDMyX3QgKil2YWx1ZSkgPSBjcHVfdG9fdWltYWdlICgqKCh1aW50MzJfdCAqKXZhbHVlKSk7CisJCSp2YWx1ZV9sZW4gPSA0OworCX0gZWxzZSBpZiAoc3RyY21wIChhbGdvLCAic2hhMSIpID09IDAgKSB7CisJCXNoYTFfY3N1bV93ZCAoKHVuc2lnbmVkIGNoYXIgKikgZGF0YSwgZGF0YV9sZW4sCisJCQkJKHVuc2lnbmVkIGNoYXIgKikgdmFsdWUsIENIVU5LU1pfU0hBMSk7CisJCSp2YWx1ZV9sZW4gPSAyMDsKKwl9IGVsc2UgaWYgKHN0cmNtcCAoYWxnbywgIm1kNSIpID09IDAgKSB7CisJCW1kNV93ZCAoKHVuc2lnbmVkIGNoYXIgKilkYXRhLCBkYXRhX2xlbiwgdmFsdWUsIENIVU5LU1pfTUQ1KTsKKwkJKnZhbHVlX2xlbiA9IDE2OworCX0gZWxzZSB7CisJCWRlYnVnICgiVW5zdXBwb3J0ZWQgaGFzaCBhbG9ncml0aG1cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgVVNFX0hPU1RDQworLyoqCisgKiBmaXRfc2V0X2hhc2hlcyAtIHByb2Nlc3MgRklUIGNvbXBvbmVudCBpbWFnZSBub2RlcyBhbmQgY2FsY3VsYXRlIGhhc2hlcworICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqCisgKiBmaXRfc2V0X2hhc2hlcygpIGFkZHMgaGFzaCB2YWx1ZXMgZm9yIGFsbCBjb21wb25lbnQgaW1hZ2VzIGluIHRoZSBGSVQgYmxvYi4KKyAqIEhhc2hlcyBhcmUgY2FsY3VsYXRlZCBmb3IgYWxsIGNvbXBvbmVudCBpbWFnZXMgd2hpY2ggaGF2ZSBoYXNoIHN1Ym5vZGVzCisgKiB3aXRoIGFsZ29yaXRobSBwcm9wZXJ0eSBzZXQgdG8gb25lIG9mIHRoZSBzdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG1zLgorICoKKyAqIHJldHVybnMKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgbGliZmR0IGVycm9yIGNvZGUsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9zZXRfaGFzaGVzICh2b2lkICpmaXQpCit7CisJaW50IGltYWdlc19ub2Zmc2V0OworCWludCBub2Zmc2V0OworCWludCBuZGVwdGg7CisJaW50IHJldDsKKworCS8qIEZpbmQgaW1hZ2VzIHBhcmVudCBub2RlIG9mZnNldCAqLworCWltYWdlc19ub2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmaXQsIEZJVF9JTUFHRVNfUEFUSCk7CisJaWYgKGltYWdlc19ub2Zmc2V0IDwgMCkgeworCQlwcmludGYgKCJDYW4ndCBmaW5kIGltYWdlcyBwYXJlbnQgbm9kZSAnJXMnICglcylcbiIsCisJCQlGSVRfSU1BR0VTX1BBVEgsIGZkdF9zdHJlcnJvciAoaW1hZ2VzX25vZmZzZXQpKTsKKwkJcmV0dXJuIGltYWdlc19ub2Zmc2V0OworCX0KKworCS8qIFByb2Nlc3MgaXRzIHN1Ym5vZGVzLCBwcmludCBvdXQgY29tcG9uZW50IGltYWdlcyBkZXRhaWxzICovCisJZm9yIChuZGVwdGggPSAwLCBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBpbWFnZXNfbm9mZnNldCwgJm5kZXB0aCk7CisJICAgICAobm9mZnNldCA+PSAwKSAmJiAobmRlcHRoID4gMCk7CisJICAgICBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBub2Zmc2V0LCAmbmRlcHRoKSkgeworCQlpZiAobmRlcHRoID09IDEpIHsKKwkJCS8qCisJCQkgKiBEaXJlY3QgY2hpbGQgbm9kZSBvZiB0aGUgaW1hZ2VzIHBhcmVudCBub2RlLAorCQkJICogaS5lLiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKwkJCSAqLworCQkJcmV0ID0gZml0X2ltYWdlX3NldF9oYXNoZXMgKGZpdCwgbm9mZnNldCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2Vfc2V0X2hhc2hlcyAtIGNhbGN1bGF0ZS9zZXQgaGFzaGVzIGZvciBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBpbWFnZV9ub2Zmc2V0OiByZXF1ZXN0ZWQgY29tcG9uZW50IGltYWdlIG5vZGUKKyAqCisgKiBmaXRfaW1hZ2Vfc2V0X2hhc2hlcygpIGFkZHMgaGFzaCB2YWx1ZXMgZm9yIGFuIGNvbXBvbmVudCBpbWFnZSBub2RlLiBBbGwKKyAqIGV4aXN0aW5nIGhhc2ggc3Vibm9kZXMgYXJlIGNoZWNrZWQsIGlmIGFsZ29yaXRobSBwcm9wZXJ0eSBpcyBzZXQgdG8gb25lIG9mCisgKiB0aGUgc3VwcG9ydGVkIGhhc2ggYWxnb3JpdGhtcywgaGFzaCB2YWx1ZSBpcyBjb21wdXRlZCBhbmQgY29ycmVzcG9uZGluZworICogaGFzaCBub2RlIHByb3BlcnR5IGlzIHNldCwgZm9yIGV4YW1wbGU6CisgKgorICogSW5wdXQgY29tcG9uZW50IGltYWdlIG5vZGUgc3RydWN0dXJlOgorICoKKyAqIG8gaW1hZ2VAMSAoYXQgaW1hZ2Vfbm9mZnNldCkKKyAqICAgfCAtIGRhdGEgPSBbYmluYXJ5IGRhdGFdCisgKiAgIG8gaGFzaEAxCisgKiAgICAgfC0gYWxnbyA9ICJzaGExIgorICoKKyAqIE91dHB1dCBjb21wb25lbnQgaW1hZ2Ugbm9kZSBzdHJ1Y3R1cmU6CisgKgorICogbyBpbWFnZUAxIChhdCBpbWFnZV9ub2Zmc2V0KQorICogICB8IC0gZGF0YSA9IFtiaW5hcnkgZGF0YV0KKyAqICAgbyBoYXNoQDEKKyAqICAgICB8LSBhbGdvID0gInNoYTEiCisgKiAgICAgfC0gdmFsdWUgPSBzaGExKGRhdGEpCisgKgorICogcmV0dXJuczoKKyAqICAgICAwIG9uIHN1Y2VzcworICogICAgPDAgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX3NldF9oYXNoZXMgKHZvaWQgKmZpdCwgaW50IGltYWdlX25vZmZzZXQpCit7CisJY29uc3Qgdm9pZCAqZGF0YTsKKwlzaXplX3Qgc2l6ZTsKKwljaGFyICphbGdvOworCXVpbnQ4X3QgdmFsdWVbRklUX01BWF9IQVNIX0xFTl07CisJaW50IHZhbHVlX2xlbjsKKwlpbnQgbm9mZnNldDsKKwlpbnQgbmRlcHRoOworCisJLyogR2V0IGltYWdlIGRhdGEgYW5kIGRhdGEgbGVuZ3RoICovCisJaWYgKGZpdF9pbWFnZV9nZXRfZGF0YSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmZGF0YSwgJnNpemUpKSB7CisJCXByaW50ZiAoIkNhbid0IGdldCBpbWFnZSBkYXRhL3NpemVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogUHJvY2VzcyBhbGwgaGFzaCBzdWJub2RlcyBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUgKi8KKwlmb3IgKG5kZXB0aCA9IDAsIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGltYWdlX25vZmZzZXQsICZuZGVwdGgpOworCSAgICAgKG5vZmZzZXQgPj0gMCkgJiYgKG5kZXB0aCA+IDApOworCSAgICAgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgbm9mZnNldCwgJm5kZXB0aCkpIHsKKwkJaWYgKG5kZXB0aCA9PSAxKSB7CisJCQkvKiBEaXJlY3QgY2hpbGQgbm9kZSBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUgKi8KKworCQkJLyoKKwkJCSAqIENoZWNrIHN1Ym5vZGUgbmFtZSwgbXVzdCBiZSBlcXVhbCB0byAiaGFzaCIuCisJCQkgKiBNdWx0aXBsZSBoYXNoIG5vZGVzIHJlcXVpcmUgdW5pcXVlIHVuaXQgbm9kZQorCQkJICogbmFtZXMsIGUuZy4gaGFzaEAxLCBoYXNoQDIsIGV0Yy4KKwkJCSAqLworCQkJaWYgKHN0cm5jbXAgKGZpdF9nZXRfbmFtZShmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJCQkJRklUX0hBU0hfTk9ERU5BTUUsCisJCQkJCQlzdHJsZW4oRklUX0hBU0hfTk9ERU5BTUUpKSAhPSAwKSB7CisJCQkJLyogTm90IGEgaGFzaCBzdWJub2RlLCBza2lwIGl0ICovCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbyAoZml0LCBub2Zmc2V0LCAmYWxnbykpIHsKKwkJCQlwcmludGYgKCJDYW4ndCBnZXQgaGFzaCBhbGdvIHByb3BlcnR5IGZvciAiCisJCQkJCSInJXMnIGhhc2ggbm9kZSBpbiAnJXMnIGltYWdlIG5vZGVcbiIsCisJCQkJCWZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCQkJZml0X2dldF9uYW1lIChmaXQsIGltYWdlX25vZmZzZXQsIE5VTEwpKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCWlmIChjYWxjdWxhdGVfaGFzaCAoZGF0YSwgc2l6ZSwgYWxnbywgdmFsdWUsICZ2YWx1ZV9sZW4pKSB7CisJCQkJcHJpbnRmICgiVW5zdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG0gKCVzKSBmb3IgIgorCQkJCQkiJyVzJyBoYXNoIG5vZGUgaW4gJyVzJyBpbWFnZSBub2RlXG4iLAorCQkJCQlhbGdvLCBmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQkJCWZpdF9nZXRfbmFtZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCBOVUxMKSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlpZiAoZml0X2ltYWdlX2hhc2hfc2V0X3ZhbHVlIChmaXQsIG5vZmZzZXQsIHZhbHVlLAorCQkJCQkJCXZhbHVlX2xlbikpIHsKKwkJCQlwcmludGYgKCJDYW4ndCBzZXQgaGFzaCB2YWx1ZSBmb3IgIgorCQkJCQkiJyVzJyBoYXNoIG5vZGUgaW4gJyVzJyBpbWFnZSBub2RlXG4iLAorCQkJCQlmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQkJCWZpdF9nZXRfbmFtZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCBOVUxMKSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2hhc2hfc2V0X3ZhbHVlIC0gc2V0IGhhc2ggdmFsdWUgaW4gcmVxdWVzdGVkIGhhcyBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGhhc2ggbm9kZSBvZmZzZXQKKyAqIEB2YWx1ZTogaGFzaCB2YWx1ZSB0byBiZSBzZXQKKyAqIEB2YWx1ZV9sZW46IGhhc2ggdmFsdWUgbGVuZ3RoCisgKgorICogZml0X2ltYWdlX2hhc2hfc2V0X3ZhbHVlKCkgYXR0ZW1wdHMgdG8gc2V0IGhhc2ggdmFsdWUgaW4gYSBub2RlIGF0IG9mZnNldAorICogZ2l2ZW4gYW5kIHJldHVybnMgb3BlcmF0aW9uIHN0YXR1cyB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnMKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9oYXNoX3NldF92YWx1ZSAodm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqdmFsdWUsCisJCQkJaW50IHZhbHVlX2xlbikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZmR0X3NldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX1ZBTFVFX1BST1AsIHZhbHVlLCB2YWx1ZV9sZW4pOworCWlmIChyZXQpIHsKKwkJcHJpbnRmICgiQ2FuJ3Qgc2V0IGhhc2ggJyVzJyBwcm9wZXJ0eSBmb3IgJyVzJyBub2RlICglcylcbiIsCisJCQlGSVRfVkFMVUVfUFJPUCwgZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJZmR0X3N0cmVycm9yIChyZXQpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIFVTRV9IT1NUQ0MgKi8KKworLyoqCisgKiBmaXRfaW1hZ2VfY2hlY2tfaGFzaGVzIC0gdmVyaWZ5IGRhdGEgaW50ZXJnaXR5CisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQGltYWdlX25vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICoKKyAqIGZpdF9pbWFnZV9jaGVja19oYXNoZXMoKSBnb2VzIG92ZXIgY29tcG9uZW50IGltYWdlIGhhc2ggbm9kZXMsCisgKiByZS1jYWxjdWxhdGVzIGVhY2ggZGF0YSBoYXNoIGFuZCBjb21wYXJlcyB3aXRoIHRoZSB2YWx1ZSBzdG9yZWQgaW4gaGFzaAorICogbm9kZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEsIGlmIGFsbCBoYXNoZXMgYXJlIHZhbGlkCisgKiAgICAgMCwgb3RoZXJ3aXNlIChvciBvbiBlcnJvcikKKyAqLworaW50IGZpdF9pbWFnZV9jaGVja19oYXNoZXMgKGNvbnN0IHZvaWQgKmZpdCwgaW50IGltYWdlX25vZmZzZXQpCit7CisJY29uc3Qgdm9pZAkqZGF0YTsKKwlzaXplX3QJCXNpemU7CisJY2hhcgkJKmFsZ287CisJdWludDhfdAkJKmZpdF92YWx1ZTsKKwlpbnQJCWZpdF92YWx1ZV9sZW47CisJdWludDhfdAkJdmFsdWVbRklUX01BWF9IQVNIX0xFTl07CisJaW50CQl2YWx1ZV9sZW47CisJaW50CQlub2Zmc2V0OworCWludAkJbmRlcHRoOworCWNoYXIJCSplcnJfbXNnID0gIiI7CisKKwkvKiBHZXQgaW1hZ2UgZGF0YSBhbmQgZGF0YSBsZW5ndGggKi8KKwlpZiAoZml0X2ltYWdlX2dldF9kYXRhIChmaXQsIGltYWdlX25vZmZzZXQsICZkYXRhLCAmc2l6ZSkpIHsKKwkJcHJpbnRmICgiQ2FuJ3QgZ2V0IGltYWdlIGRhdGEvc2l6ZVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFByb2Nlc3MgYWxsIGhhc2ggc3Vibm9kZXMgb2YgdGhlIGNvbXBvbmVudCBpbWFnZSBub2RlICovCisJZm9yIChuZGVwdGggPSAwLCBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmbmRlcHRoKTsKKwkgICAgIChub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkgICAgIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyogRGlyZWN0IGNoaWxkIG5vZGUgb2YgdGhlIGNvbXBvbmVudCBpbWFnZSBub2RlICovCisKKwkJCS8qCisJCQkgKiBDaGVjayBzdWJub2RlIG5hbWUsIG11c3QgYmUgZXF1YWwgdG8gImhhc2giLgorCQkJICogTXVsdGlwbGUgaGFzaCBub2RlcyByZXF1aXJlIHVuaXF1ZSB1bml0IG5vZGUKKwkJCSAqIG5hbWVzLCBlLmcuIGhhc2hAMSwgaGFzaEAyLCBldGMuCisJCQkgKi8KKwkJCWlmIChzdHJuY21wIChmaXRfZ2V0X25hbWUoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCQkJRklUX0hBU0hfTk9ERU5BTUUsCisJCQkJCXN0cmxlbihGSVRfSEFTSF9OT0RFTkFNRSkpICE9IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbyAoZml0LCBub2Zmc2V0LCAmYWxnbykpIHsKKwkJCQllcnJfbXNnID0gIiBlcnJvciFcbkNhbid0IGdldCBoYXNoIGFsZ28gIgorCQkJCQkJInByb3BlcnR5IjsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJcHJpbnRmICgiJXMiLCBhbGdvKTsKKworCQkJaWYgKGZpdF9pbWFnZV9oYXNoX2dldF92YWx1ZSAoZml0LCBub2Zmc2V0LCAmZml0X3ZhbHVlLAorCQkJCQkJCSZmaXRfdmFsdWVfbGVuKSkgeworCQkJCWVycl9tc2cgPSAiIGVycm9yIVxuQ2FuJ3QgZ2V0IGhhc2ggdmFsdWUgIgorCQkJCQkJInByb3BlcnR5IjsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCisJCQlpZiAoY2FsY3VsYXRlX2hhc2ggKGRhdGEsIHNpemUsIGFsZ28sIHZhbHVlLCAmdmFsdWVfbGVuKSkgeworCQkJCWVycl9tc2cgPSAiIGVycm9yIVxuVW5zdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG0iOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisKKwkJCWlmICh2YWx1ZV9sZW4gIT0gZml0X3ZhbHVlX2xlbikgeworCQkJCWVycl9tc2cgPSAiIGVycm9yICFcbkJhZCBoYXNoIHZhbHVlIGxlbiI7CisJCQkJZ290byBlcnJvcjsKKwkJCX0gZWxzZSBpZiAobWVtY21wICh2YWx1ZSwgZml0X3ZhbHVlLCB2YWx1ZV9sZW4pICE9IDApIHsKKwkJCQllcnJfbXNnID0gIiBlcnJvciFcbkJhZCBoYXNoIHZhbHVlIjsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJcHJpbnRmICgiKyAiKTsKKwkJfQorCX0KKworCXJldHVybiAxOworCitlcnJvcjoKKwlwcmludGYgKCIlcyBmb3IgJyVzJyBoYXNoIG5vZGUgaW4gJyVzJyBpbWFnZSBub2RlXG4iLAorCQkJZXJyX21zZywgZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJZml0X2dldF9uYW1lIChmaXQsIGltYWdlX25vZmZzZXQsIE5VTEwpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfYWxsX2ltYWdlX2NoZWNrX2hhc2hlcyAtIHZlcmlmeSBkYXRhIGludGVyZ2l0eSBmb3IgYWxsIGltYWdlcworICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqCisgKiBmaXRfYWxsX2ltYWdlX2NoZWNrX2hhc2hlcygpIGdvZXMgb3ZlciBhbGwgaW1hZ2VzIGluIHRoZSBGSVQgYW5kCisgKiBmb3IgZXZlcnkgaW1hZ2VzIGNoZWNrcyBpZiBhbGwgaXQncyBoYXNoZXMgYXJlIHZhbGlkLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSwgaWYgYWxsIGhhc2hlcyBvZiBhbGwgaW1hZ2VzIGFyZSB2YWxpZAorICogICAgIDAsIG90aGVyd2lzZSAob3Igb24gZXJyb3IpCisgKi8KK2ludCBmaXRfYWxsX2ltYWdlX2NoZWNrX2hhc2hlcyAoY29uc3Qgdm9pZCAqZml0KQoreworCWludCBpbWFnZXNfbm9mZnNldDsKKwlpbnQgbm9mZnNldDsKKwlpbnQgbmRlcHRoOworCWludCBjb3VudDsKKworCS8qIEZpbmQgaW1hZ2VzIHBhcmVudCBub2RlIG9mZnNldCAqLworCWltYWdlc19ub2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmaXQsIEZJVF9JTUFHRVNfUEFUSCk7CisJaWYgKGltYWdlc19ub2Zmc2V0IDwgMCkgeworCQlwcmludGYgKCJDYW4ndCBmaW5kIGltYWdlcyBwYXJlbnQgbm9kZSAnJXMnICglcylcbiIsCisJCQlGSVRfSU1BR0VTX1BBVEgsIGZkdF9zdHJlcnJvciAoaW1hZ2VzX25vZmZzZXQpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUHJvY2VzcyBhbGwgaW1hZ2Ugc3Vibm9kZXMsIGNoZWNrIGhhc2hlcyBmb3IgZWFjaCAqLworCXByaW50ZiAoIiMjIENoZWNraW5nIGhhc2goZXMpIGZvciBGSVQgSW1hZ2UgYXQgJTA4bHggLi4uXG4iLAorCQkodWxvbmcpZml0KTsKKwlmb3IgKG5kZXB0aCA9IDAsIGNvdW50ID0gMCwKKwkJbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgaW1hZ2VzX25vZmZzZXQsICZuZGVwdGgpOworCQkobm9mZnNldCA+PSAwKSAmJiAobmRlcHRoID4gMCk7CisJCW5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyoKKwkJCSAqIERpcmVjdCBjaGlsZCBub2RlIG9mIHRoZSBpbWFnZXMgcGFyZW50IG5vZGUsCisJCQkgKiBpLmUuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorCQkJICovCisJCQlwcmludGYgKCIgICBIYXNoKGVzKSBmb3IgSW1hZ2UgJXUgKCVzKTogIiwgY291bnQrKywKKwkJCQkJZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpKTsKKworCQkJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfaGFzaGVzIChmaXQsIG5vZmZzZXQpKQorCQkJCXJldHVybiAwOworCQkJcHJpbnRmICgiXG4iKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfY2hlY2tfb3MgLSBjaGVjayB3aGV0aGVyIGltYWdlIG5vZGUgaXMgb2YgYSBnaXZlbiBvcyB0eXBlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQG9zOiByZXF1ZXN0ZWQgaW1hZ2Ugb3MKKyAqCisgKiBmaXRfaW1hZ2VfY2hlY2tfb3MoKSByZWFkcyBpbWFnZSBvcyBwcm9wZXJ0eSBhbmQgY29tcGFyZXMgaXRzIG51bWVyaWMKKyAqIGlkIHdpdGggdGhlIHJlcXVlc3RlZCBvcy4gQ29tcGFyaXNvbiByZXN1bHQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEgaWYgaW1hZ2UgaXMgb2YgZ2l2ZW4gb3MgdHlwZQorICogICAgIDAgb3RoZXJ3aXNlIChvciBvbiBlcnJvcikKKyAqLworaW50IGZpdF9pbWFnZV9jaGVja19vcyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCBvcykKK3sKKwl1aW50OF90IGltYWdlX29zOworCisJaWYgKGZpdF9pbWFnZV9nZXRfb3MgKGZpdCwgbm9mZnNldCwgJmltYWdlX29zKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChvcyA9PSBpbWFnZV9vcyk7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2NoZWNrX2FyY2ggLSBjaGVjayB3aGV0aGVyIGltYWdlIG5vZGUgaXMgb2YgYSBnaXZlbiBhcmNoCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGFyY2g6IHJlcXVlc3RlZCBpbWFnZWFyY2gKKyAqCisgKiBmaXRfaW1hZ2VfY2hlY2tfYXJjaCgpIHJlYWRzIGltYWdlIGFyY2ggcHJvcGVydHkgYW5kIGNvbXBhcmVzIGl0cyBudW1lcmljCisgKiBpZCB3aXRoIHRoZSByZXF1ZXN0ZWQgYXJjaC4gQ29tcGFyaXNvbiByZXN1bHQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEgaWYgaW1hZ2UgaXMgb2YgZ2l2ZW4gYXJjaAorICogICAgIDAgb3RoZXJ3aXNlIChvciBvbiBlcnJvcikKKyAqLworaW50IGZpdF9pbWFnZV9jaGVja19hcmNoIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IGFyY2gpCit7CisJdWludDhfdCBpbWFnZV9hcmNoOworCisJaWYgKGZpdF9pbWFnZV9nZXRfYXJjaCAoZml0LCBub2Zmc2V0LCAmaW1hZ2VfYXJjaCkpCisJCXJldHVybiAwOworCXJldHVybiAoYXJjaCA9PSBpbWFnZV9hcmNoKTsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfY2hlY2tfdHlwZSAtIGNoZWNrIHdoZXRoZXIgaW1hZ2Ugbm9kZSBpcyBvZiBhIGdpdmVuIHR5cGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAdHlwZTogcmVxdWVzdGVkIGltYWdlIHR5cGUKKyAqCisgKiBmaXRfaW1hZ2VfY2hlY2tfdHlwZSgpIHJlYWRzIGltYWdlIHR5cGUgcHJvcGVydHkgYW5kIGNvbXBhcmVzIGl0cyBudW1lcmljCisgKiBpZCB3aXRoIHRoZSByZXF1ZXN0ZWQgdHlwZS4gQ29tcGFyaXNvbiByZXN1bHQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEgaWYgaW1hZ2UgaXMgb2YgZ2l2ZW4gdHlwZQorICogICAgIDAgb3RoZXJ3aXNlIChvciBvbiBlcnJvcikKKyAqLworaW50IGZpdF9pbWFnZV9jaGVja190eXBlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IHR5cGUpCit7CisJdWludDhfdCBpbWFnZV90eXBlOworCisJaWYgKGZpdF9pbWFnZV9nZXRfdHlwZSAoZml0LCBub2Zmc2V0LCAmaW1hZ2VfdHlwZSkpCisJCXJldHVybiAwOworCXJldHVybiAodHlwZSA9PSBpbWFnZV90eXBlKTsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfY2hlY2tfY29tcCAtIGNoZWNrIHdoZXRoZXIgaW1hZ2Ugbm9kZSB1c2VzIGdpdmVuIGNvbXByZXNzaW9uCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGNvbXA6IHJlcXVlc3RlZCBpbWFnZSBjb21wcmVzc2lvbiB0eXBlCisgKgorICogZml0X2ltYWdlX2NoZWNrX2NvbXAoKSByZWFkcyBpbWFnZSBjb21wcmVzc2lvbiBwcm9wZXJ0eSBhbmQgY29tcGFyZXMgaXRzCisgKiBudW1lcmljIGlkIHdpdGggdGhlIHJlcXVlc3RlZCBjb21wcmVzc2lvbiB0eXBlLiBDb21wYXJpc29uIHJlc3VsdCBpcworICogcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEgaWYgaW1hZ2UgdXNlcyByZXF1ZXN0ZWQgY29tcHJlc3Npb24KKyAqICAgICAwIG90aGVyd2lzZSAob3Igb24gZXJyb3IpCisgKi8KK2ludCBmaXRfaW1hZ2VfY2hlY2tfY29tcCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCBjb21wKQoreworCXVpbnQ4X3QgaW1hZ2VfY29tcDsKKworCWlmIChmaXRfaW1hZ2VfZ2V0X2NvbXAgKGZpdCwgbm9mZnNldCwgJmltYWdlX2NvbXApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKGNvbXAgPT0gaW1hZ2VfY29tcCk7Cit9CisKKy8qKgorICogZml0X2NoZWNrX2Zvcm1hdCAtIHNhbml0eSBjaGVjayBGSVQgaW1hZ2UgZm9ybWF0CisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICoKKyAqIGZpdF9jaGVja19mb3JtYXQoKSBydW5zIGEgYmFzaWMgc2FuaXR5IEZJVCBpbWFnZSB2ZXJpZmljYXRpb24uCisgKiBSb3V0aW5lIGNoZWNrcyBmb3IgbWFuZGF0b3J5IHByb3BlcnRpZXMsIG5vZGVzLCBldGMuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxLCBvbiBzdWNjZXNzCisgKiAgICAgMCwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2NoZWNrX2Zvcm1hdCAoY29uc3Qgdm9pZCAqZml0KQoreworCS8qIG1hbmRhdG9yeSAvIG5vZGUgJ2Rlc2NyaXB0aW9uJyBwcm9wZXJ0eSAqLworCWlmIChmZHRfZ2V0cHJvcCAoZml0LCAwLCBGSVRfREVTQ19QUk9QLCBOVUxMKSA9PSBOVUxMKSB7CisJCWRlYnVnICgiV3JvbmcgRklUIGZvcm1hdDogbm8gZGVzY3JpcHRpb25cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCisJLyogbWFuZGF0b3J5IC8gbm9kZSAndGltZXN0YW1wJyBwcm9wZXJ0eSAqLworCWlmIChmZHRfZ2V0cHJvcCAoZml0LCAwLCBGSVRfVElNRVNUQU1QX1BST1AsIE5VTEwpID09IE5VTEwpIHsKKwkJZGVidWcgKCJXcm9uZyBGSVQgZm9ybWF0OiBubyB0aW1lc3RhbXBcbiIpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCS8qIG1hbmRhdG9yeSBzdWJpbWFnZXMgcGFyZW50ICcvaW1hZ2VzJyBub2RlICovCisJaWYgKGZkdF9wYXRoX29mZnNldCAoZml0LCBGSVRfSU1BR0VTX1BBVEgpIDwgMCkgeworCQlkZWJ1ZyAoIldyb25nIEZJVCBmb3JtYXQ6IG5vIGltYWdlcyBwYXJlbnQgbm9kZVxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKioKKyAqIGZpdF9jb25mX2dldF9ub2RlIC0gZ2V0IG5vZGUgb2Zmc2V0IGZvciBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdW5pdCBuYW1lCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQGNvbmZfdW5hbWU6IGNvbmZpZ3VyYXRpb24gbm9kZSB1bml0IG5hbWUKKyAqCisgKiBmaXRfY29uZl9nZXRfbm9kZSgpIGZpbmRzIGEgY29uZmlndXJhdGlvbiAod2l0aGluZyB0aGUgJy9jb25maWd1cmF0aW9ucycKKyAqIHBhcmFudCBub2RlKSBvZiBhIHByb3ZpZGVkIHVuaXQgbmFtZS4gSWYgY29uZmlndXJhdGlvbiBpcyBmb3VuZCBpdHMgbm9kZSBvZmZzZXQKKyAqIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogV2hlbiBOVUxMIGlzIHByb3ZpZGVkIGluIHNlY29uZCBhcmd1bWVudCBmaXRfY29uZl9nZXRfbm9kZSgpIHdpbGwgc2VhcmNoCisgKiBmb3IgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbm9kZSBpbnN0ZWFkLiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gbm9kZSB1bml0IG5hbWUKKyAqIGlzIHJldHJpdmVkIGZyb20gRklUX0RFRkFVTFRfUFJPUCBwcm9wZXJ0eSBvZiB0aGUgJy9jb25maWd1cmF0aW9ucycgbm9kZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGNvbmZpZ3VyYXRpb24gbm9kZSBvZmZzZXQgd2hlbiBmb3VuZCAoPj0wKQorICogICAgIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlIChGRFRfRVJSXyogY29kZSkKKyAqLworaW50IGZpdF9jb25mX2dldF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGNvbnN0IGNoYXIgKmNvbmZfdW5hbWUpCit7CisJaW50IG5vZmZzZXQsIGNvbmZzX25vZmZzZXQ7CisJaW50IGxlbjsKKworCWNvbmZzX25vZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZpdCwgRklUX0NPTkZTX1BBVEgpOworCWlmIChjb25mc19ub2Zmc2V0IDwgMCkgeworCQlkZWJ1ZyAoIkNhbid0IGZpbmQgY29uZmlndXJhdGlvbnMgcGFyZW50IG5vZGUgJyVzJyAoJXMpXG4iLAorCQkJRklUX0NPTkZTX1BBVEgsIGZkdF9zdHJlcnJvciAoY29uZnNfbm9mZnNldCkpOworCQlyZXR1cm4gY29uZnNfbm9mZnNldDsKKwl9CisKKwlpZiAoY29uZl91bmFtZSA9PSBOVUxMKSB7CisJCS8qIGdldCBjb25maWd1cmF0aW9uIHVuaXQgbmFtZSBmcm9tIHRoZSBkZWZhdWx0IHByb3BlcnR5ICovCisJCWRlYnVnICgiTm8gY29uZmlndXJhdGlvbiBzcGVjaWZpZWQsIHRyeWluZyBkZWZhdWx0Li4uXG4iKTsKKwkJY29uZl91bmFtZSA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgY29uZnNfbm9mZnNldCwgRklUX0RFRkFVTFRfUFJPUCwgJmxlbik7CisJCWlmIChjb25mX3VuYW1lID09IE5VTEwpIHsKKwkJCWZpdF9nZXRfZGVidWcgKGZpdCwgY29uZnNfbm9mZnNldCwgRklUX0RFRkFVTFRfUFJPUCwgbGVuKTsKKwkJCXJldHVybiBsZW47CisJCX0KKwkJZGVidWcgKCJGb3VuZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb246ICclcydcbiIsIGNvbmZfdW5hbWUpOworCX0KKworCW5vZmZzZXQgPSBmZHRfc3Vibm9kZV9vZmZzZXQgKGZpdCwgY29uZnNfbm9mZnNldCwgY29uZl91bmFtZSk7CisJaWYgKG5vZmZzZXQgPCAwKSB7CisJCWRlYnVnICgiQ2FuJ3QgZ2V0IG5vZGUgb2Zmc2V0IGZvciBjb25maWd1cmF0aW9uIHVuaXQgbmFtZTogJyVzJyAoJXMpXG4iLAorCQkJY29uZl91bmFtZSwgZmR0X3N0cmVycm9yIChub2Zmc2V0KSk7CisJfQorCisJcmV0dXJuIG5vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19maXRfY29uZl9nZXRfcHJvcF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LAorCQljb25zdCBjaGFyICpwcm9wX25hbWUpCit7CisJY2hhciAqdW5hbWU7CisJaW50IGxlbjsKKworCS8qIGdldCBrZXJuZWwgaW1hZ2UgdW5pdCBuYW1lIGZyb20gY29uZmlndXJhdGlvbiBrZXJuZWwgcHJvcGVydHkgKi8KKwl1bmFtZSA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgcHJvcF9uYW1lLCAmbGVuKTsKKwlpZiAodW5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIGxlbjsKKworCXJldHVybiBmaXRfaW1hZ2VfZ2V0X25vZGUgKGZpdCwgdW5hbWUpOworfQorCisvKioKKyAqIGZpdF9jb25mX2dldF9rZXJuZWxfbm9kZSAtIGdldCBrZXJuZWwgaW1hZ2Ugbm9kZSBvZmZzZXQgdGhhdCBjb3JyZXNwb25kcyB0bworICogYSBnaXZlbiBjb25maWd1cmF0aW9uCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbmZpZ3VyYXRpb24gbm9kZSBvZmZzZXQKKyAqCisgKiBmaXRfY29uZl9nZXRfa2VybmVsX25vZGUoKSByZXRyaXZlcyBrZXJuZWwgaW1hZ2Ugbm9kZSB1bml0IG5hbWUgZnJvbQorICogY29uZmlndXJhdGlvbiBGSVRfS0VSTkVMX1BST1AgcHJvcGVydHkgYW5kIHRyYW5zbGF0ZXMgaXQgdG8gdGhlIG5vZGUKKyAqIG9mZnNldC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGltYWdlIG5vZGUgb2Zmc2V0IHdoZW4gZm91bmQgKD49MCkKKyAqICAgICBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZSAoRkRUX0VSUl8qIGNvZGUpCisgKi8KK2ludCBmaXRfY29uZl9nZXRfa2VybmVsX25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQpCit7CisJcmV0dXJuIF9fZml0X2NvbmZfZ2V0X3Byb3Bfbm9kZSAoZml0LCBub2Zmc2V0LCBGSVRfS0VSTkVMX1BST1ApOworfQorCisvKioKKyAqIGZpdF9jb25mX2dldF9yYW1kaXNrX25vZGUgLSBnZXQgcmFtZGlzayBpbWFnZSBub2RlIG9mZnNldCB0aGF0IGNvcnJlc3BvbmRzIHRvCisgKiBhIGdpdmVuIGNvbmZpZ3VyYXRpb24KKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29uZmlndXJhdGlvbiBub2RlIG9mZnNldAorICoKKyAqIGZpdF9jb25mX2dldF9yYW1kaXNrX25vZGUoKSByZXRyaXZlcyByYW1kaXNrIGltYWdlIG5vZGUgdW5pdCBuYW1lIGZyb20KKyAqIGNvbmZpZ3VyYXRpb24gRklUX0tFUk5FTF9QUk9QIHByb3BlcnR5IGFuZCB0cmFuc2xhdGVzIGl0IHRvIHRoZSBub2RlCisgKiBvZmZzZXQuCisgKgorICogcmV0dXJuczoKKyAqICAgICBpbWFnZSBub2RlIG9mZnNldCB3aGVuIGZvdW5kICg+PTApCisgKiAgICAgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUgKEZEVF9FUlJfKiBjb2RlKQorICovCitpbnQgZml0X2NvbmZfZ2V0X3JhbWRpc2tfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCkKK3sKKwlyZXR1cm4gX19maXRfY29uZl9nZXRfcHJvcF9ub2RlIChmaXQsIG5vZmZzZXQsIEZJVF9SQU1ESVNLX1BST1ApOworfQorCisvKioKKyAqIGZpdF9jb25mX2dldF9mZHRfbm9kZSAtIGdldCBmZHQgaW1hZ2Ugbm9kZSBvZmZzZXQgdGhhdCBjb3JyZXNwb25kcyB0bworICogYSBnaXZlbiBjb25maWd1cmF0aW9uCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbmZpZ3VyYXRpb24gbm9kZSBvZmZzZXQKKyAqCisgKiBmaXRfY29uZl9nZXRfZmR0X25vZGUoKSByZXRyaXZlcyBmZHQgaW1hZ2Ugbm9kZSB1bml0IG5hbWUgZnJvbQorICogY29uZmlndXJhdGlvbiBGSVRfS0VSTkVMX1BST1AgcHJvcGVydHkgYW5kIHRyYW5zbGF0ZXMgaXQgdG8gdGhlIG5vZGUKKyAqIG9mZnNldC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGltYWdlIG5vZGUgb2Zmc2V0IHdoZW4gZm91bmQgKD49MCkKKyAqICAgICBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZSAoRkRUX0VSUl8qIGNvZGUpCisgKi8KK2ludCBmaXRfY29uZl9nZXRfZmR0X25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQpCit7CisJcmV0dXJuIF9fZml0X2NvbmZfZ2V0X3Byb3Bfbm9kZSAoZml0LCBub2Zmc2V0LCBGSVRfRkRUX1BST1ApOworfQorCisvKioKKyAqIGZpdF9jb25mX3ByaW50IC0gcHJpbnRzIG91dCB0aGUgRklUIGNvbmZpZ3VyYXRpb24gZGV0YWlscworICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBvZmZzZXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gbm9kZQorICogQHA6IHBvaW50ZXIgdG8gcHJlZml4IHN0cmluZworICoKKyAqIGZpdF9jb25mX3ByaW50KCkgbGlzdHMgYWxsIG1hbmRhdG9yeSBwcm9wZXJpZXMgZm9yIHRoZSBwcm9jZXNzZWQKKyAqIGNvbmZpZ3VyYXRpb24gbm9kZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIG5vIHJldHVybmVkIHJlc3VsdHMKKyAqLwordm9pZCBmaXRfY29uZl9wcmludCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY29uc3QgY2hhciAqcCkKK3sKKwljaGFyICpkZXNjOworCWNoYXIgKnVuYW1lOworCWludCByZXQ7CisKKwkvKiBNYW5kYXRvcnkgcHJvcGVydGllcyAqLworCXJldCA9IGZpdF9nZXRfZGVzYyAoZml0LCBub2Zmc2V0LCAmZGVzYyk7CisJcHJpbnRmICgiJXMgIERlc2NyaXB0aW9uOiAgIiwgcCk7CisJaWYgKHJldCkKKwkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCWVsc2UKKwkJcHJpbnRmICgiJXNcbiIsIGRlc2MpOworCisJdW5hbWUgPSAoY2hhciAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9LRVJORUxfUFJPUCwgTlVMTCk7CisJcHJpbnRmICgiJXMgIEtlcm5lbDogICAgICAgIiwgcCk7CisJaWYgKHVuYW1lID09IE5VTEwpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCXByaW50ZiAoIiVzXG4iLCB1bmFtZSk7CisKKwkvKiBPcHRpb25hbCBwcm9wZXJ0aWVzICovCisJdW5hbWUgPSAoY2hhciAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9SQU1ESVNLX1BST1AsIE5VTEwpOworCWlmICh1bmFtZSkKKwkJcHJpbnRmICgiJXMgIEluaXQgUmFtZGlzazogJXNcbiIsIHAsIHVuYW1lKTsKKworCXVuYW1lID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfRkRUX1BST1AsIE5VTEwpOworCWlmICh1bmFtZSkKKwkJcHJpbnRmICgiJXMgIEZEVDogICAgICAgICAgJXNcbiIsIHAsIHVuYW1lKTsKK30KKworLyoqCisgKiBmaXRfY2hlY2tfcmFtZGlzayAtIHZlcmlmeSBGSVQgZm9ybWF0IHJhbWRpc2sgc3ViaW1hZ2UKKyAqIEBmaXRfaGRyOiBwb2ludGVyIHRvIHRoZSBGSVQgcmFtZGlzayBoZWFkZXIKKyAqIEByZF9ub2Zmc2V0OiByYW1kaXNrIHN1YmltYWdlIG5vZGUgb2Zmc2V0IHdpdGhpbiBGSVQgaW1hZ2UKKyAqIEBhcmNoOiByZXF1ZXN0ZWQgcmFtZGlzayBpbWFnZSBhcmNoaXRlY3R1cmUgdHlwZQorICogQHZlcmlmeTogZGF0YSBDUkMgdmVyaWZpY2F0aW9uIGZsYWcKKyAqCisgKiBmaXRfY2hlY2tfcmFtZGlzaygpIHZlcmlmaWVzIGludGVncml0eSBvZiB0aGUgcmFtZGlzayBzdWJpbWFnZSBhbmQgZnJvbQorICogc3BlY2lmaWVkIEZJVCBpbWFnZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEsIG9uIHN1Y2Nlc3MKKyAqICAgICAwLCBvbiBmYWlsdXJlCisgKi8KKyNpZm5kZWYgVVNFX0hPU1RDQworc3RhdGljIGludCBmaXRfY2hlY2tfcmFtZGlzayAoY29uc3Qgdm9pZCAqZml0LCBpbnQgcmRfbm9mZnNldCwgdWludDhfdCBhcmNoLCBpbnQgdmVyaWZ5KQoreworCWZpdF9pbWFnZV9wcmludCAoZml0LCByZF9ub2Zmc2V0LCAiICAgIik7CisKKwlpZiAodmVyaWZ5KSB7CisJCXB1dHMgKCIgICBWZXJpZnlpbmcgSGFzaCBJbnRlZ3JpdHkgLi4uICIpOworCQlpZiAoIWZpdF9pbWFnZV9jaGVja19oYXNoZXMgKGZpdCwgcmRfbm9mZnNldCkpIHsKKwkJCXB1dHMgKCJCYWQgRGF0YSBIYXNoXG4iKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTEyNSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwdXRzICgiT0tcbiIpOworCX0KKworCXNob3dfYm9vdF9wcm9ncmVzcyAoMTI2KTsKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19vcyAoZml0LCByZF9ub2Zmc2V0LCBJSF9PU19MSU5VWCkgfHwKKwkgICAgIWZpdF9pbWFnZV9jaGVja19hcmNoIChmaXQsIHJkX25vZmZzZXQsIGFyY2gpIHx8CisJICAgICFmaXRfaW1hZ2VfY2hlY2tfdHlwZSAoZml0LCByZF9ub2Zmc2V0LCBJSF9UWVBFX1JBTURJU0spKSB7CisJCXByaW50ZiAoIk5vIExpbnV4ICVzIFJhbWRpc2sgSW1hZ2VcbiIsCisJCQkJZ2VuaW1nX2dldF9hcmNoX25hbWUoYXJjaCkpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMjYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDEyNyk7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogVVNFX0hPU1RDQyAqLworI2VuZGlmIC8qIENPTkZJR19GSVQgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NvbW1vbi9tYWluLmMgYi94LWxvYWRlci9jb21tb24vbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTc4OGUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jb21tb24vbWFpbi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogQWRkIHRvIHJlYWRsaW5lIGNtZGxpbmUtZWRpdGluZyBieQorICogKEMpIENvcHlyaWdodCAyMDA1CisgKiBKaW5IdWEgTHVvLCBHdWFuZ0RvbmcgTGludXggQ2VudGVyLCA8bHVvLmppbmh1YUBnZC1saW51eC5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogI2RlZmluZQlERUJVRwkqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisvKgorICogQm9hcmQtc3BlY2lmaWMgUGxhdGZvcm0gY29kZSBjYW4gcmVpbXBsZW1lbnQgc2hvd19ib290X3Byb2dyZXNzICgpIGlmIG5lZWRlZAorICovCit2b2lkIGlubGluZSBfX3Nob3dfYm9vdF9wcm9ncmVzcyAoaW50IHZhbCkge30KK3ZvaWQgc2hvd19ib290X3Byb2dyZXNzIChpbnQgdmFsKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19zaG93X2Jvb3RfcHJvZ3Jlc3MiKSkpOwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY29uZmlnLm1rIGIveC1sb2FkZXIvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODBjNjEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jb25maWcubWsKQEAgLTAsMCArMSwyNTQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZm5lcSAoJChPQkpUUkVFKSwkKFNSQ1RSRUUpKQoraWZlcSAoJChDVVJESVIpLCQoU1JDVFJFRSkpCitkaXIgOj0KK2Vsc2UKK2RpciA6PSAkKHN1YnN0ICQoU1JDVFJFRSkvLCwkKENVUkRJUikpCitlbmRpZgorCitvYmogOj0gJChpZiAkKGRpciksJChPQkpUUkVFKS8kKGRpcikvLCQoT0JKVFJFRSkvKQorc3JjIDo9ICQoaWYgJChkaXIpLCQoU1JDVFJFRSkvJChkaXIpLywkKFNSQ1RSRUUpLykKKworJChzaGVsbCBta2RpciAtcCAkKG9iaikpCitlbHNlCitvYmogOj0KK3NyYyA6PQorZW5kaWYKKworIyBjbGVhbiB0aGUgc2xhdGUgLi4uCitQTEFURk9STV9SRUxGTEFHUyA9CitQTEFURk9STV9DUFBGTEFHUyA9CitQTEFURk9STV9MREZMQUdTID0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitIT1NUQ0ZMQUdTCT0gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgXAorCQkgICQoSE9TVENQUEZMQUdTKQorSE9TVFNUUklQCT0gc3RyaXAKKworIworIyBNYWMgT1MgWCAvIERhcndpbidzIEMgcHJlcHJvY2Vzc29yIGlzIEFwcGxlIHNwZWNpZmljLiAgSXQKKyMgZ2VuZXJhdGVzIG51bWVyb3VzIGVycm9ycyBhbmQgd2FybmluZ3MuICBXZSB3YW50IHRvIGJ5cGFzcyBpdAorIyBhbmQgdXNlIEdOVSBDJ3MgY3BwLiAgVG8gZG8gdGhpcyB3ZSBwYXNzIHRoZSAtdHJhZGl0aW9uYWwtY3BwCisjIG9wdGlvbiB0byB0aGUgY29tcGlsZXIuICBOb3RlIHRoYXQgdGhlIC10cmFkaXRpb25hbC1jcHAgZmxhZworIyBET0VTIE5PVCBoYXZlIHRoZSBzYW1lIHNlbWFudGljcyBhcyBHTlUgQydzIGZsYWcsIGFsbCBpdCBkb2VzCisjIGlzIGludm9rZSB0aGUgR05VIHByZXByb2Nlc3NvciBpbiBzdG9jayBBTlNJL0lTTyBDIGZhc2hpb24uCisjCisjIEFwcGxlJ3MgbGlua2VyIGlzIHNpbWlsYXIsIHRoYW5rcyB0byB0aGUgbmV3IDIgc3RhZ2UgbGlua2luZworIyBtdWx0aXBsZSBzeW1ib2wgZGVmaW5pdGlvbnMgYXJlIHRyZWF0ZWQgYXMgZXJyb3JzLCBoZW5jZSB0aGUKKyMgLW11bHRpcGx5X2RlZmluZWQgc3VwcHJlc3Mgb3B0aW9uIHRvIHR1cm4gb2ZmIHRoaXMgZXJyb3IuCisjCisKK2lmZXEgKCQoSE9TVE9TKSxkYXJ3aW4pCisjIGdldCBtYWpvciBhbmQgbWlub3IgcHJvZHVjdCB2ZXJzaW9uIChlLmcuICcxMCcgYW5kICc2JyBmb3IgU25vdyBMZW9wYXJkKQorREFSV0lOX01BSk9SX1ZFUlNJT04JPSAkKHNoZWxsIHN3X3ZlcnMgLXByb2R1Y3RWZXJzaW9uIHwgY3V0IC1mIDEgLWQgJy4nKQorREFSV0lOX01JTk9SX1ZFUlNJT04JPSAkKHNoZWxsIHN3X3ZlcnMgLXByb2R1Y3RWZXJzaW9uIHwgY3V0IC1mIDIgLWQgJy4nKQorCitvc194X2JlZm9yZQk9ICQoc2hlbGwgaWYgWyAkKERBUldJTl9NQUpPUl9WRVJTSU9OKSAtbGUgJCgxKSAtYSBcCisJJChEQVJXSU5fTUlOT1JfVkVSU0lPTikgLWxlICQoMikgXSA7IHRoZW4gZWNobyAiJCgzKSI7IGVsc2UgZWNobyAiJCg0KSI7IGZpIDspCisKKyMgU25vdyBMZW9wYXJkcyBidWlsZCBlbnZpcm9ubWVudCBoYXMgbm8gbG9uZ2VyIHJlc3RyaWN0aW9ucyBhcyBkZXNjcmliZWQgYWJvdmUKK0hPU1RDQwkJID0gJChjYWxsIG9zX3hfYmVmb3JlLCAxMCwgNSwgImNjIiwgImdjYyIpCitIT1NUQ0ZMQUdTCSs9ICQoY2FsbCBvc194X2JlZm9yZSwgMTAsIDQsICItdHJhZGl0aW9uYWwtY3BwIikKK0hPU1RMREZMQUdTCSs9ICQoY2FsbCBvc194X2JlZm9yZSwgMTAsIDUsICItbXVsdGlwbHlfZGVmaW5lZCBzdXBwcmVzcyIpCitlbHNlCitIT1NUQ0MJCT0gZ2NjCitlbmRpZgorCitpZmVxICgkKEhPU1RPUyksY3lnd2luKQorSE9TVENGTEFHUwkrPSAtYW5zaQorZW5kaWYKKworIyBXZSBidWlsZCBzb21lIGZpbGVzIHdpdGggZXh0cmEgcGVkYW50aWMgZmxhZ3MgdG8gdHJ5IHRvIG1pbmltaXplIHRoaW5ncworIyB0aGF0IHdvbid0IGJ1aWxkIG9uIHNvbWUgd2VpcmQgaG9zdCBjb21waWxlciAtLSB0aG91Z2ggdGhlcmUgYXJlIGxvdHMgb2YKKyMgZXhjZXB0aW9ucyBmb3IgZmlsZXMgdGhhdCBhcmVuJ3QgY29tcGxhaW50LgorCitIT1NUQ0ZMQUdTX05PUEVEID0gJChmaWx0ZXItb3V0IC1wZWRhbnRpYywkKEhPU1RDRkxBR1MpKQorSE9TVENGTEFHUwkrPSAtcGVkYW50aWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBPcHRpb24gY2hlY2tlciAoY291cnRlc3kgbGludXgga2VybmVsKSB0byBlbnN1cmUKKyMgb25seSBzdXBwb3J0ZWQgY29tcGlsZXIgb3B0aW9ucyBhcmUgdXNlZAorIworY2Mtb3B0aW9uID0gJChzaGVsbCBpZiAkKENDKSAkKENGTEFHUykgJCgxKSAtUyAtbyAvZGV2L251bGwgLXhjIC9kZXYvbnVsbCBcCisJCT4gL2Rldi9udWxsIDI+JjE7IHRoZW4gZWNobyAiJCgxKSI7IGVsc2UgZWNobyAiJCgyKSI7IGZpIDspCisKKyMKKyMgSW5jbHVkZSB0aGUgbWFrZSB2YXJpYWJsZXMgKENDLCBldGMuLi4pCisjCitBUwk9ICQoQ1JPU1NfQ09NUElMRSlhcworTEQJPSAkKENST1NTX0NPTVBJTEUpbGQKK0NDCT0gJChDUk9TU19DT01QSUxFKWdjYworQ1BQCT0gJChDQykgLUUKK0FSCT0gJChDUk9TU19DT01QSUxFKWFyCitOTQk9ICQoQ1JPU1NfQ09NUElMRSlubQorU1RSSVAJPSAkKENST1NTX0NPTVBJTEUpc3RyaXAKK09CSkNPUFkgPSAkKENST1NTX0NPTVBJTEUpb2JqY29weQorT0JKRFVNUCA9ICQoQ1JPU1NfQ09NUElMRSlvYmpkdW1wCitSQU5MSUIJPSAkKENST1NTX0NPTVBJTEUpUkFOTElCCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBMb2FkIGdlbmVyYXRlZCBib2FyZCBjb25maWd1cmF0aW9uCitzaW5jbHVkZSAkKE9CSlRSRUUpL2luY2x1ZGUvYXV0b2NvbmYubWsKKworIyBTb21lIGFyY2hpdGVjdHVyZSBjb25maWcubWsgZmlsZXMgbmVlZCB0byBrbm93IHdoYXQgQ1BVRElSIGlzIHNldCB0bywKKyMgc28gY2FsY3VsYXRlIENQVURJUiBiZWZvcmUgaW5jbHVkaW5nIEFSQ0gvU09DL0NQVSBjb25maWcubWsgZmlsZXMuCisjIENoZWNrIGlmIGFyY2gvJEFSQ0gvY3B1LyRDUFUgZXhpc3RzLCBvdGhlcndpc2UgYXNzdW1lIGFyY2gvJEFSQ0gvY3B1IGNvbnRhaW5zCisjIENQVS1zcGVjaWZpYyBjb2RlLgorQ1BVRElSPWNwdS8kKENQVSkKK2lmbmVxICgkKFNSQ1RSRUUpLyQoQ1BVRElSKSwkKHdpbGRjYXJkICQoU1JDVFJFRSkvJChDUFVESVIpKSkKK0NQVURJUj1jcHUKK2VuZGlmCisKK3NpbmNsdWRlICQoVE9QRElSKS8kKEFSQ0gpX2NvbmZpZy5tawkJIyBpbmNsdWRlIGFyY2hpdGVjdHVyZSBkZXBlbmRlbmQgcnVsZXMKK3NpbmNsdWRlICQoVE9QRElSKS8kKENQVURJUikvY29uZmlnLm1rCQkjIGluY2x1ZGUgIENQVQlzcGVjaWZpYyBydWxlcworCitpZmRlZglTT0MKK3NpbmNsdWRlICQoVE9QRElSKS8kKENQVURJUikvJChTT0MpL2NvbmZpZy5tawkjIGluY2x1ZGUgIFNvQwlzcGVjaWZpYyBydWxlcworZW5kaWYKK2lmZGVmCVZFTkRPUgorQk9BUkRESVIgPSAkKFZFTkRPUikvJChCT0FSRCkKK2Vsc2UKK0JPQVJERElSID0gJChCT0FSRCkKK2VuZGlmCitpZmRlZglCT0FSRAorc2luY2x1ZGUgJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpL2NvbmZpZy5tawkjIGluY2x1ZGUgYm9hcmQgc3BlY2lmaWMgcnVsZXMKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWZuZXEgKCwkKGZpbmRzdHJpbmcgcywkKE1BS0VGTEFHUykpKQorQVJGTEFHUyA9IGNyCitlbHNlCitBUkZMQUdTID0gY3J2CitlbmRpZgorUkVMRkxBR1M9ICQoUExBVEZPUk1fUkVMRkxBR1MpCitEQkdGTEFHUz0gLWcgIyAtRERFQlVHCitPUFRGTEFHUz0gLU9zICMtZm9taXQtZnJhbWUtcG9pbnRlcgoraWZuZGVmIExEU0NSSVBUCisjTERTQ1JJUFQgOj0gJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpL3gtbG9hZC5sZHMuZGVidWcKK0xEU0NSSVBUIDo9ICQoVE9QRElSKS9ib2FyZC8kKEJPQVJERElSKS94LWxvYWQubGRzCitlbmRpZgorT0JKQ0ZMQUdTICs9IC0tZ2FwLWZpbGw9MHhmZgorCitnY2NpbmNkaXIgOj0gJChzaGVsbCAkKENDKSAtcHJpbnQtZmlsZS1uYW1lPWluY2x1ZGUpCisKK0NQUEZMQUdTIDo9ICQoREJHRkxBR1MpICQoT1BURkxBR1MpICQoUkVMRkxBR1MpCQlcCisJLURfX0tFUk5FTF9fCitpZm5lcSAoJChURVhUX0JBU0UpLCkKK0NQUEZMQUdTICs9IC1EVEVYVF9CQVNFPSQoVEVYVF9CQVNFKQorZW5kaWYKKworaWZuZXEgKCQoU1RBQ0tfQkFTRSksKQorQ1BQRkxBR1MgKz0gLURTVEFDS19CQVNFPSQoU1RBQ0tfQkFTRSkKK2VuZGlmCisKK2lmbmVxICgkKFJFU0VUX1ZFQ1RPUl9BRERSRVNTKSwpCitDUFBGTEFHUyArPSAtRFJFU0VUX1ZFQ1RPUl9BRERSRVNTPSQoUkVTRVRfVkVDVE9SX0FERFJFU1MpCitlbmRpZgorCitpZm5lcSAoJChPQkpUUkVFKSwkKFNSQ1RSRUUpKQorQ1BQRkxBR1MgKz0gLUkkKE9CSlRSRUUpL2luY2x1ZGUyIC1JJChPQkpUUkVFKS9pbmNsdWRlCitlbmRpZgorCitDUFBGTEFHUyArPSAtSSQoVE9QRElSKS9pbmNsdWRlCitDUFBGTEFHUyArPSAtZm5vLWJ1aWx0aW4gLWZmcmVlc3RhbmRpbmcgLW5vc3RkaW5jCVwKKwktaXN5c3RlbSAkKGdjY2luY2RpcikgLXBpcGUgJChQTEFURk9STV9DUFBGTEFHUykKKworaWZkZWYgQlVJTERfVEFHCitDRkxBR1MgOj0gJChDUFBGTEFHUykgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyBcCisJLURCVUlMRF9UQUc9JyIkKEJVSUxEX1RBRykiJworZWxzZQorQ0ZMQUdTIDo9ICQoQ1BQRkxBR1MpIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMKK2VuZGlmCisKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tc3RhY2stcHJvdGVjdG9yKQorCisjICQoQ1BQRkxBR1MpIHNldHMgLWcsIHdoaWNoIGNhdXNlcyBnY2MgdG8gcGFzcyBhIHN1aXRhYmxlIC1nPGZvcm1hdD4KKyMgb3B0aW9uIHRvIHRoZSBhc3NlbWJsZXIuCitBRkxBR1NfREVCVUcgOj0KKworQUZMQUdTX0RFQlVHIDo9IC1XYSwtZ3N0YWJzCitBRkxBR1MgOj0gJChBRkxBR1NfREVCVUcpIC1EX19BU1NFTUJMWV9fICQoQ1BQRkxBR1MpCisKK0xERkxBR1MgKz0gLUJzdGF0aWMgLVQgJChvYmopeC1sb2FkLmxkcyAkKFBMQVRGT1JNX0xERkxBR1MpCitpZm5lcSAoJChURVhUX0JBU0UpLCkKK0xERkxBR1MgKz0gLVR0ZXh0ICQoVEVYVF9CQVNFKQorZW5kaWYKKworIyBMb2NhdGlvbiBvZiBhIHVzYWJsZSBCRkQgbGlicmFyeSwgd2hlcmUgd2UgZGVmaW5lICJ1c2FibGUiIGFzCisjICJidWlsdCBmb3IgJHtIT1NUfSwgc3VwcG9ydHMgJHtUQVJHRVR9Ii4gIFNlbnNpYmxlIHZhbHVlcyBhcmUKKyMgLSBXaGVuIGNyb3NzLWNvbXBpbGluZzogdGhlIHJvb3Qgb2YgdGhlIGNyb3NzLWVudmlyb25tZW50CisjIC0gTGludXgvcHBjIChuYXRpdmUpOiAvdXNyCisjIC0gTmV0QlNEL3BwYyAobmF0aXZlKTogeW91IGxvc2UgLi4uIChtdXN0IGV4dHJhY3QgdGhlc2UgZnJvbSB0aGUKKyMgICBiaW51dGlscyBidWlsZCBkaXJlY3RvcnksIHBsdXMgdGhlIG5hdGl2ZSBhbmQgVS1Cb290IGluY2x1ZGUKKyMgICBmaWxlcyBkb24ndCBsaWtlIGVhY2ggb3RoZXIpCisjCisjIFNvIGZhciwgdGhpcyBpcyB1c2VkIG9ubHkgYnkgdG9vbHMvZ2RiL01ha2VmaWxlLgorCitpZmVxICgkKEhPU1RPUyksZGFyd2luKQorQkZEX1JPT1RfRElSID0JCS91c3IvbG9jYWwvdG9vbHMKK2Vsc2UKK2lmZXEgKCQoSE9TVEFSQ0gpLCQoQVJDSCkpCisjIG5hdGl2ZQorQkZEX1JPT1RfRElSID0JCS91c3IKK2Vsc2UKKyNCRkRfUk9PVF9ESVIgPQkJL0xpbnV4UFBDL0NESwkJIyBMaW51eC9pMzg2CisjQkZEX1JPT1RfRElSID0JCS91c3IvcGtnL2Nyb3NzCQkjIE5ldEJTRC9pMzg2CitCRkRfUk9PVF9ESVIgPQkJL29wdC9wb3dlcnBjCitlbmRpZgorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitleHBvcnQJSE9TVENDIEhPU1RDRkxBR1MgSE9TVExERkxBR1MgUEVEQ0ZMQUdTIEhPU1RTVFJJUCBDUk9TU19DT01QSUxFIFwKKwlBUyBMRCBDQyBDUFAgQVIgTk0gU1RSSVAgT0JKQ09QWSBPQkpEVU1QIE1BS0UKK2V4cG9ydAlURVhUX0JBU0UgUExBVEZPUk1fQ1BQRkxBR1MgUExBVEZPUk1fUkVMRkxBR1MgQ1BQRkxBR1MgQ0ZMQUdTIEFGTEFHUworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQWxsb3cgYm9hcmRzIHRvIHVzZSBjdXN0b20gb3B0aW1pemUgZmxhZ3Mgb24gYSBwZXIgZGlyL2ZpbGUgYmFzaXMKK0JDVVJESVIgPSAkKHN1YnN0ICQoU1JDVFJFRSkvLCwkKENVUkRJUjokKG9iaiklPSUpKQorJChvYmopJS5zOgklLlMKKwkkKENQUCkgJChBRkxBR1MpICQoQUZMQUdTXyQoQkNVUkRJUikvJChARikpICQoQUZMQUdTXyQoQkNVUkRJUikpIFwKKwkJLW8gJEAgJDwKKyQob2JqKSUubzoJJS5TCisJJChDQykgICQoQUZMQUdTKSAkKEFGTEFHU18kKEJDVVJESVIpLyQoQEYpKSAkKEFGTEFHU18kKEJDVVJESVIpKSBcCisJCS1vICRAICQ8IC1jCiskKG9iaiklLm86CSUuYworCSQoQ0MpICAkKENGTEFHUykgJChDRkxBR1NfJChCQ1VSRElSKS8kKEBGKSkgJChDRkxBR1NfJChCQ1VSRElSKSkgXAorCQktbyAkQCAkPCAtYworJChvYmopJS5pOgklLmMKKwkkKENQUCkgJChDRkxBR1MpICQoQ0ZMQUdTXyQoQkNVUkRJUikvJChARikpICQoQ0ZMQUdTXyQoQkNVUkRJUikpIFwKKwkJLW8gJEAgJDwgLWMKKyQob2JqKSUuczoJJS5jCisJJChDQykgICQoQ0ZMQUdTKSAkKENGTEFHU18kKEJDVVJESVIpLyQoQEYpKSAkKENGTEFHU18kKEJDVVJESVIpKSBcCisJCS1vICRAICQ8IC1jIC1TCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9hcm0xMTM2L01ha2VmaWxlIGIveC1sb2FkZXIvY3B1L2FybTExMzYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJhMzRhYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm0xMTM2L01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDMKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCisKK1NUQVJUCT0gc3RhcnQubworT0JKUwk9IGNwdS5vCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKFNUQVJUKSAkKExJQikKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtMTEzNi9jb25maWcubWsgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwNjgyNAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm0xMTM2L2NvbmZpZy5tawpAQCAtMCwwICsxLDMzIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCitQTEFURk9STV9SRUxGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZyAgLWZuby1jb21tb24gLWZmaXhlZC1yOAorCitQTEFURk9STV9DUFBGTEFHUyArPSAtbWFyY2g9YXJtdjUKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTdXBwbHkgb3B0aW9ucyBhY2NvcmRpbmcgdG8gY29tcGlsZXIgdmVyc2lvbgorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitQTEFURk9STV9DUFBGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1hcGNzLTMyLC1tYWJpPWFwY3MtZ251KQorUExBVEZPUk1fQ1BQRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tbm8tdGh1bWItaW50ZXJ3b3JrLCkKK1BMQVRGT1JNX1JFTEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbXNob3J0LWxvYWQtYnl0ZXMsJChjYWxsIGNjLW9wdGlvbiwtbWFsaWdubWVudC10cmFwcywpKQorIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTExMzYvY3B1LmMgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTY4ZmI5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTExMzYvY3B1LmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0dXJtZW50cworICoKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogdWRlbGF5KCkgaXMgQ1BVIHNwZWNpZmljIGNvZGUKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qIFNlZSBhbHNvIEFSTSBSZWYuIE1hbi4gKi8KKyNkZWZpbmUgQzFfTU1VCQkoMTw8MCkJCS8qIG1tdSBvZmYvb24gKi8KKyNkZWZpbmUgQzFfQUxJR04JKDE8PDEpCQkvKiBhbGlnbm1lbnQgZmF1bHRzIG9mZi9vbiAqLworI2RlZmluZSBDMV9EQwkJKDE8PDIpCQkvKiBkY2FjaGUgb2ZmL29uICovCisjZGVmaW5lIEMxX1dCCQkoMTw8MykJCS8qIG1lcmdpbmcgd3JpdGUgYnVmZmVyIG9uL29mZiAqLworI2RlZmluZSBDMV9CSUdfRU5ESUFOCSgxPDw3KQkvKiBiaWcgZW5kaWFuIG9mZi9vbiAqLworI2RlZmluZSBDMV9TWVNfUFJPVAkoMTw8OCkJCS8qIHN5c3RlbSBwcm90ZWN0aW9uICovCisjZGVmaW5lIEMxX1JPTV9QUk9UCSgxPDw5KQkJLyogUk9NIHByb3RlY3Rpb24gKi8KKyNkZWZpbmUgQzFfSUMJCSgxPDwxMikJCS8qIGljYWNoZSBvZmYvb24gKi8KKyNkZWZpbmUgQzFfSElHSF9WRUNUT1JTCSgxPDwxMykJLyogbG9jYXRpb24gb2YgdmVjdG9yczogbG93L2hpZ2ggYWRkcmVzc2VzICovCisjZGVmaW5lIFJFU0VSVkVEXzEJKDB4ZiA8PCAzKQkvKiBtdXN0IGJlIDExMWIgZm9yIFIvVyAqLworCitpbnQgY3B1X2luaXQgKHZvaWQpCit7CisJaW50IGk7CisKKwkvKiB0dXJuIG9mZiBJL0QtY2FjaGUgKi8KKwlhc20gKCJtcmMgcDE1LCAwLCAlMCwgYzEsIGMwLCAwIjoiPXIiIChpKSk7CisJaSAmPSB+KEMxX0RDIHwgQzFfSUMpOworCWFzbSAoIm1jciBwMTUsIDAsICUwLCBjMSwgYzAsIDAiOiA6InIiIChpKSk7CisKKwkvKiBmbHVzaCBJL0QtY2FjaGUgKi8KKwlpID0gMDsKKwlhc20gKCJtY3IgcDE1LCAwLCAlMCwgYzcsIGM3LCAwIjogOiJyIiAoaSkpOyAgLy8gaW52YWxpZGF0ZSBib3RoIGNhY2hlcyBhbmQgZmx1c2ggYnRiCisJYXNtICgibWNyIHAxNSwgMCwgJTAsIGM3LCBjMTAsIDQiOiA6InIiIChpKSk7IC8vIG1lbSBiYXJyaWVyIHRvIHN5bmMgdGhpbmdzCisKKwlyZXR1cm4gMDsKK30KKworCisKKworCisKKworCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtMTEzNi9zdGFydC5TIGIveC1sb2FkZXIvY3B1L2FybTExMzYvc3RhcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjEwOGQwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTExMzYvc3RhcnQuUwpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqICBhcm1ib290IC0gU3RhcnR1cCBDb2RlIGZvciBPTVAyNDIwL0FSTTExMzYgQ1BVLWNvcmUKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0ICBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEJTWFyaXVzIEdy9mdlciA8bWFnQHN5c2dvLmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMglBbGV4IFr8cGtlIDxhenVAc3lzZ28uZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCUdhcnkgSmVubmVqb2huIDxnakBkZW54LmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMwlSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAzCUtzaGl0aWogPGtzaGl0aWpAdGkuY29tPgorICogIENvcHlyaWdodCAoYykgMjAwNAlKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworLmdsb2JsIF9zdGFydAorX3N0YXJ0OgkKKwliCXJlc2V0CisgCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKworX2hhbmc6CisgCS53b3JkIGRvX2hhbmcKKwkKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4IC8qIG5vdyAxNio0PTY0ICovCisKKy5nbG9iYWwgX2VuZF92ZWN0CitfZW5kX3ZlY3Q6CisKKwkuYmFsaWdubCAxNiwweGRlYWRiZWVmCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdGFydHVwIENvZGUgKHJlc2V0IHZlY3RvcikKKyAqCisgKiBkbyBpbXBvcnRhbnQgaW5pdCBvbmx5IGlmIHdlIGRvbid0IHN0YXJ0IGZyb20gbWVtb3J5IQorICogc2V0dXAgTWVtb3J5IGFuZCBib2FyZCBzcGVjaWZpYyBiaXRzIHByaW9yIHRvIHJlbG9jYXRpb24uCisgKiByZWxvY2F0ZSBhcm1ib290IHRvIHJhbQorICogc2V0dXAgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCisKKy5nbG9ibCBfYXJtYm9vdF9zdGFydAorX2FybWJvb3Rfc3RhcnQ6CisJLndvcmQgX3N0YXJ0CisKKy8qCisgKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgbGlua2VyIHNjcmlwdC4KKyAqLworLmdsb2JsIF9ic3Nfc3RhcnQKK19ic3Nfc3RhcnQ6CisJLndvcmQgX19ic3Nfc3RhcnQKKworLmdsb2JsIF9ic3NfZW5kCitfYnNzX2VuZDoKKwkud29yZCBfZW5kCisKKy8qCisgKiB0aGUgYWN0dWFsIHJlc2V0IGNvZGUKKyAqLworCityZXNldDogCisJLyoKKwkgKiBzZXQgdGhlIGNwdSB0byBTVkMzMiBtb2RlCisJICovCisJbXJzCXIwLGNwc3IKKwliaWMJcjAscjAsIzB4MWYKKwlvcnIJcjAscjAsIzB4ZDMKKwltc3IJY3BzcixyMAorCisJLyogQ29weSB2ZWN0b3JzIHRvIG1hc2sgUk9NIGluZGlyZWN0IGFkZHIgKi8gCisJYWRyICAgICByMCwgX3N0YXJ0ICAgICAgICAgICAgICAvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworCWFkZCAgICAgcjAsIHIwLCAjNAkJCQkvKiBza2lwIHJlc2V0IHZlY3RvcgkJCSovCisJbW92ICAgICByMiwgIzY0ICAgICAgICAgICAgICAgICAvKiByMiA8LSBzaXplIHRvIGNvcHkgICovCisJYWRkICAgICByMiwgcjAsIHIyICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgICAgICAgICAqLworCW1vdiAgICAgcjEsICMweDQwMDAwMDAwICAgICAgICAgLyogYnVpbGQgdmVjdCBhZGRyICovCisJbW92ICAgICByMywgIzB4MDAyMDAwMDAKKwlhZGQgICAgIHIxLCByMSwgcjMKKwltb3YgICAgIHIzLCAjMHhmODAwCisJYWRkICAgICByMSwgcjEsIHIzCituZXh0OgorCWxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKwlzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisJY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworCWJuZSAgICAgbmV4dCAgICAgICAgICAgICAgICAgICAgLyogbG9vcCB1bnRpbCBlcXVhbCAqLworCisJYmwJY3B5X2Nsa19jb2RlICAgICAgICAgICAgLyogcHV0IGRwbGwgYWRqdXN0IGNvZGUgYmVoaW5kIHZlY3RvcnMgKi8KKyAKKwkvKiB0aGUgbWFzayBST00gY29kZSBzaG91bGQgaGF2ZSBQTEwgYW5kIG90aGVycyBzdGFibGUgKi8KKwlibCAgY3B1X2luaXRfY3JpdAorCityZWxvY2F0ZToJCQkJLyogcmVsb2NhdGUgVS1Cb290IHRvIFJBTQkgICAgKi8KKwlhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KKwlsZHIJcjEsIF9URVhUX0JBU0UJCS8qIHRlc3QgaWYgd2UgcnVuIGZyb20gZmxhc2ggb3IgUkFNICovCisJY21wIHIwLCByMSAgICAgICAgICAgICAgICAgIC8qIGRvbid0IHJlbG9jIGR1cmluZyBkZWJ1ZyAgICAgICAgICovCisJLyogYmVxIHN0YWNrX3NldHVwICovCisKKwlsZHIJcjIsIF9hcm1ib290X3N0YXJ0CisJbGRyCXIzLCBfYnNzX3N0YXJ0CisJc3ViCXIyLCByMywgcjIJCS8qIHIyIDwtIHNpemUgb2YgYXJtYm9vdCAgICAgICAgICAgICovCisJYWRkCXIyLCByMCwgcjIJCS8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovCisKK2NvcHlfbG9vcDoKKwlsZG1pYQlyMCEsIHtyMy1yMTB9CQkvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworCXN0bWlhCXIxISwge3IzLXIxMH0JCS8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisJY21wCXIwLCByMgkJCS8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVlZSBbcjJdICAgICovCisJYmxlCWNvcHlfbG9vcAorCisJLyogU2V0IHVwIHRoZSBzdGFjawkJCQkJCSAgICAqLworc3RhY2tfc2V0dXA6CisJbGRyCXIwLCBfVEVYVF9CQVNFCQkvKiB1cHBlciAxMjggS2lCOiByZWxvY2F0ZWQgdWJvb3QgICAqLworCXN1YglzcCwgcjAsICMxMjgJCS8qIGxlYXZlIDMyIHdvcmRzIGZvciBhYm9ydC1zdGFjayAgICAqLworCitjbGVhcl9ic3M6CisJbGRyCXIwLCBfYnNzX3N0YXJ0CQkvKiBmaW5kIHN0YXJ0IG9mIGJzcyBzZWdtZW50ICAgICAgICAqLworCWxkcglyMSwgX2Jzc19lbmQJCS8qIHN0b3AgaGVyZSAgICAgICAgICAgICAgICAgICAgICAgICovCisJbW92IAlyMiwgIzB4MDAwMDAwMDAJCS8qIGNsZWFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8vY2xic3NfbDpzdHIJcjIsIFtyMF0JCS8qIGNsZWFyIGxvb3AuLi4gICAgICAgICAgICAgICAgICAgICovCisvLwlhZGQJcjAsIHIwLCAjNAorLy8JY21wCXIwLCByMQorLy8JYm5lCWNsYnNzX2wKKworCWxkcglwYywgX3N0YXJ0X2FybWJvb3QKKworX3N0YXJ0X2FybWJvb3Q6CS53b3JkIHN0YXJ0X2FybWJvb3QKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDUFVfaW5pdF9jcml0aWNhbCByZWdpc3RlcnMKKyAqCisgKiBzZXR1cCBpbXBvcnRhbnQgcmVnaXN0ZXJzCisgKiBzZXR1cCBtZW1vcnkgdGltaW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworY3B1X2luaXRfY3JpdDoKKwkvKgorCSAqIGZsdXNoIHY0IEkvRCBjYWNoZXMKKwkgKi8KKwltb3YJcjAsICMwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNywgMAkvKiBmbHVzaCB2My92NCBjYWNoZSAqLworCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcsIDAJLyogZmx1c2ggdjQgVExCICovCisKKwkvKgorCSAqIGRpc2FibGUgTU1VIHN0dWZmIGFuZCBjYWNoZXMKKwkgKi8KKwltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCisJYmljCXIwLCByMCwgIzB4MDAwMDIzMDAJQCBjbGVhciBiaXRzIDEzLCA5OjggKC0tVi0gLS1SUykKKwliaWMJcjAsIHIwLCAjMHgwMDAwMDA4NwlAIGNsZWFyIGJpdHMgNywgMjowIChCLS0tIC1DQU0pCisJb3JyCXIwLCByMCwgIzB4MDAwMDAwMDIJQCBzZXQgYml0IDIgKEEpIEFsaWduCisjaWZuZGVmIENPTkZJR19JQ0FDSEVfT0ZGCisJb3JyCXIwLCByMCwgIzB4MDAwMDEwMDAJQCBzZXQgYml0IDEyIChJKSBJLUNhY2hlCisjZW5kaWYKKwltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCisKKwkvKgorICAgICAgICAgKiBKdW1wIHRvIGJvYXJkIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLi4uIFRoZSBNYXNrIFJPTSB3aWxsIGhhdmUgYWxyZWFkeSBpbml0aWFsaXplZAorICAgICAgICAgKiBiYXNpYyBtZW1vcnkuICBHbyBoZXJlIHRvIGJ1bXAgdXAgY2xvY2sgcmF0ZSBhbmQgaGFuZGxlIHdha2UgdXAgY29uZGl0aW9ucy4KKwkgKi8KKwlhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KKwlsZHIJcjEsIF9URVhUX0JBU0UJCS8qIHRlc3QgaWYgd2UgcnVuIGZyb20gZmxhc2ggb3IgUkFNICovCisJY21wICAgICByMCwgcjEgICAgICAgICAgICAgICAgICAvKiBwYXNzIG9uIGluZm8gYWJvdXQgc2tpcHBpbmcgc29tZSBpbml0IHBvcnRpb25zICovCisJbW92ZXEgICByMCwjMHgxICAgICAgICAgICAgICAgICAvKiBmbGFnIHRvIHNraXAgcHJjbSBhbmQgc2RyYyBzZXR1cCAqLworCW1vdm5lICAgcjAsIzB4MAorCisvL21vdiByMCwgIzEgICAgLyogdGhpcyBza2lwIG1lbW9yeSBpbml0ICovCisKKwltb3YJaXAsIGxyICAgICAgICAgIC8qIHBlcnNldmVyZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworCWJsCXBsYXRmb3Jtc2V0dXAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworCisJbW92CWxyLCBpcCAgICAgICAgICAvKiByZXN0b3JlIGxpbmsgKi8KKwltb3YJcGMsIGxyICAgICAgICAgIC8qIGJhY2sgdG8gbXkgY2FsbGVyICovCisKKworLyoKKyAqIGV4Y2VwdGlvbiBoYW5kbGVyCisgKi8KKyAJLmFsaWduICA1Citkb19oYW5nOgorCWxkcglzcCwgX1RFWFRfQkFTRQkJLyogdXNlIDMyIHdvcmRzIGFib3J0IHN0YWNrICovCisgICAJYmwJaGFuZwkJCQkvKiBoYW5nIGFuZCBuZXZlciByZXR1cm4gKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9NYWtlZmlsZSBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzYzNkMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvTWFrZWZpbGUKQEAgLTAsMCArMSw0MyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMworIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChDUFUpLmEKKworU1RBUlQJPSBzdGFydC5vCitPQkpTCT0gY3B1Lm8gIAorCithbGw6CSQob2JqKS5kZXBlbmQgJChTVEFSVCkgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9jb25maWcubWsgYi94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWFkYjEwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9jb25maWcubWsKQEAgLTAsMCArMSwzMiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDIKKyMgR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1mbm8tY29tbW9uIC1mZml4ZWQtcjgKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLW1hcmNoPWFybXY1CisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU3VwcGx5IG9wdGlvbnMgYWNjb3JkaW5nIHRvIGNvbXBpbGVyIHZlcnNpb24KKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUExBVEZPUk1fQ1BQRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tYXBjcy0zMiwtbWFiaT1hcGNzLWdudSkKK1BMQVRGT1JNX1JFTEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbXNob3J0LWxvYWQtYnl0ZXMsJChjYWxsIGNjLW9wdGlvbiwtbWFsaWdubWVudC10cmFwcywpKQorIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9jcHUuYyBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyZmE4YQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvY3B1LmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBBbGV4IFp1ZXBrZSA8YXp1QHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyAgCisjZGVmaW5lIFRJTUVSX0xPQURfVkFMIDB4ZmZmZmZmZmYKKworLyogbWFjcm8gdG8gcmVhZCB0aGUgMzIgYml0IHRpbWVyICovCisjZGVmaW5lIFJFQURfVElNRVIgKCoodm9sYXRpbGUgdWxvbmcgKikoQ0ZHX1RJTUVSQkFTRSs4KSkKKworc3RhdGljIHVsb25nIHRpbWVzdGFtcDsKK3N0YXRpYyB1bG9uZyBsYXN0ZGVjOworCitzdGF0aWMgdm9pZCByZXNldF90aW1lcl9tYXNrZWQgKHZvaWQpOworCisvKiBub3RoaW5nIHJlYWxseSB0byBkbyB3aXRoIGNwdSwganVzdCBzdGFydHMgdXAgYSBjb3VudGVyLiAqLworaW50IGNwdV9pbml0ICh2b2lkKQoreworIAlpbnQzMl90IHZhbDsKKworCS8qIFN0YXJ0IHRoZSBkZWNyZW1lbnRlciB0aWNraW5nIGRvd24gZnJvbSAweGZmZmZmZmZmICovCisJKigoaW50MzJfdCAqKSAoQ0ZHX1RJTUVSQkFTRSArIExPQURfVElNKSkgPSBUSU1FUl9MT0FEX1ZBTDsKKwl2YWwgPSBNUFVUSU1fU1QgfCBNUFVUSU1fQVIgfCBNUFVUSU1fQ0xPQ0tfRU5BQkxFIHwgKENGR19QVlQgPDwgTVBVVElNX1BUVl9CSVQpOworCSooKGludDMyX3QgKikgKENGR19USU1FUkJBU0UgKyBDTlRMX1RJTUVSKSkgPSB2YWw7CisKKwkvKiBpbml0IHRoZSB0aW1lc3RhbXAgYW5kIGxhc3RkZWMgdmFsdWUgKi8KKwlyZXNldF90aW1lcl9tYXNrZWQoKTsKKyAJCisgCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3RpbWVyX21hc2tlZCAodm9pZCkKK3sKKwkvKiByZXNldCB0aW1lICovCisJbGFzdGRlYyA9IFJFQURfVElNRVI7ICAvKiBjYXB1cmUgY3VycmVudCBkZWNyZW1lbnRlciB2YWx1ZSB0aW1lICovCisJdGltZXN0YW1wID0gMDsgICAgICAgICAvKiBzdGFydCAiYWR2YW5jaW5nIiB0aW1lIHN0YW1wIGZyb20gMCAqLworfQorCisjaWZkZWYgIENGR19VREVMQVkKKworc3RhdGljIHVsb25nIGdldF90aW1lcl9tYXNrZWQgKHZvaWQpOworc3RhdGljIHVsb25nIGdldF90aW1lciAodWxvbmcgYmFzZSk7CisKKy8qIGRlbGF5IHggdXNlY29uZHMgQU5EIHBlcnNlcnZlIGFkdmFuY2UgdGltc3RhbXAgdmFsdWUgKi8KK3ZvaWQgdWRlbGF5ICh1bnNpZ25lZCBsb25nIHVzZWMpCit7CisJdWxvbmcgdG1vLCB0bXA7CisKKwlpZih1c2VjID49IDEwMDApeyAgICAgICAgICAgICAgIC8qIGlmICJiaWciIG51bWJlciwgc3ByZWFkIG5vcm1hbGl6YXRpb24gdG8gc2Vjb25kcyAqLworCQl0bW8gPSB1c2VjIC8gMTAwMDsgICAgICAvKiBzdGFydCB0byBub3JtYWxpemUgZm9yIHVzZWMgdG8gdGlja3MgcGVyIHNlYyAqLworCQl0bW8gKj0gQ0ZHX0haOyAgICAgICAgICAvKiBmaW5kIG51bWJlciBvZiAidGlja3MiIHRvIHdhaXQgdG8gYWNoaWV2ZSB0YXJnZXQgKi8KKwkJdG1vIC89IDEwMDA7ICAgICAgICAgICAgLyogZmluaXNoIG5vcm1hbGl6ZS4gKi8KKwl9ZWxzZXsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsc2Ugc21hbGwgbnVtYmVyLCBkb24ndCBraWxsIGl0IHByaW9yIHRvIEhaIG11bHRpcGx5ICovCisJCXRtbyA9IHVzZWMgKiBDRkdfSFo7CisJCXRtbyAvPSAoMTAwMCoxMDAwKTsKKwl9CisKKwl0bXAgPSBnZXRfdGltZXIgKDApOwkJLyogZ2V0IGN1cnJlbnQgdGltZXN0YW1wICovCisJaWYoICh0bW8gKyB0bXApIDwgdG1wICkgCS8qIGlmIHNldHRpbmcgdGhpcyBmb3Jkd2FyZCB3aWxsIHJvbGwgdGltZSBzdGFtcCAqLworCQlyZXNldF90aW1lcl9tYXNrZWQgKCk7CS8qIHJlc2V0ICJhZHZhbmNpbmciIHRpbWVzdGFtcCB0byAwLCBzZXQgbGFzdGRlYyB2YWx1ZSAqLworCWVsc2UKKwkJdG1vICs9IHRtcDsJCS8qIGVsc2UsIHNldCBhZHZhbmNpbmcgc3RhbXAgd2FrZSB1cCB0aW1lICovCisKKwl3aGlsZSAoZ2V0X3RpbWVyX21hc2tlZCAoKSA8IHRtbykvKiBsb29wIHRpbGwgZXZlbnQgKi8KKwkJLypOT1AqLzsKK30KKyAKK3N0YXRpYyB1bG9uZyBnZXRfdGltZXJfbWFza2VkICh2b2lkKQoreworCXVsb25nIG5vdyA9IFJFQURfVElNRVI7CQkvKiBjdXJyZW50IHRpY2sgdmFsdWUgKi8KKworCWlmIChsYXN0ZGVjID49IG5vdykgewkJLyogbm9ybWFsIG1vZGUgKG5vbiByb2xsKSAqLworCQkvKiBub3JtYWwgbW9kZSAqLworCQl0aW1lc3RhbXAgKz0gbGFzdGRlYyAtIG5vdzsgLyogbW92ZSBzdGFtcCBmb3Jkd2FyZCB3aXRoIGFic291bHRlIGRpZmYgdGlja3MgKi8KKwl9IGVsc2UgewkJCS8qIHdlIGhhdmUgb3ZlcmZsb3cgb2YgdGhlIGNvdW50IGRvd24gdGltZXIgKi8KKwkJLyogbnRzID0gdHMgKyBsZCArIChUTFYgLSBub3cpCisJCSAqIHRzPW9sZCBzdGFtcCwgbGQ9dGltZSB0aGF0IHBhc3NlZCBiZWZvcmUgcGFzc2luZyB0aHJvdWdoIC0xCisJCSAqIChUTFYtbm93KSBhbW91bnQgb2YgdGltZSBhZnRlciBwYXNzaW5nIHRob3VnaCAtMQorCQkgKiBudHMgPSBuZXcgImFkdmFuY2luZyB0aW1lIHN0YW1wIi4uLml0IGNvdWxkIGFsc28gcm9sbCBhbmQgY2F1c2UgcHJvYmxlbXMuCisJCSAqLworCQl0aW1lc3RhbXAgKz0gbGFzdGRlYyArIFRJTUVSX0xPQURfVkFMIC0gbm93OworCX0KKwlsYXN0ZGVjID0gbm93OworCisJcmV0dXJuIHRpbWVzdGFtcDsKK30KKworc3RhdGljIHVsb25nIGdldF90aW1lciAodWxvbmcgYmFzZSkKK3sKKwlyZXR1cm4gZ2V0X3RpbWVyX21hc2tlZCAoKSAtIGJhc2U7Cit9CisKKyNlbmRpZiAJCS8qIENGR19VREVMQVkgKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9zdGFydC5TIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMTFkYWUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL3N0YXJ0LlMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiAgYXJtYm9vdCAtIFN0YXJ0dXAgQ29kZSBmb3IgQVJNOTI2RUpTIENQVS1jb3JlCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyAgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAgLS0tLS0gQWRhcHRlZCBmb3IgT01BUDE2MTAgZnJvbSBBUk05MjV0IGNvZGUgLS0tLS0tCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMQlNYXJpdXMgR3L2Z2VyIDxtYWdAc3lzZ28uZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCUFsZXggWvxwa2UgPGF6dUBzeXNnby5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIJR2FyeSBKZW5uZWpvaG4gPGdqQGRlbnguZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAzCVJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMJS3NoaXRpaiA8a3NoaXRpakB0aS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA0CUppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaWYgZGVmaW5lZChDT05GSUdfT01BUDE2MTApCisjaW5jbHVkZSA8Li9jb25maWdzL29tYXAxNTEwLmg+CisjZW5kaWYKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSnVtcCB2ZWN0b3IgdGFibGUgYXMgaW4gdGFibGUgMy4xIGluIFsxXQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworCisuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CisJYglyZXNldAorIAlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisKK19oYW5nOgorIAkud29yZCBkb19oYW5nCisgIAorCS5iYWxpZ25sIDE2LDB4ZGVhZGJlZWYKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdGFydHVwIENvZGUgKHJlc2V0IHZlY3RvcikKKyAqCisgKiBkbyBpbXBvcnRhbnQgaW5pdCBvbmx5IGlmIHdlIGRvbid0IHN0YXJ0IGZyb20gbWVtb3J5IQorICogc2V0dXAgTWVtb3J5IGFuZCBib2FyZCBzcGVjaWZpYyBiaXRzIHByaW9yIHRvIHJlbG9jYXRpb24uCisgKiByZWxvY2F0ZSBhcm1ib290IHRvIHJhbQorICogc2V0dXAgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCisKKy5nbG9ibCBfYXJtYm9vdF9zdGFydAorX2FybWJvb3Rfc3RhcnQ6CisJLndvcmQgX3N0YXJ0CisKKy8qCisgKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgbGlua2VyIHNjcmlwdC4KKyAqLworLmdsb2JsIF9ic3Nfc3RhcnQKK19ic3Nfc3RhcnQ6CisJLndvcmQgX19ic3Nfc3RhcnQKKworLmdsb2JsIF9ic3NfZW5kCitfYnNzX2VuZDoKKwkud29yZCBfZW5kCisKKyAKKy8qCisgKiB0aGUgYWN0dWFsIHJlc2V0IGNvZGUKKyAqLworCityZXNldDoKKwkvKgorCSAqIHNldCB0aGUgY3B1IHRvIFNWQzMyIG1vZGUKKwkgKi8KKwltcnMJcjAsY3BzcgorCWJpYwlyMCxyMCwjMHgxZgorCW9ycglyMCxyMCwjMHhkMworCW1zcgljcHNyLHIwCisgIAorCS8qCisJICogdHVybiBvZmYgdGhlIHdhdGNoZG9nLCB1bmxvY2svZGlhYmxlIHNlcXVlbmNlCisJICovCisJbW92CXIxLCAjMHhGNQorCWxkcglyMCwgPVdEVElNX01PREUKKwlzdHJoCXIxLCBbcjBdCisJbW92CXIxLCAjMHhBMAorCXN0cmgJcjEsIFtyMF0KKworCisJLyoKKwkgKiBtYXNrIGFsbCBJUlFzIGJ5IHNldHRpbmcgYWxsIGJpdHMgaW4gdGhlIElOVE1SIC0gZGVmYXVsdAorCSAqLworCisJbW92CXIxLCAjMHhmZmZmZmZmZgorCWxkcglyMCwgPVJFR19JSEwxX01JUgorCXN0cglyMSwgW3IwXQorCWxkcglyMCwgPVJFR19JSEwyX01JUgorCXN0cglyMSwgW3IwXQorIAorCS8qCisJICogd2UgZG8gc3lzLWNyaXRpY2FsIGluaXRzIGF0IHJlYm9vdCwKKyAJICovCisgCWJsCWNwdV9pbml0X2NyaXQgCisgIAorCS8qIAorCSAqIHJlbG9jYXRlIGV4Y2VwdGlvbiB2ZWN0b3JzIHRvIFNSQU0gd2hlcmUgUk9NIGNvZGUgZXhwZWN0cworCSAqLworI2lmZGVmIENGR19CT09UX0NTMAorCisJYWRyCXIwLCBfc3RhcnQJCS8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisgCWFkZCAgICAgcjAsIHIwLCAjNAkvKiBza2lwIHJlc2V0IHZlY3RvcgkJCSovCisJbW92CXIyLCAjMzYJCS8qIHIyIDwtIHNpemUgb2YgZGF0YSAoOCsxIHdvcmRzKSAgICAgICAgICAgICovCisJYWRkCXIyLCByMCwgcjIJCS8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovCisJbW92IHIxLCAjMHgyMDAwMDAwMAorbmV4dDoKKwlsZG1pYQlyMCEsIHtyMy1yMTB9CQkvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworCXN0bWlhCXIxISwge3IzLXIxMH0JCS8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisJY21wCXIwLCByMgkJCS8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisJYmxlCW5leHQKKworI2VuZGlmCisgCityZWxvY2F0ZToJCQkJLyogcmVsb2NhdGUgWC1Mb2FkZXIgdG8gUkFNCSAgICAqLworCWFkcglyMCwgX3N0YXJ0CQkvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gKi8KKwljbXAgICAgIHIwLCByMSAgICAgICAgICAgICAgICAgIC8qIGRvbid0IHJlbG9jIGR1cmluZyBkZWJ1ZyAgICAgICAgICovCisJLypiZXEgICAgIHN0YWNrX3NldHVwKi8KKworCWxkcglyMiwgX2FybWJvb3Rfc3RhcnQKKwlsZHIJcjMsIF9ic3Nfc3RhcnQKKwlzdWIJcjIsIHIzLCByMgkJLyogcjIgPC0gc2l6ZSBvZiBhcm1ib290ICAgICAgICAgICAgKi8KKwlhZGQJcjIsIHIwLCByMgkJLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICAgICAgICAgKi8KKworY29weV9sb29wOgorCWxkbWlhCXIwISwge3IzLXIxMH0JCS8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisJc3RtaWEJcjEhLCB7cjMtcjEwfQkJLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKwljbXAJcjAsIHIyCQkJLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKwlibGUJY29weV9sb29wCisKKwkvKiBTZXQgdXAgdGhlIHN0YWNrCQkJCQkJICAgICovCitzdGFja19zZXR1cDoKKwlsZHIJcjAsIF9URVhUX0JBU0UJCS8qIHVwcGVyIDEyOCBLaUI6IHJlbG9jYXRlZCBYLUxvYWRlciAgICovCisgIAlzdWIJc3AsIHIwLCAjMTI4CQkvKiBsZWF2ZSAzMiB3b3JkcyBmb3IgYWJvcnQtc3RhY2sgICAgKi8KKworY2xlYXJfYnNzOgorCWxkcglyMCwgX2Jzc19zdGFydAkJLyogZmluZCBzdGFydCBvZiBic3Mgc2VnbWVudCAgICAgICAgKi8KKwlhZGQJcjAsIHIwLCAjNAkJLyogc3RhcnQgYXQgZmlyc3QgYnl0ZSBvZiBic3MgICAgICAgKi8KKwlsZHIJcjEsIF9ic3NfZW5kCQkvKiBzdG9wIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAqLworCW1vdiAJcjIsICMweDAwMDAwMDAwCQkvKiBjbGVhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitjbGJzc19sOnN0cglyMiwgW3IwXQkJLyogY2xlYXIgbG9vcC4uLiAgICAgICAgICAgICAgICAgICAgKi8KKwlhZGQJcjAsIHIwLCAjNAorCWNtcAlyMCwgcjEKKwlibmUJY2xic3NfbAorCisgCWxkcglwYywgX3N0YXJ0X2FybWJvb3QKKworX3N0YXJ0X2FybWJvb3Q6CisJLndvcmQgIHN0YXJ0X2FybWJvb3QKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDUFVfaW5pdF9jcml0aWNhbCByZWdpc3RlcnMKKyAqCisgKiBzZXR1cCBpbXBvcnRhbnQgcmVnaXN0ZXJzCisgKiBzZXR1cCBtZW1vcnkgdGltaW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKK2NwdV9pbml0X2NyaXQ6CisJLyoKKwkgKiBmbHVzaCB2NCBJL0QgY2FjaGVzCisJICovCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzcsIDAJLyogZmx1c2ggdjMvdjQgY2FjaGUgKi8KKwltY3IJcDE1LCAwLCByMCwgYzgsIGM3LCAwCS8qIGZsdXNoIHY0IFRMQiAqLworCisJLyoKKwkgKiBkaXNhYmxlIE1NVSBzdHVmZiBhbmQgY2FjaGVzCisJICovCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAorCWJpYwlyMCwgcjAsICMweDAwMDAyMzAwCS8qIGNsZWFyIGJpdHMgMTMsIDk6OCAoLS1WLSAtLVJTKSAqLworCWJpYwlyMCwgcjAsICMweDAwMDAwMDg3CS8qIGNsZWFyIGJpdHMgNywgMjowIChCLS0tIC1DQU0pICovCisJb3JyCXIwLCByMCwgIzB4MDAwMDAwMDIJLyogc2V0IGJpdCAyIChBKSBBbGlnbiAqLworCW9ycglyMCwgcjAsICMweDAwMDAxMDAwCS8qIHNldCBiaXQgMTIgKEkpIEktQ2FjaGUgKi8KKwltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCisKKwkvKgorCSAqIEdvIHNldHVwIE1lbW9yeSBhbmQgYm9hcmQgc3BlY2lmaWMgYml0cyBwcmlvciB0byByZWxvY2F0aW9uLgorCSAqLworCW1vdglpcCwgbHIJCS8qIHBlcnNlcnZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisJYmwJcGxhdGZvcm1zZXR1cAkvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworCW1vdglsciwgaXAJCS8qIHJlc3RvcmUgbGluayAqLworCW1vdglwYywgbHIJCS8qIGJhY2sgdG8gbXkgY2FsbGVyICovCisgIAorLyoKKyAqIGV4Y2VwdGlvbiBoYW5kbGVyCisgKi8KKyAJLmFsaWduICA1Citkb19oYW5nOgorCWxkcglzcCwgX1RFWFRfQkFTRQkJLyogdXNlIDMyIHdvcmRzIGFib3J0IHN0YWNrICovCisgICAJYmwJaGFuZwkJCQkvKiBoYW5nIGFuZCBuZXZlciByZXR1cm4gKi8KKworCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvb21hcDMvTWFrZWZpbGUgYi94LWxvYWRlci9jcHUvb21hcDMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxZTc2OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAzCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKENQVSkuYQorCitTVEFSVAk6PSBzdGFydC5vCitDT0JKUwk6PSBjcHUubyBtbWMubworCitTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJUKSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9vbWFwMy9jb25maWcubWsgYi94LWxvYWRlci9jcHUvb21hcDMvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZjkwY2IKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvb21hcDMvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZm5vLWNvbW1vbiAtZmZpeGVkLXI4IC1tc29mdC1mbG9hdAorCitQTEFURk9STV9DUFBGTEFHUyArPSAtbWFyY2g9YXJtdjctYQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFN1cHBseSBvcHRpb25zIGFjY29yZGluZyB0byBjb21waWxlciB2ZXJzaW9uCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1BMQVRGT1JNX0NQUEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbWFwY3MtMzIsLW1hYmk9YXBjcy1nbnUpCitQTEFURk9STV9DUFBGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1uby10aHVtYi1pbnRlcndvcmssKQorUExBVEZPUk1fUkVMRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tc2hvcnQtbG9hZC1ieXRlcywkKGNhbGwgY2Mtb3B0aW9uLC1tYWxpZ25tZW50LXRyYXBzLCkpCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvb21hcDMvY3B1LmMgYi94LWxvYWRlci9jcHUvb21hcDMvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmNDIyYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9jcHUuYwpAQCAtMCwwICsxLDUxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDYgVGV4YXMgSW5zdHVybWVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBDUFUgc3BlY2lmaWMgY29kZQorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qIFNlZSBhbHNvIEFSTSBSZWYuIE1hbi4gKi8KKyNkZWZpbmUgQzFfTU1VCQkoMTw8MCkJCS8qIG1tdSBvZmYvb24gKi8KKyNkZWZpbmUgQzFfQUxJR04JKDE8PDEpCQkvKiBhbGlnbm1lbnQgZmF1bHRzIG9mZi9vbiAqLworI2RlZmluZSBDMV9EQwkJKDE8PDIpCQkvKiBkY2FjaGUgb2ZmL29uICovCisjZGVmaW5lIEMxX1dCCQkoMTw8MykJCS8qIG1lcmdpbmcgd3JpdGUgYnVmZmVyIG9uL29mZiAqLworI2RlZmluZSBDMV9CSUdfRU5ESUFOCSgxPDw3KQkvKiBiaWcgZW5kaWFuIG9mZi9vbiAqLworI2RlZmluZSBDMV9TWVNfUFJPVAkoMTw8OCkJCS8qIHN5c3RlbSBwcm90ZWN0aW9uICovCisjZGVmaW5lIEMxX1JPTV9QUk9UCSgxPDw5KQkJLyogUk9NIHByb3RlY3Rpb24gKi8KKyNkZWZpbmUgQzFfSUMJCSgxPDwxMikJCS8qIGljYWNoZSBvZmYvb24gKi8KKyNkZWZpbmUgQzFfSElHSF9WRUNUT1JTCSgxPDwxMykJLyogbG9jYXRpb24gb2YgdmVjdG9yczogbG93L2hpZ2ggYWRkcmVzc2VzICovCisjZGVmaW5lIFJFU0VSVkVEXzEJKDB4ZiA8PCAzKQkvKiBtdXN0IGJlIDExMWIgZm9yIFIvVyAqLworCitpbnQgY3B1X2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9vbWFwMy9tbWMuYyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9tbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNjVkZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L29tYXAzL21tYy5jCkBAIC0wLDAgKzEsNTYyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA4CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBTeWVkIE1vaGFtbWVkIEtoYXNpbSA8a2hhc2ltQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtbWMuaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+CisKKyNpZmRlZiBDRkdfQ01EX01NQworCisjaW5jbHVkZSAibW1jX2hvc3RfZGVmLmgiCisjaW5jbHVkZSAibW1jX3Byb3RvY29sLmgiCisKKyNkZWZpbmUgT01BUF9NTUNfTUFTVEVSX0NMT0NLICAgOTYwMDAwMDAKK2V4dGVybiBpbnQgZmF0X3JlZ2lzdGVyX2RldmljZShibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYywgaW50IHBhcnRfbm8pOworCittbWNfY2FyZF9kYXRhIGN1cl9jYXJkX2RhdGE7CitzdGF0aWMgYmxvY2tfZGV2X2Rlc2NfdCBtbWNfYmxrX2RldjsKKworYmxvY2tfZGV2X2Rlc2NfdCAqbW1jX2dldF9kZXYoaW50IGRldikKK3sKKwlyZXR1cm4gKChibG9ja19kZXZfZGVzY190ICopICZtbWNfYmxrX2Rldik7Cit9CisKK3Vuc2lnbmVkIGNoYXIgbW1jX2JvYXJkX2luaXQodm9pZCkKK3sKKyNpZiBkZWZpbmVkIChDT05GSUdfT01BUDM0WFgpICYmICFkZWZpbmVkIChDT05GSUdfQU0zNTE3RVZNKQorCXVuc2lnbmVkIGludCB2YWx1ZSA9IDA7CisKKwl2YWx1ZSA9IENPTlRST0xfUEJJQVNfTElURTsKKwlDT05UUk9MX1BCSUFTX0xJVEUgPSB2YWx1ZSB8ICgxIDw8IDIpIHwgKDEgPDwgMSkgfCAoMSA8PCA5KTsKKworCXZhbHVlID0gQ09OVFJPTF9ERVZfQ09ORjA7CisJQ09OVFJPTF9ERVZfQ09ORjAgPSB2YWx1ZSB8ICgxIDw8IDI0KTsKKyNlbmRpZgorCXJldHVybiAxOworfQorCit2b2lkIG1tY19pbml0X3N0cmVhbSh2b2lkKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBtbWNfc3RhdDsKKworCU9NQVBfSFNNTUNfQ09OIHw9IElOSVRfSU5JVFNUUkVBTTsKKworCU9NQVBfSFNNTUNfQ01EID0gTU1DX0NNRDA7CisJZG8geworCQltbWNfc3RhdCA9IE9NQVBfSFNNTUNfU1RBVDsKKwl9IHdoaWxlICghKG1tY19zdGF0ICYgQ0NfTUFTSykpOworCisJT01BUF9IU01NQ19TVEFUID0gQ0NfTUFTSzsKKworCU9NQVBfSFNNTUNfQ01EID0gTU1DX0NNRDA7CisJZG8geworCQltbWNfc3RhdCA9IE9NQVBfSFNNTUNfU1RBVDsKKwl9IHdoaWxlICghKG1tY19zdGF0ICYgQ0NfTUFTSykpOworCisJT01BUF9IU01NQ19TVEFUID0gT01BUF9IU01NQ19TVEFUOworCU9NQVBfSFNNTUNfQ09OICY9IH5JTklUX0lOSVRTVFJFQU07Cit9CisKK3Vuc2lnbmVkIGNoYXIgbW1jX2Nsb2NrX2NvbmZpZyh1bnNpZ25lZCBpbnQgaWNsaywgdW5zaWduZWQgc2hvcnQgY2xrX2RpdikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJbW1jX3JlZ19vdXQoT01BUF9IU01NQ19TWVNDVEwsIChJQ0VfTUFTSyB8IERUT19NQVNLIHwgQ0VOX01BU0spLAorCQkgICAgKElDRV9TVE9QIHwgRFRPXzE1VEhEVE8gfCBDRU5fRElTQUJMRSkpOworCisJc3dpdGNoIChpY2xrKSB7CisJY2FzZSBDTEtfSU5JVFNFUToKKwkJdmFsID0gTU1DX0lOSVRfU0VRX0NMSyAvIDI7CisJCWJyZWFrOworCWNhc2UgQ0xLXzQwMEtIWjoKKwkJdmFsID0gTU1DXzQwMGtIel9DTEs7CisJCWJyZWFrOworCWNhc2UgQ0xLX01JU0M6CisJCXZhbCA9IGNsa19kaXY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwltbWNfcmVnX291dChPTUFQX0hTTU1DX1NZU0NUTCwKKwkJICAgIElDRV9NQVNLIHwgQ0xLRF9NQVNLLCAodmFsIDw8IENMS0RfT0ZGU0VUKSB8IElDRV9PU0NJTExBVEUpOworCisJd2hpbGUgKChPTUFQX0hTTU1DX1NZU0NUTCAmIElDU19NQVNLKSA9PSBJQ1NfTk9UUkVBRFkpOworCisKKwlPTUFQX0hTTU1DX1NZU0NUTCB8PSBDRU5fRU5BQkxFOworCXJldHVybiAxOworfQorCit1bnNpZ25lZCBjaGFyIG1tY19pbml0X3NldHVwKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHJlZ192YWw7CisKKwltbWNfYm9hcmRfaW5pdCgpOworCisJT01BUF9IU01NQ19TWVNDT05GSUcgfD0gTU1DX1NPRlRSRVNFVDsKKwl3aGlsZSAoKE9NQVBfSFNNTUNfU1lTU1RBVFVTICYgUkVTRVRET05FKSA9PSAwKSA7CisKKwlPTUFQX0hTTU1DX1NZU0NUTCB8PSBTT0ZUUkVTRVRBTEw7CisJd2hpbGUgKChPTUFQX0hTTU1DX1NZU0NUTCAmIFNPRlRSRVNFVEFMTCkgIT0gMHgwKSA7CisKKwlPTUFQX0hTTU1DX0hDVEwgPSBEVFdfMV9CSVRNT0RFIHwgU0RCUF9QV1JPRkYgfCBTRFZTXzNWMDsKKwlPTUFQX0hTTU1DX0NBUEEgfD0gVlMzMF8zVjBTVVAgfCBWUzE4XzFWOFNVUDsKKworCXJlZ192YWwgPSBPTUFQX0hTTU1DX0NPTiAmIFJFU0VSVkVEX01BU0s7CisKKwlPTUFQX0hTTU1DX0NPTiA9IENUUExfTU1DX1NEIHwgcmVnX3ZhbCB8IFdQUF9BQ1RJVkVISUdIIHwKKwkgICAgQ0RQX0FDVElWRUhJR0ggfCBNSVRfQ1RPIHwgRFc4XzFfNEJJVE1PREUgfCBNT0RFX0ZVTkMgfAorCSAgICBTVFJfQkxPQ0sgfCBIUl9OT0hPU1RSRVNQIHwgSU5JVF9OT0lOSVQgfCBOT09QRU5EUkFJTjsKKworCW1tY19jbG9ja19jb25maWcoQ0xLX0lOSVRTRVEsIDApOworCU9NQVBfSFNNTUNfSENUTCB8PSBTREJQX1BXUk9OOworCisJT01BUF9IU01NQ19JRSA9IDB4MzA3ZjAwMzM7CisKKwltbWNfaW5pdF9zdHJlYW0oKTsKKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgY2hhciBtbWNfc2VuZF9jbWQodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgaW50IGFyZywKKwkJCSAgIHVuc2lnbmVkIGludCAqcmVzcG9uc2UpCit7CisJdW5zaWduZWQgaW50IG1tY19zdGF0OworCisJd2hpbGUgKChPTUFQX0hTTU1DX1BTVEFURSAmIERBVElfTUFTSykgPT0gREFUSV9DTURESVMpOworCisKKwlPTUFQX0hTTU1DX0JMSyA9IEJMRU5fNTEyQllURVNMRU4gfCBOQkxLX1NUUENOVDsKKwlPTUFQX0hTTU1DX1NUQVQgPSAweEZGRkZGRkZGOworCU9NQVBfSFNNTUNfQVJHID0gYXJnOworCU9NQVBfSFNNTUNfQ01EID0gY21kIHwgQ01EX1RZUEVfTk9STUFMIHwgQ0lDRV9OT0NIRUNLIHwKKwkgICAgQ0NDRV9OT0NIRUNLIHwgTVNCU19TR0xFQkxLIHwgQUNFTl9ESVNBQkxFIHwgQkNFX0RJU0FCTEUgfAorCSAgICBERV9ESVNBQkxFOworCisJd2hpbGUgKDEpIHsKKwkJZG8geworCQkJbW1jX3N0YXQgPSBPTUFQX0hTTU1DX1NUQVQ7CisJCX0gd2hpbGUgKG1tY19zdGF0ID09IDApOworCisJCWlmICgobW1jX3N0YXQgJiBFUlJJX01BU0spICE9IDApCisJCQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpbW1jX3N0YXQ7CisKKworCQlpZiAobW1jX3N0YXQgJiBDQ19NQVNLKSB7CisJCQlPTUFQX0hTTU1DX1NUQVQgPSBDQ19NQVNLOworCQkJcmVzcG9uc2VbMF0gPSBPTUFQX0hTTU1DX1JTUDEwOworCQkJaWYgKChjbWQgJiBSU1BfVFlQRV9NQVNLKSA9PSBSU1BfVFlQRV9MR0hUMTM2KSB7CisJCQkJcmVzcG9uc2VbMV0gPSBPTUFQX0hTTU1DX1JTUDMyOworCQkJCXJlc3BvbnNlWzJdID0gT01BUF9IU01NQ19SU1A1NDsKKwkJCQlyZXNwb25zZVszXSA9IE9NQVBfSFNNTUNfUlNQNzY7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgY2hhciBtbWNfcmVhZF9kYXRhKHVuc2lnbmVkIGludCAqb3V0cHV0X2J1ZikKK3sKKwl1bnNpZ25lZCBpbnQgbW1jX3N0YXQ7CisJdW5zaWduZWQgaW50IHJlYWRfY291bnQgPSAwOworCisJLyoKKwkgKiBTdGFydCBQb2xsZWQgUmVhZAorCSAqLworCXdoaWxlICgxKSB7CisJCWRvIHsKKwkJCW1tY19zdGF0ID0gT01BUF9IU01NQ19TVEFUOworCQl9IHdoaWxlIChtbWNfc3RhdCA9PSAwKTsKKworCQlpZiAoKG1tY19zdGF0ICYgRVJSSV9NQVNLKSAhPSAwKQorCQkJcmV0dXJuICh1bnNpZ25lZCBjaGFyKW1tY19zdGF0OworCisJCWlmIChtbWNfc3RhdCAmIEJSUl9NQVNLKSB7CisJCQl1bnNpZ25lZCBpbnQgazsKKworCQkJT01BUF9IU01NQ19TVEFUIHw9IEJSUl9NQVNLOworCQkJZm9yIChrID0gMDsgayA8IE1NQ1NEX1NFQ1RPUl9TSVpFIC8gNDsgaysrKSB7CisJCQkJKm91dHB1dF9idWYgPSBPTUFQX0hTTU1DX0RBVEE7CisJCQkJb3V0cHV0X2J1ZisrOworCQkJCXJlYWRfY291bnQgKz0gNDsKKwkJCX0KKwkJfQorCisJCWlmIChtbWNfc3RhdCAmIEJXUl9NQVNLKQorCQkJT01BUF9IU01NQ19TVEFUIHw9IEJXUl9NQVNLOworCisJCWlmIChtbWNfc3RhdCAmIFRDX01BU0spIHsKKwkJCU9NQVBfSFNNTUNfU1RBVCB8PSBUQ19NQVNLOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGNoYXIgbW1jX2RldGVjdF9jYXJkKG1tY19jYXJkX2RhdGEgKm1tY19jYXJkX2N1cikKK3sKKwl1bnNpZ25lZCBjaGFyIGVycjsKKwl1bnNpZ25lZCBpbnQgYXJndW1lbnQgPSAwOworCXVuc2lnbmVkIGludCBvY3JfdmFsdWUsIG9jcl9yZWN2ZCwgcmV0X2NtZDQxLCBoY3NfdmFsOworCXVuc2lnbmVkIGludCByZXNwWzRdOworCXVuc2lnbmVkIHNob3J0IHJldHJ5X2NudCA9IDIwMDA7CisKKwkvKiBTZXQgdG8gSW5pdGlhbGl6YXRpb24gQ2xvY2sgKi8KKwllcnIgPSBtbWNfY2xvY2tfY29uZmlnKENMS180MDBLSFosIDApOworCWlmIChlcnIgIT0gMSkKKwkJcmV0dXJuIGVycjsKKworCW1tY19jYXJkX2N1ci0+UkNBID0gTU1DX1JFTEFUSVZFX0NBUkRfQUREUkVTUzsKKwlhcmd1bWVudCA9IDB4MDAwMDAwMDA7CisKKwlvY3JfdmFsdWUgPSAoMHgxRkYgPDwgMTUpOworCWVyciA9IG1tY19zZW5kX2NtZChNTUNfQ01EMCwgYXJndW1lbnQsIHJlc3ApOworCWlmIChlcnIgIT0gMSkKKwkJcmV0dXJuIGVycjsKKworCWFyZ3VtZW50ID0gU0RfQ01EOF9DSEVDS19QQVRURVJOIHwgU0RfQ01EOF8yXzdfM182X1ZfUkFOR0U7CisJZXJyID0gbW1jX3NlbmRfY21kKE1NQ19TRENNRDgsIGFyZ3VtZW50LCByZXNwKTsKKwloY3NfdmFsID0gKGVyciA9PSAxKSA/CisJICAgIE1NQ19PQ1JfUkVHX0hPU1RfQ0FQQUNJVFlfU1VQUE9SVF9TRUNUT1IgOgorCSAgICBNTUNfT0NSX1JFR19IT1NUX0NBUEFDSVRZX1NVUFBPUlRfQllURTsKKworCWFyZ3VtZW50ID0gMHgwMDAwIDw8IDE2OworCWVyciA9IG1tY19zZW5kX2NtZChNTUNfQ01ENTUsIGFyZ3VtZW50LCByZXNwKTsKKwlpZiAoZXJyID09IDEpIHsKKwkJbW1jX2NhcmRfY3VyLT5jYXJkX3R5cGUgPSBTRF9DQVJEOworCQlvY3JfdmFsdWUgfD0gaGNzX3ZhbDsKKwkJcmV0X2NtZDQxID0gTU1DX0FDTUQ0MTsKKwl9IGVsc2UgeworCQltbWNfY2FyZF9jdXItPmNhcmRfdHlwZSA9IE1NQ19DQVJEOworCQlvY3JfdmFsdWUgfD0gTU1DX09DUl9SRUdfQUNDRVNTX01PREVfU0VDVE9SOworCQlyZXRfY21kNDEgPSBNTUNfQ01EMTsKKwkJT01BUF9IU01NQ19DT04gJj0gfk9EOworCQlPTUFQX0hTTU1DX0NPTiB8PSBPUEVORFJBSU47CisJfQorCisJYXJndW1lbnQgPSBvY3JfdmFsdWU7CisJZXJyID0gbW1jX3NlbmRfY21kKHJldF9jbWQ0MSwgYXJndW1lbnQsIHJlc3ApOworCWlmIChlcnIgIT0gMSkKKwkJcmV0dXJuIGVycjsKKworCW9jcl9yZWN2ZCA9ICgobW1jX3Jlc3BfcjMgKikgcmVzcCktPm9jcjsKKworCXdoaWxlICghKG9jcl9yZWN2ZCAmICgweDEgPDwgMzEpKSAmJiAocmV0cnlfY250ID4gMCkpIHsKKwkJcmV0cnlfY250LS07CisJCWlmIChtbWNfY2FyZF9jdXItPmNhcmRfdHlwZSA9PSBTRF9DQVJEKSB7CisJCQlhcmd1bWVudCA9IDB4MDAwMCA8PCAxNjsKKwkJCWVyciA9IG1tY19zZW5kX2NtZChNTUNfQ01ENTUsIGFyZ3VtZW50LCByZXNwKTsKKwkJfQorCisJCWFyZ3VtZW50ID0gb2NyX3ZhbHVlOworCQllcnIgPSBtbWNfc2VuZF9jbWQocmV0X2NtZDQxLCBhcmd1bWVudCwgcmVzcCk7CisJCWlmIChlcnIgIT0gMSkKKwkJCXJldHVybiBlcnI7CisJCW9jcl9yZWN2ZCA9ICgobW1jX3Jlc3BfcjMgKikgcmVzcCktPm9jcjsKKwl9CisKKwlpZiAoIShvY3JfcmVjdmQgJiAoMHgxIDw8IDMxKSkpCisJCXJldHVybiAwOworCisJaWYgKG1tY19jYXJkX2N1ci0+Y2FyZF90eXBlID09IE1NQ19DQVJEKSB7CisJCWlmICgob2NyX3JlY3ZkICYgTU1DX09DUl9SRUdfQUNDRVNTX01PREVfTUFTSykgPT0KKwkJICAgIE1NQ19PQ1JfUkVHX0FDQ0VTU19NT0RFX1NFQ1RPUikgeworCQkJbW1jX2NhcmRfY3VyLT5tb2RlID0gU0VDVE9SX01PREU7CisJCX0gZWxzZSB7CisJCQltbWNfY2FyZF9jdXItPm1vZGUgPSBCWVRFX01PREU7CisJCX0KKworCQlvY3JfcmVjdmQgJj0gfk1NQ19PQ1JfUkVHX0FDQ0VTU19NT0RFX01BU0s7CisJfSBlbHNlIHsKKwkJaWYgKChvY3JfcmVjdmQgJiBNTUNfT0NSX1JFR19IT1NUX0NBUEFDSVRZX1NVUFBPUlRfTUFTSykKKwkJICAgID09IE1NQ19PQ1JfUkVHX0hPU1RfQ0FQQUNJVFlfU1VQUE9SVF9TRUNUT1IpIHsKKwkJCW1tY19jYXJkX2N1ci0+bW9kZSA9IFNFQ1RPUl9NT0RFOworCQl9IGVsc2UgeworCQkJbW1jX2NhcmRfY3VyLT5tb2RlID0gQllURV9NT0RFOworCQl9CisJCW9jcl9yZWN2ZCAmPSB+TU1DX09DUl9SRUdfSE9TVF9DQVBBQ0lUWV9TVVBQT1JUX01BU0s7CisJfQorCisJb2NyX3JlY3ZkICY9IH4oMHgxIDw8IDMxKTsKKwlpZiAoIShvY3JfcmVjdmQgJiBvY3JfdmFsdWUpKQorCQlyZXR1cm4gMDsKKworCWVyciA9IG1tY19zZW5kX2NtZChNTUNfQ01EMiwgYXJndW1lbnQsIHJlc3ApOworCWlmIChlcnIgIT0gMSkKKwkJcmV0dXJuIGVycjsKKworCWlmIChtbWNfY2FyZF9jdXItPmNhcmRfdHlwZSA9PSBNTUNfQ0FSRCkgeworCQlhcmd1bWVudCA9IG1tY19jYXJkX2N1ci0+UkNBIDw8IDE2OworCQllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDMsIGFyZ3VtZW50LCByZXNwKTsKKwkJaWYgKGVyciAhPSAxKQorCQkJcmV0dXJuIGVycjsKKwl9IGVsc2UgeworCQlhcmd1bWVudCA9IDB4MDAwMDAwMDA7CisJCWVyciA9IG1tY19zZW5kX2NtZChNTUNfU0RDTUQzLCBhcmd1bWVudCwgcmVzcCk7CisJCWlmIChlcnIgIT0gMSkKKwkJCXJldHVybiBlcnI7CisKKwkJbW1jX2NhcmRfY3VyLT5SQ0EgPSAoKG1tY19yZXNwX3I2ICopIHJlc3ApLT5uZXdwdWJsaXNoZWRyY2E7CisJfQorCisJT01BUF9IU01NQ19DT04gJj0gfk9EOworCU9NQVBfSFNNTUNfQ09OIHw9IE5PT1BFTkRSQUlOOworCXJldHVybiAxOworfQorCit1bnNpZ25lZCBjaGFyIG1tY19yZWFkX2NhcmRzaXplKG1tY19jYXJkX2RhdGEgKm1tY19kZXZfZGF0YSwKKwkJCQltbWNfY3NkX3JlZ190ICpjdXJfY3NkKQoreworCW1tY19leHRlbmRlZF9jc2RfcmVnX3QgZXh0X2NzZDsKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgY291bnQsIGJsa19sZW4sIGJsa19ubywgY2FyZF9zaXplLCBhcmd1bWVudDsKKwl1bnNpZ25lZCBjaGFyIGVycjsKKwl1bnNpZ25lZCBpbnQgcmVzcFs0XTsKKworCWlmIChtbWNfZGV2X2RhdGEtPm1vZGUgPT0gU0VDVE9SX01PREUpIHsKKwkJaWYgKG1tY19kZXZfZGF0YS0+Y2FyZF90eXBlID09IFNEX0NBUkQpIHsKKwkJCWNhcmRfc2l6ZSA9CisJCQkgICAgKCgobW1jX3NkMl9jc2RfcmVnX3QgKikgY3VyX2NzZCktPgorCQkJICAgICBjX3NpemVfbHNiICYgTU1DX1NEMl9DU0RfQ19TSVpFX0xTQl9NQVNLKSB8CisJCQkgICAgKCgoKG1tY19zZDJfY3NkX3JlZ190ICopIGN1cl9jc2QpLT4KKwkJCSAgICAgIGNfc2l6ZV9tc2IgJiBNTUNfU0QyX0NTRF9DX1NJWkVfTVNCX01BU0spCisJCQkgICAgIDw8IE1NQ19TRDJfQ1NEX0NfU0laRV9NU0JfT0ZGU0VUKTsKKwkJCW1tY19kZXZfZGF0YS0+c2l6ZSA9IGNhcmRfc2l6ZSAqIDEwMjQ7CisJCQlpZiAobW1jX2Rldl9kYXRhLT5zaXplID09IDApCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlhcmd1bWVudCA9IDB4MDAwMDAwMDA7CisJCQllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDgsIGFyZ3VtZW50LCByZXNwKTsKKwkJCWlmIChlcnIgIT0gMSkKKwkJCQlyZXR1cm4gZXJyOworCQkJZXJyID0gbW1jX3JlYWRfZGF0YSgodW5zaWduZWQgaW50ICopJmV4dF9jc2QpOworCQkJaWYgKGVyciAhPSAxKQorCQkJCXJldHVybiBlcnI7CisJCQltbWNfZGV2X2RhdGEtPnNpemUgPSBleHRfY3NkLnNlY3RvcmNvdW50OworCisJCQlpZiAobW1jX2Rldl9kYXRhLT5zaXplID09IDApCisJCQkJbW1jX2Rldl9kYXRhLT5zaXplID0gODM4ODYwODsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChjdXJfY3NkLT5jX3NpemVfbXVsdCA+PSA4KQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGN1cl9jc2QtPnJlYWRfYmxfbGVuID49IDEyKQorCQkJcmV0dXJuIDA7CisKKwkJLyogQ29tcHV0ZSBzaXplICovCisJCWNvdW50ID0gMSA8PCAoY3VyX2NzZC0+Y19zaXplX211bHQgKyAyKTsKKwkJY2FyZF9zaXplID0gKGN1cl9jc2QtPmNfc2l6ZV9sc2IgJiBNTUNfQ1NEX0NfU0laRV9MU0JfTUFTSykgfAorCQkgICAgKChjdXJfY3NkLT5jX3NpemVfbXNiICYgTU1DX0NTRF9DX1NJWkVfTVNCX01BU0spCisJCSAgICAgPDwgTU1DX0NTRF9DX1NJWkVfTVNCX09GRlNFVCk7CisKKwkJYmxrX25vID0gKGNhcmRfc2l6ZSArIDEpICogY291bnQ7CisJCWJsa19sZW4gPSAxIDw8IGN1cl9jc2QtPnJlYWRfYmxfbGVuOworCQlzaXplID0gYmxrX25vICogYmxrX2xlbjsKKworCQltbWNfZGV2X2RhdGEtPnNpemUgPSBzaXplIC8gTU1DU0RfU0VDVE9SX1NJWkU7CisJCWlmIChtbWNfZGV2X2RhdGEtPnNpemUgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgY2hhciBvbWFwX21tY19yZWFkX3NlY3QodW5zaWduZWQgaW50IHN0YXJ0X3NlYywgdW5zaWduZWQgaW50IG51bV9ieXRlcywKKwkJCQkgbW1jX2NhcmRfZGF0YSAqbW1jX2MsCisJCQkJIHVuc2lnbmVkIGludCAqb3V0cHV0X2J1ZikKK3sKKwl1bnNpZ25lZCBjaGFyIGVycjsKKwl1bnNpZ25lZCBpbnQgYXJndW1lbnQ7CisJdW5zaWduZWQgaW50IHJlc3BbNF07CisJdW5zaWduZWQgaW50IG51bV9zZWNfdmFsID0KKwkgICAgKG51bV9ieXRlcyArIChNTUNTRF9TRUNUT1JfU0laRSAtIDEpKSAvIE1NQ1NEX1NFQ1RPUl9TSVpFOworCXVuc2lnbmVkIGludCBzZWNfaW5jX3ZhbDsKKworCWlmIChudW1fc2VjX3ZhbCA9PSAwKQorCQlyZXR1cm4gMTsKKworCWlmIChtbWNfYy0+bW9kZSA9PSBTRUNUT1JfTU9ERSkgeworCQlhcmd1bWVudCA9IHN0YXJ0X3NlYzsKKwkJc2VjX2luY192YWwgPSAxOworCX0gZWxzZSB7CisJCWFyZ3VtZW50ID0gc3RhcnRfc2VjICogTU1DU0RfU0VDVE9SX1NJWkU7CisJCXNlY19pbmNfdmFsID0gTU1DU0RfU0VDVE9SX1NJWkU7CisJfQorCisJd2hpbGUgKG51bV9zZWNfdmFsKSB7CisJCWVyciA9IG1tY19zZW5kX2NtZChNTUNfQ01EMTcsIGFyZ3VtZW50LCByZXNwKTsKKwkJaWYgKGVyciAhPSAxKQorCQkJcmV0dXJuIGVycjsKKworCisJCWVyciA9IG1tY19yZWFkX2RhdGEob3V0cHV0X2J1Zik7CisJCWlmIChlcnIgIT0gMSkKKwkJCXJldHVybiBlcnI7CisKKwkJb3V0cHV0X2J1ZiArPSAoTU1DU0RfU0VDVE9SX1NJWkUgLyA0KTsKKwkJYXJndW1lbnQgKz0gc2VjX2luY192YWw7CisJCW51bV9zZWNfdmFsLS07CisJfQorCXJldHVybiAxOworfQorCit1bnNpZ25lZCBjaGFyIGNvbmZpZ3VyZV9tbWMobW1jX2NhcmRfZGF0YSAqbW1jX2NhcmRfY3VyKQoreworCXVuc2lnbmVkIGNoYXIgcmV0X3ZhbDsKKwl1bnNpZ25lZCBpbnQgYXJndW1lbnQ7CisJdW5zaWduZWQgaW50IHJlc3BbNF07CisJdW5zaWduZWQgaW50IHRyYW5zX2ZhY3QsIHRyYW5zX3VuaXQsIHJldHJpZXMgPSAyOworCXVuc2lnbmVkIGludCBtYXhfZHRyOworCWludCBkc29yOworCXZvbGF0aWxlIG1tY19jc2RfcmVnX3QgQ2FyZF9DU0Q7CisJdW5zaWduZWQgY2hhciB0cmFuc19zcGVlZDsKKworCW1tY19pbml0X3NldHVwKCk7CisKKwlkbyB7CisJCXJldF92YWwgPSBtbWNfZGV0ZWN0X2NhcmQobW1jX2NhcmRfY3VyKTsKKwkJcmV0cmllcy0tOworCX0gd2hpbGUgKChyZXRyaWVzID4gMCkgJiYgKHJldF92YWwgIT0gMSkpOworCisJYXJndW1lbnQgPSBtbWNfY2FyZF9jdXItPlJDQSA8PCAxNjsKKwlyZXRfdmFsID0gbW1jX3NlbmRfY21kKE1NQ19DTUQ5LCBhcmd1bWVudCwgcmVzcCk7CisJaWYgKHJldF92YWwgIT0gMSkKKwkJcmV0dXJuIHJldF92YWw7CisKKwkoKHVuc2lnbmVkIGludCAqKSZDYXJkX0NTRClbM10gPSByZXNwWzNdOworCSgodW5zaWduZWQgaW50ICopJkNhcmRfQ1NEKVsyXSA9IHJlc3BbMl07CisJKCh1bnNpZ25lZCBpbnQgKikmQ2FyZF9DU0QpWzFdID0gcmVzcFsxXTsKKwkoKHVuc2lnbmVkIGludCAqKSZDYXJkX0NTRClbMF0gPSByZXNwWzBdOworCisJaWYgKG1tY19jYXJkX2N1ci0+Y2FyZF90eXBlID09IE1NQ19DQVJEKQorCQltbWNfY2FyZF9jdXItPnZlcnNpb24gPSBDYXJkX0NTRC5zcGVjX3ZlcnM7CisKKwl0cmFuc19zcGVlZCA9IENhcmRfQ1NELnRyYW5fc3BlZWQ7CisKKwlyZXRfdmFsID0gbW1jX3NlbmRfY21kKE1NQ19DTUQ0LCBNTUNfRFNSX0RFRkFVTFQgPDwgMTYsIHJlc3ApOworCWlmIChyZXRfdmFsICE9IDEpCisJCXJldHVybiByZXRfdmFsOworCisJdHJhbnNfdW5pdCA9IHRyYW5zX3NwZWVkICYgTU1DX0NTRF9UUkFOX1NQRUVEX1VOSVRfTUFTSzsKKwl0cmFuc19mYWN0ID0gdHJhbnNfc3BlZWQgJiBNTUNfQ1NEX1RSQU5fU1BFRURfRkFDVE9SX01BU0s7CisKKwlpZiAodHJhbnNfdW5pdCA+IE1NQ19DU0RfVFJBTl9TUEVFRF9VTklUXzEwME1IWikKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHRyYW5zX2ZhY3QgPCBNTUNfQ1NEX1RSQU5fU1BFRURfRkFDVE9SXzFfMCkgfHwKKwkgICAgKHRyYW5zX2ZhY3QgPiBNTUNfQ1NEX1RSQU5fU1BFRURfRkFDVE9SXzhfMCkpCisJCXJldHVybiAwOworCisJdHJhbnNfdW5pdCA+Pj0gMDsKKwl0cmFuc19mYWN0ID4+PSAzOworCisJbWF4X2R0ciA9IHRyYW5fZXhwW3RyYW5zX3VuaXRdICogdHJhbl9tYW50W3RyYW5zX2ZhY3RdOworCWRzb3IgPSBPTUFQX01NQ19NQVNURVJfQ0xPQ0sgLyBtYXhfZHRyOworCisJaWYgKGRzb3IgPT0gNCkKKwkJZHNvciA9IDU7CisJaWYgKGRzb3IgPT0gMykKKwkJZHNvciA9IDQ7CisKKwlyZXRfdmFsID0gbW1jX2Nsb2NrX2NvbmZpZyhDTEtfTUlTQywgZHNvcik7CisJaWYgKHJldF92YWwgIT0gMSkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlhcmd1bWVudCA9IG1tY19jYXJkX2N1ci0+UkNBIDw8IDE2OworCXJldF92YWwgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDdfU0VMRUNULCBhcmd1bWVudCwgcmVzcCk7CisJaWYgKHJldF92YWwgIT0gMSkKKwkJcmV0dXJuIHJldF92YWw7CisKKwkvKiBDb25maWd1cmUgdGhlIGJsb2NrIGxlbmd0aCB0byA1MTIgYnl0ZXMgKi8KKwlhcmd1bWVudCA9IE1NQ1NEX1NFQ1RPUl9TSVpFOworCXJldF92YWwgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDE2LCBhcmd1bWVudCwgcmVzcCk7CisJaWYgKHJldF92YWwgIT0gMSkKKwkJcmV0dXJuIHJldF92YWw7CisKKwkvKiBnZXQgdGhlIGNhcmQgc2l6ZSBpbiBzZWN0b3JzICovCisJcmV0X3ZhbCA9IG1tY19yZWFkX2NhcmRzaXplKG1tY19jYXJkX2N1ciwgKG1tY19jc2RfcmVnX3QgKikmQ2FyZF9DU0QpOworCWlmIChyZXRfdmFsICE9IDEpCisJCXJldHVybiByZXRfdmFsOworCisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbW1jX2JyZWFkKGludCBkZXZfbnVtLCB1bG9uZyBibGtuciwgdWxvbmcgYmxrY250LCB1bG9uZyAqZHN0KQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCXJldCA9IG9tYXBfbW1jX3JlYWRfc2VjdChibGtuciwgKGJsa2NudCAqIE1NQ1NEX1NFQ1RPUl9TSVpFKSwKKwkJCSZjdXJfY2FyZF9kYXRhLCAodW5zaWduZWQgaW50ICopZHN0KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbW1jX2luaXQoaW50IHZlcmJvc2UpCit7CisJdW5zaWduZWQgY2hhciByZXQgPSAwOworCisJcmV0ID0gY29uZmlndXJlX21tYygmY3VyX2NhcmRfZGF0YSk7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gMDsKKworCW1tY19ibGtfZGV2LmlmX3R5cGUgPSBJRl9UWVBFX01NQzsKKwltbWNfYmxrX2Rldi5wYXJ0X3R5cGUgPSBQQVJUX1RZUEVfRE9TOworCW1tY19ibGtfZGV2LmRldiA9IDA7CisJbW1jX2Jsa19kZXYubHVuID0gMDsKKwltbWNfYmxrX2Rldi50eXBlID0gMDsKKworCS8qIEZJWE1FIGZpbGwgaW4gdGhlIGNvcnJlY3Qgc2l6ZSAoaXMgc2V0IHRvIDMyTUJ5dGUpICovCisJbW1jX2Jsa19kZXYuYmxrc3ogPSBNTUNTRF9TRUNUT1JfU0laRTsKKwltbWNfYmxrX2Rldi5sYmEgPSAweDEwMDAwOworCW1tY19ibGtfZGV2LnJlbW92YWJsZSA9IDA7CisJbW1jX2Jsa19kZXYuYmxvY2tfcmVhZCA9IG1tY19icmVhZDsKKworCWZhdF9yZWdpc3Rlcl9kZXZpY2UoJm1tY19ibGtfZGV2LCAxKTsKKworCXJldHVybiAxOworfQorCitpbnQgbW1jX3JlYWQodW5zaWduZWQgaW50IHNyYywgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc2l6ZSkKK3sKKwkvKgorCSAqIE5PVCBJbXBsZW1lbnRlZAorCSAqLworCXJldHVybiAwOworfQoraW50IG1tY193cml0ZSh1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGxvbmcgZHN0LCBpbnQgc2l6ZSkKK3sKKwkvKgorCSAqIE5PVCBJbXBsZW1lbnRlZAorCSAqLworCXJldHVybiAwOworfQorCitpbnQgbW1jMmluZm8odW5zaWduZWQgaW50IGFkZHIpCit7CisJLyoKKwkgKiBOT1QgSW1wbGVtZW50ZWQKKwkgKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvb21hcDMvbW1jX2hvc3RfZGVmLmggYi94LWxvYWRlci9jcHUvb21hcDMvbW1jX2hvc3RfZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTUyNmY5MQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9tbWNfaG9zdF9kZWYuaApAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogU3llZCBNb2hhbW1lZCBLaGFzaW0gPGtoYXNpbUB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ3MgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBNTUNfSE9TVF9ERUZJTklUSU9OU19ICisjZGVmaW5lIE1NQ19IT1NUX0RFRklOSVRJT05TX0gKKworLyoKKyAqIE9NQVAgSFNNTUMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBPTUFQX0hTTU1DX1NZU0NPTkZJRwkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzAxMCkKKyNkZWZpbmUgT01BUF9IU01NQ19TWVNTVEFUVVMJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMwMTQpCisjZGVmaW5lIE9NQVBfSFNNTUNfQ09OCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMwMkMpCisjZGVmaW5lIE9NQVBfSFNNTUNfQkxLCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMDQpCisjZGVmaW5lIE9NQVBfSFNNTUNfQVJHCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMDgpCisjZGVmaW5lIE9NQVBfSFNNTUNfQ01ECQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMEMpCisjZGVmaW5lIE9NQVBfSFNNTUNfUlNQMTAJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTEwKQorI2RlZmluZSBPTUFQX0hTTU1DX1JTUDMyCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzExNCkKKyNkZWZpbmUgT01BUF9IU01NQ19SU1A1NAkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMTgpCisjZGVmaW5lIE9NQVBfSFNNTUNfUlNQNzYJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTFDKQorI2RlZmluZSBPTUFQX0hTTU1DX0RBVEEJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzEyMCkKKyNkZWZpbmUgT01BUF9IU01NQ19QU1RBVEUJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTI0KQorI2RlZmluZSBPTUFQX0hTTU1DX0hDVEwJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzEyOCkKKyNkZWZpbmUgT01BUF9IU01NQ19TWVNDVEwJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTJDKQorI2RlZmluZSBPTUFQX0hTTU1DX1NUQVQJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzEzMCkKKyNkZWZpbmUgT01BUF9IU01NQ19JRQkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTM0KQorI2RlZmluZSBPTUFQX0hTTU1DX0NBUEEJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzE0MCkKKworLyogVDIgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQ09OVFJPTF9ERVZfQ09ORjAJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDAyMjc0KQorI2RlZmluZSBDT05UUk9MX1BCSUFTX0xJVEUJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDAyNTIwKQorCisvKgorICogT01BUCBIUyBNTUMgQml0IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTU1DX1NPRlRSRVNFVAkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJFU0VURE9ORQkJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBOT09QRU5EUkFJTgkJCQkJKDB4MCA8PCAwKQorI2RlZmluZSBPUEVORFJBSU4JCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgT0QJCQkJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBJTklUX05PSU5JVAkJCQkJKDB4MCA8PCAxKQorI2RlZmluZSBJTklUX0lOSVRTVFJFQU0JCQkJKDB4MSA8PCAxKQorI2RlZmluZSBIUl9OT0hPU1RSRVNQCQkJCSgweDAgPDwgMikKKyNkZWZpbmUgU1RSX0JMT0NLIAkJCQkJKDB4MCA8PCAzKQorI2RlZmluZSBNT0RFX0ZVTkMJCQkJCSgweDAgPDwgNCkKKyNkZWZpbmUgRFc4XzFfNEJJVE1PREUgCQkJCSgweDAgPDwgNSkKKyNkZWZpbmUgTUlUX0NUTwkJCQkJCSgweDAgPDwgNikKKyNkZWZpbmUgQ0RQX0FDVElWRUhJR0gJCQkJKDB4MCA8PCA3KQorI2RlZmluZSBXUFBfQUNUSVZFSElHSCAJCQkJKDB4MCA8PCA4KQorI2RlZmluZSBSRVNFUlZFRF9NQVNLCQkJCSgweDMgPDwgOSkKKyNkZWZpbmUgQ1RQTF9NTUNfU0QgCQkJCSgweDAgPDwgMTEpCisjZGVmaW5lIEJMRU5fNTEyQllURVNMRU4JCQkoMHgyMDAgPDwgMCkKKyNkZWZpbmUgTkJMS19TVFBDTlQJCQkJCSgweDAgPDwgMTYpCisjZGVmaW5lIERFX0RJU0FCTEUJCQkJCSgweDAgPDwgMCkKKyNkZWZpbmUgQkNFX0RJU0FCTEUJCQkJCSgweDAgPDwgMSkKKyNkZWZpbmUgQUNFTl9ESVNBQkxFCQkJCSgweDAgPDwgMikKKyNkZWZpbmUgRERJUl9PRkZTRVQJCQkJCSg0KQorI2RlZmluZSBERElSX01BU0sJCQkJCSgweDEgPDwgNCkKKyNkZWZpbmUgRERJUl9XUklURQkJCQkJKDB4MCA8PCA0KQorI2RlZmluZSBERElSX1JFQUQJCQkJCSgweDEgPDwgNCkKKyNkZWZpbmUgTVNCU19TR0xFQkxLCQkJCSgweDAgPDwgNSkKKyNkZWZpbmUgUlNQX1RZUEVfT0ZGU0VUCQkJCSgxNikKKyNkZWZpbmUgUlNQX1RZUEVfTUFTSwkJCQkoMHgzIDw8IDE2KQorI2RlZmluZSBSU1BfVFlQRV9OT1JTUAkJCQkoMHgwIDw8IDE2KQorI2RlZmluZSBSU1BfVFlQRV9MR0hUMTM2CQkJKDB4MSA8PCAxNikKKyNkZWZpbmUgUlNQX1RZUEVfTEdIVDQ4CQkJCSgweDIgPDwgMTYpCisjZGVmaW5lIFJTUF9UWVBFX0xHSFQ0OEIJCQkoMHgzIDw8IDE2KQorI2RlZmluZSBDQ0NFX05PQ0hFQ0sJCQkJKDB4MCA8PCAxOSkKKyNkZWZpbmUgQ0NDRV9DSEVDSwkJCQkJKDB4MSA8PCAxOSkKKyNkZWZpbmUgQ0lDRV9OT0NIRUNLCQkJCSgweDAgPDwgMjApCisjZGVmaW5lIENJQ0VfQ0hFQ0sJCQkJCSgweDEgPDwgMjApCisjZGVmaW5lIERQX09GRlNFVAkJCQkJKDIxKQorI2RlZmluZSBEUF9NQVNLCQkJCQkJKDB4MSA8PCAyMSkKKyNkZWZpbmUgRFBfTk9fREFUQQkJCQkJKDB4MCA8PCAyMSkKKyNkZWZpbmUgRFBfREFUQQkJCQkJCSgweDEgPDwgMjEpCisjZGVmaW5lIENNRF9UWVBFX05PUk1BTAkJCQkoMHgwIDw8IDIyKQorI2RlZmluZSBJTkRFWF9PRkZTRVQJCQkJKDI0KQorI2RlZmluZSBJTkRFWF9NQVNLCQkJCQkoMHgzZiA8PCAyNCkKKyNkZWZpbmUgSU5ERVgoaSkJCQkJCShpIDw8IDI0KQorI2RlZmluZSBEQVRJX01BU0sJCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgREFUSV9DTURESVMJCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgRFRXXzFfQklUTU9ERQkJCQkoMHgwIDw8IDEpCisjZGVmaW5lIERUV180X0JJVE1PREUJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBTREJQX1BXUk9GRgkJCQkJKDB4MCA8PCA4KQorI2RlZmluZSBTREJQX1BXUk9OCQkJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFNEVlNfMVY4CQkJCQkoMHg1IDw8IDkpCisjZGVmaW5lIFNEVlNfM1YwCQkJCQkoMHg2IDw8IDkpCisjZGVmaW5lIElDRV9NQVNLCQkJCQkoMHgxIDw8IDApCisjZGVmaW5lIElDRV9TVE9QCQkJCQkoMHgwIDw8IDApCisjZGVmaW5lIElDU19NQVNLCQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIElDU19OT1RSRUFEWQkJCQkoMHgwIDw8IDEpCisjZGVmaW5lIElDRV9PU0NJTExBVEUJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBDRU5fTUFTSwkJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBDRU5fRElTQUJMRQkJCQkJKDB4MCA8PCAyKQorI2RlZmluZSBDRU5fRU5BQkxFCQkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIENMS0RfT0ZGU0VUCQkJCQkoNikKKyNkZWZpbmUgQ0xLRF9NQVNLCQkJCQkoMHgzRkYgPDwgNikKKyNkZWZpbmUgRFRPX01BU0sJCQkJCSgweEYgPDwgMTYpCisjZGVmaW5lIERUT18xNVRIRFRPCQkJCQkoMHhFIDw8IDE2KQorI2RlZmluZSBTT0ZUUkVTRVRBTEwJCQkJKDB4MSA8PCAyNCkKKyNkZWZpbmUgQ0NfTUFTSwkJCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgVENfTUFTSwkJCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgQldSX01BU0sJCQkJCSgweDEgPDwgNCkKKyNkZWZpbmUgQlJSX01BU0sJCQkJCSgweDEgPDwgNSkKKyNkZWZpbmUgRVJSSV9NQVNLCQkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBJRV9DQwkJCQkJCSgweDAxIDw8IDApCisjZGVmaW5lIElFX1RDCQkJCQkJKDB4MDEgPDwgMSkKKyNkZWZpbmUgSUVfQldSCQkJCQkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgSUVfQlJSCQkJCQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgSUVfQ1RPCQkJCQkJKDB4MDEgPDwgMTYpCisjZGVmaW5lIElFX0NDUkMJCQkJCQkoMHgwMSA8PCAxNykKKyNkZWZpbmUgSUVfQ0VCCQkJCQkJKDB4MDEgPDwgMTgpCisjZGVmaW5lIElFX0NJRQkJCQkJCSgweDAxIDw8IDE5KQorI2RlZmluZSBJRV9EVE8JCQkJCQkoMHgwMSA8PCAyMCkKKyNkZWZpbmUgSUVfRENSQwkJCQkJCSgweDAxIDw8IDIxKQorI2RlZmluZSBJRV9ERUIJCQkJCQkoMHgwMSA8PCAyMikKKyNkZWZpbmUgSUVfQ0VSUgkJCQkJCSgweDAxIDw8IDI4KQorI2RlZmluZSBJRV9CQURBCQkJCQkJKDB4MDEgPDwgMjkpCisKKyNkZWZpbmUgVlMzMF8zVjBTVVAJCQkJCSgxIDw8IDI1KQorI2RlZmluZSBWUzE4XzFWOFNVUAkJCQkJKDEgPDwgMjYpCisKKy8qIERyaXZlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBNTUNTRF9TRUNUT1JfU0laRQkJKDUxMikKKyNkZWZpbmUgTU1DX0NBUkQJCQkJMAorI2RlZmluZSBTRF9DQVJECQkJCQkxCisjZGVmaW5lIEJZVEVfTU9ERQkJCQkwCisjZGVmaW5lIFNFQ1RPUl9NT0RFCQkJCTEKKyNkZWZpbmUgQ0xLX0lOSVRTRVEJCQkJMAorI2RlZmluZSBDTEtfNDAwS0haCQkJCTEKKyNkZWZpbmUgQ0xLX01JU0MJCQkJMgorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGNhcmRfdHlwZTsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgUkNBOworfSBtbWNfY2FyZF9kYXRhOworCisjZGVmaW5lIG1tY19yZWdfb3V0KGFkZHIsIG1hc2ssIHZhbCkgXAorCShhZGRyKSA9ICgoKGFkZHIpKSAmICh+KG1hc2spKSApIHwgKCAodmFsKSAmIChtYXNrKSk7CisKKyNlbmRpZgkJCQkvKiBNTUNfSE9TVF9ERUZJTklUSU9OU19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvb21hcDMvbW1jX3Byb3RvY29sLmggYi94LWxvYWRlci9jcHUvb21hcDMvbW1jX3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTA3ZWIyYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9tbWNfcHJvdG9jb2wuaApAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogU3llZCBNb2hhbW1lZCBLaGFzaW0gPGtoYXNpbUB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ3MgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBNTUNfUFJPVE9DT0xfSAorI2RlZmluZSBNTUNfUFJPVE9DT0xfSAorCisjaW5jbHVkZSAibW1jX2hvc3RfZGVmLmgiCisKKy8qIFJlc3BvbnNlcyAqLworI2RlZmluZSBSU1BfVFlQRV9OT05FCShSU1BfVFlQRV9OT1JTUCAgIHwgQ0NDRV9OT0NIRUNLIHwgQ0lDRV9OT0NIRUNLKQorI2RlZmluZSBSU1BfVFlQRV9SMQkJKFJTUF9UWVBFX0xHSFQ0OCAgfCBDQ0NFX0NIRUNLICAgfCBDSUNFX0NIRUNLKQorI2RlZmluZSBSU1BfVFlQRV9SMUIJKFJTUF9UWVBFX0xHSFQ0OEIgfCBDQ0NFX0NIRUNLICAgfCBDSUNFX0NIRUNLKQorI2RlZmluZSBSU1BfVFlQRV9SMgkJKFJTUF9UWVBFX0xHSFQxMzYgfCBDQ0NFX0NIRUNLICAgfCBDSUNFX05PQ0hFQ0spCisjZGVmaW5lIFJTUF9UWVBFX1IzCQkoUlNQX1RZUEVfTEdIVDQ4ICB8IENDQ0VfTk9DSEVDSyB8IENJQ0VfTk9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjQJCShSU1BfVFlQRV9MR0hUNDggIHwgQ0NDRV9OT0NIRUNLIHwgQ0lDRV9OT0NIRUNLKQorI2RlZmluZSBSU1BfVFlQRV9SNQkJKFJTUF9UWVBFX0xHSFQ0OCAgfCBDQ0NFX0NIRUNLICAgfCBDSUNFX0NIRUNLKQorI2RlZmluZSBSU1BfVFlQRV9SNgkJKFJTUF9UWVBFX0xHSFQ0OCAgfCBDQ0NFX0NIRUNLICAgfCBDSUNFX0NIRUNLKQorI2RlZmluZSBSU1BfVFlQRV9SNyAgICAgKFJTUF9UWVBFX0xHSFQ0OCAgfCBDQ0NFX0NIRUNLICAgfCBDSUNFX0NIRUNLKQorCisvKiBBbGwgc3VwcG9ydGVkIGNvbW1hbmRzICovCisjZGVmaW5lIE1NQ19DTUQwCShJTkRFWCgwKSAgfCBSU1BfVFlQRV9OT05FIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQxCShJTkRFWCgxKSAgfCBSU1BfVFlQRV9SMyAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQyCShJTkRFWCgyKSAgfCBSU1BfVFlQRV9SMiAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQzCShJTkRFWCgzKSAgfCBSU1BfVFlQRV9SMSAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19TRENNRDMJKElOREVYKDMpICB8IFJTUF9UWVBFX1I2ICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDQJKElOREVYKDQpICB8IFJTUF9UWVBFX05PTkUgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDYJKElOREVYKDYpICB8IFJTUF9UWVBFX1IxQiAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDdfU0VMRUNUCShJTkRFWCg3KSAgfCBSU1BfVFlQRV9SMUIgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQ3X0RFU0VMRUNUIFwKKwkoSU5ERVgoNykgIHwgUlNQX1RZUEVfTk9ORSB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EOAkoSU5ERVgoOCkgIHwgUlNQX1RZUEVfUjEgICB8IERQX0RBVEEgICAgfCBERElSX1JFQUQpCisjZGVmaW5lIE1NQ19TRENNRDgJKElOREVYKDgpICB8IFJTUF9UWVBFX1I3ICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDkJKElOREVYKDkpICB8IFJTUF9UWVBFX1IyICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDEyCShJTkRFWCgxMikgfCBSU1BfVFlQRV9SMUIgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQxMwkoSU5ERVgoMTMpIHwgUlNQX1RZUEVfUjEgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMTUJKElOREVYKDE1KSB8IFJTUF9UWVBFX05PTkUgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDE2CShJTkRFWCgxNikgfCBSU1BfVFlQRV9SMSAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQxNwkoSU5ERVgoMTcpIHwgUlNQX1RZUEVfUjEgICB8IERQX0RBVEEgICAgfCBERElSX1JFQUQpCisjZGVmaW5lIE1NQ19DTUQyNAkoSU5ERVgoMjQpIHwgUlNQX1RZUEVfUjEgICB8IERQX0RBVEEgICAgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQUNNRDYJKElOREVYKDYpICB8IFJTUF9UWVBFX1IxICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0FDTUQ0MQkoSU5ERVgoNDEpIHwgUlNQX1RZUEVfUjMgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQUNNRDUxCShJTkRFWCg1MSkgfCBSU1BfVFlQRV9SMSAgIHwgRFBfREFUQSAgICB8IERESVJfUkVBRCkKKyNkZWZpbmUgTU1DX0NNRDU1CShJTkRFWCg1NSkgfCBSU1BfVFlQRV9SMSAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisKKyNkZWZpbmUgTU1DX0FDX0NNRF9SQ0FfTUFTSyAgICAgKHVuc2lnbmVkIGludCkoMHhGRkZGIDw8IDE2KQorI2RlZmluZSBNTUNfQkNfQ01EX0RTUl9NQVNLICAgICAodW5zaWduZWQgaW50KSgweEZGRkYgPDwgMTYpCisjZGVmaW5lIE1NQ19EU1JfREVGQVVMVCAgICAgICAgICgweDA0MDQpCisjZGVmaW5lIFNEX0NNRDhfQ0hFQ0tfUEFUVEVSTiAgICAgICAoMHhBQSkKKyNkZWZpbmUgU0RfQ01EOF8yXzdfM182X1ZfUkFOR0UgICAgICgweDAxIDw8IDgpCisKKy8qIENsb2NrIENvbmZpZ3VyYXRpb25zIGFuZCBNYWNyb3MgKi8KKworI2RlZmluZSBNTUNfQ0xPQ0tfUkVGRVJFTkNFCQkoOTYpCisjZGVmaW5lIE1NQ19SRUxBVElWRV9DQVJEX0FERFJFU1MJKDB4MTIzNCkKKyNkZWZpbmUgTU1DX0lOSVRfU0VRX0NMSwkJKE1NQ19DTE9DS19SRUZFUkVOQ0UgKiAxMDAwIC8gODApCisjZGVmaW5lIE1NQ180MDBrSHpfQ0xLCQkJKE1NQ19DTE9DS19SRUZFUkVOQ0UgKiAxMDAwIC8gNDAwKQorI2RlZmluZSBDTEtEUihyLCBmLCB1KQkJCSgoKChyKSoxMDApIC8gKChmKSoodSkpKSArIDEpCisjZGVmaW5lIENMS0QoZiwgdSkJCQkoQ0xLRFIoTU1DX0NMT0NLX1JFRkVSRU5DRSwgZiwgdSkpCisKKyNkZWZpbmUgTU1DX09DUl9SRUdfQUNDRVNTX01PREVfTUFTSwkoMHgzIDw8IDI5KQorI2RlZmluZSBNTUNfT0NSX1JFR19BQ0NFU1NfTU9ERV9CWVRFICAgICgweDAgPDwgMjkpCisjZGVmaW5lIE1NQ19PQ1JfUkVHX0FDQ0VTU19NT0RFX1NFQ1RPUiAgKDB4MiA8PCAyOSkKKworI2RlZmluZSBNTUNfT0NSX1JFR19IT1NUX0NBUEFDSVRZX1NVUFBPUlRfTUFTSwkJKDB4MSA8PCAzMCkKKyNkZWZpbmUgTU1DX09DUl9SRUdfSE9TVF9DQVBBQ0lUWV9TVVBQT1JUX0JZVEUJCSgweDAgPDwgMzApCisjZGVmaW5lIE1NQ19PQ1JfUkVHX0hPU1RfQ0FQQUNJVFlfU1VQUE9SVF9TRUNUT1IJKDB4MSA8PCAzMCkKKworI2RlZmluZSBNTUNfU0QyX0NTRF9DX1NJWkVfTFNCX01BU0sgICAgICAgICAoMHhGRkZGKQorI2RlZmluZSBNTUNfU0QyX0NTRF9DX1NJWkVfTVNCX01BU0sgICAgICAgICAoMHgwMDNGKQorI2RlZmluZSBNTUNfU0QyX0NTRF9DX1NJWkVfTVNCX09GRlNFVCAgICAgICAoMTYpCisjZGVmaW5lIE1NQ19DU0RfQ19TSVpFX0xTQl9NQVNLICAgICAgICAgICAgICgweDAwMDMpCisjZGVmaW5lIE1NQ19DU0RfQ19TSVpFX01TQl9NQVNLICAgICAgICAgICAgICgweDAzRkYpCisjZGVmaW5lIE1NQ19DU0RfQ19TSVpFX01TQl9PRkZTRVQgICAgICAgICAgICgyKQorCisjZGVmaW5lIE1NQ19DU0RfVFJBTl9TUEVFRF9VTklUX01BU0sgICAgICAgICgweDA3IDw8IDApCisjZGVmaW5lIE1NQ19DU0RfVFJBTl9TUEVFRF9GQUNUT1JfTUFTSyAgICAgICgweDBGIDw8IDMpCisjZGVmaW5lIE1NQ19DU0RfVFJBTl9TUEVFRF9VTklUXzEwME1IWiAgICAgICgweDMgPDwgMCkKKyNkZWZpbmUgTU1DX0NTRF9UUkFOX1NQRUVEX0ZBQ1RPUl8xXzAgICAgICAgKDB4MDEgPDwgMykKKyNkZWZpbmUgTU1DX0NTRF9UUkFOX1NQRUVEX0ZBQ1RPUl84XzAgICAgICAgKDB4MEYgPDwgMykKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0cmFuX2V4cFtdID0geworCTEwMDAwLCAgICAgICAgICAxMDAwMDAsICAgICAgICAgMTAwMDAwMCwgICAgICAgIDEwMDAwMDAwLAorCTAsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIDAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRyYW5fbWFudFtdID0geworCTAsICAgICAgMTAsICAgICAxMiwgICAgIDEzLCAgICAgMTUsICAgICAyMCwgICAgIDI1LCAgICAgMzAsCisJMzUsICAgICA0MCwgICAgIDQ1LCAgICAgNTAsICAgICA1NSwgICAgIDYwLCAgICAgNzAsICAgICA4MCwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBub3RfdXNlZDoxOworCXVuc2lnbmVkIGNyYzo3OworCXVuc2lnbmVkIGVjYzoyOworCXVuc2lnbmVkIGZpbGVfZm9ybWF0OjI7CisJdW5zaWduZWQgdG1wX3dyaXRlX3Byb3RlY3Q6MTsKKwl1bnNpZ25lZCBwZXJtX3dyaXRlX3Byb3RlY3Q6MTsKKwl1bnNpZ25lZCBjb3B5OjE7CisJdW5zaWduZWQgZmlsZV9mb3JtYXRfZ3JwOjE7CisJdW5zaWduZWQgY29udGVudF9wcm90X2FwcDoxOworCXVuc2lnbmVkIHJlc2VydmVkXzE6NDsKKwl1bnNpZ25lZCB3cml0ZV9ibF9wYXJ0aWFsOjE7CisJdW5zaWduZWQgd3JpdGVfYmxfbGVuOjQ7CisJdW5zaWduZWQgcjJ3X2ZhY3RvcjozOworCXVuc2lnbmVkIGRlZmF1bHRfZWNjOjI7CisJdW5zaWduZWQgd3BfZ3JwX2VuYWJsZToxOworCXVuc2lnbmVkIHdwX2dycF9zaXplOjU7CisJdW5zaWduZWQgZXJhc2VfZ3JwX211bHQ6NTsKKwl1bnNpZ25lZCBlcmFzZV9ncnBfc2l6ZTo1OworCXVuc2lnbmVkIGNfc2l6ZV9tdWx0OjM7CisJdW5zaWduZWQgdmRkX3dfY3Vycl9tYXg6MzsKKwl1bnNpZ25lZCB2ZGRfd19jdXJyX21pbjozOworCXVuc2lnbmVkIHZkZF9yX2N1cnJfbWF4OjM7CisJdW5zaWduZWQgdmRkX3JfY3Vycl9taW46MzsKKwl1bnNpZ25lZCBjX3NpemVfbHNiOjI7CisJdW5zaWduZWQgY19zaXplX21zYjoxMDsKKwl1bnNpZ25lZCByZXNlcnZlZF8yOjI7CisJdW5zaWduZWQgZHNyX2ltcDoxOworCXVuc2lnbmVkIHJlYWRfYmxrX21pc2FsaWduOjE7CisJdW5zaWduZWQgd3JpdGVfYmxrX21pc2FsaWduOjE7CisJdW5zaWduZWQgcmVhZF9ibF9wYXJ0aWFsOjE7CisJdW5zaWduZWQgcmVhZF9ibF9sZW46NDsKKwl1bnNpZ25lZCBjY2M6MTI7CisJdW5zaWduZWQgdHJhbl9zcGVlZDo4OworCXVuc2lnbmVkIG5zYWM6ODsKKwl1bnNpZ25lZCB0YWFjOjg7CisJdW5zaWduZWQgcmVzZXJ2ZWRfMzoyOworCXVuc2lnbmVkIHNwZWNfdmVyczo0OworCXVuc2lnbmVkIGNzZF9zdHJ1Y3R1cmU6MjsKK30gbW1jX2NzZF9yZWdfdDsKKworLyogY3NkIGZvciBzZDIuMCAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIG5vdF91c2VkOjE7CisJdW5zaWduZWQgY3JjOjc7CisJdW5zaWduZWQgcmVzZXJ2ZWRfMToyOworCXVuc2lnbmVkIGZpbGVfZm9ybWF0OjI7CisJdW5zaWduZWQgdG1wX3dyaXRlX3Byb3RlY3Q6MTsKKwl1bnNpZ25lZCBwZXJtX3dyaXRlX3Byb3RlY3Q6MTsKKwl1bnNpZ25lZCBjb3B5OjE7CisJdW5zaWduZWQgZmlsZV9mb3JtYXRfZ3JwOjE7CisJdW5zaWduZWQgcmVzZXJ2ZWRfMjo1OworCXVuc2lnbmVkIHdyaXRlX2JsX3BhcnRpYWw6MTsKKwl1bnNpZ25lZCB3cml0ZV9ibF9sZW46NDsKKwl1bnNpZ25lZCByMndfZmFjdG9yOjM7CisJdW5zaWduZWQgcmVzZXJ2ZWRfMzoyOworCXVuc2lnbmVkIHdwX2dycF9lbmFibGU6MTsKKwl1bnNpZ25lZCB3cF9ncnBfc2l6ZTo3OworCXVuc2lnbmVkIHNlY3Rvcl9zaXplOjc7CisJdW5zaWduZWQgZXJhc2VfYmxrX2xlbjoxOworCXVuc2lnbmVkIHJlc2VydmVkXzQ6MTsKKwl1bnNpZ25lZCBjX3NpemVfbHNiOjE2OworCXVuc2lnbmVkIGNfc2l6ZV9tc2I6NjsKKwl1bnNpZ25lZCByZXNlcnZlZF81OjY7CisJdW5zaWduZWQgZHNyX2ltcDoxOworCXVuc2lnbmVkIHJlYWRfYmxrX21pc2FsaWduOjE7CisJdW5zaWduZWQgd3JpdGVfYmxrX21pc2FsaWduOjE7CisJdW5zaWduZWQgcmVhZF9ibF9wYXJ0aWFsOjE7CisJdW5zaWduZWQgcmVhZF9ibF9sZW46NDsKKwl1bnNpZ25lZCBjY2M6MTI7CisJdW5zaWduZWQgdHJhbl9zcGVlZDo4OworCXVuc2lnbmVkIG5zYWM6ODsKKwl1bnNpZ25lZCB0YWFjOjg7CisJdW5zaWduZWQgcmVzZXJ2ZWRfNjo2OworCXVuc2lnbmVkIGNzZF9zdHJ1Y3R1cmU6MjsKK30gbW1jX3NkMl9jc2RfcmVnX3Q7CisKKy8qIGV4dGVuZGVkIGNzZCAtIDUxMiBieXRlcyBsb25nICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF8xWzE4MV07CisJdW5zaWduZWQgY2hhciBlcmFzZWRtZW1vcnljb250ZW50OworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfMjsKKwl1bnNpZ25lZCBjaGFyIGJ1c3dpZHRobW9kZTsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzM7CisJdW5zaWduZWQgY2hhciBoaWdoc3BlZWRpbnRlcmZhY2V0aW1pbmc7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF80OworCXVuc2lnbmVkIGNoYXIgcG93ZXJjbGFzczsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzU7CisJdW5zaWduZWQgY2hhciBjb21tYW5kc2V0cmV2aXNpb247CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF82OworCXVuc2lnbmVkIGNoYXIgY29tbWFuZHNldDsKKwl1bnNpZ25lZCBjaGFyIGV4dGVuZGVkY3NkcmV2aXNpb247CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF83OworCXVuc2lnbmVkIGNoYXIgY3Nkc3RydWN0dXJldmVyc2lvbjsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzg7CisJdW5zaWduZWQgY2hhciBjYXJkdHlwZTsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzlbM107CisJdW5zaWduZWQgY2hhciBwb3dlcmNsYXNzXzUybWh6XzFfOTV2OworCXVuc2lnbmVkIGNoYXIgcG93ZXJjbGFzc18yNm1oel8xXzk1djsKKwl1bnNpZ25lZCBjaGFyIHBvd2VyY2xhc3NfNTJtaHpfM182djsKKwl1bnNpZ25lZCBjaGFyIHBvd2VyY2xhc3NfMjZtaHpfM182djsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzEwOworCXVuc2lnbmVkIGNoYXIgbWlucmVhZHBlcmZfNGJfMjZtaHo7CisJdW5zaWduZWQgY2hhciBtaW53cml0ZXBlcmZfNGJfMjZtaHo7CisJdW5zaWduZWQgY2hhciBtaW5yZWFkcGVyZl84Yl8yNm1oel80Yl81Mm1oejsKKwl1bnNpZ25lZCBjaGFyIG1pbndyaXRlcGVyZl84Yl8yNm1oel80Yl81Mm1oejsKKwl1bnNpZ25lZCBjaGFyIG1pbnJlYWRwZXJmXzhiXzUybWh6OworCXVuc2lnbmVkIGNoYXIgbWlud3JpdGVwZXJmXzhiXzUybWh6OworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfMTE7CisJdW5zaWduZWQgaW50IHNlY3RvcmNvdW50OworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfMTJbMjg4XTsKKwl1bnNpZ25lZCBjaGFyIHN1cHBvcnRlZGNvbW1hbmRzZXRzOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfMTNbN107Cit9IG1tY19leHRlbmRlZF9jc2RfcmVnX3Q7CisKKy8qIG1tYyBzZCByZXNwb25jZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBvY3I7Cit9IG1tY19yZXNwX3IzOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgY2FyZHN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBuZXdwdWJsaXNoZWRyY2E7Cit9IG1tY19yZXNwX3I2OworCitleHRlcm4gbW1jX2NhcmRfZGF0YSBtbWNfZGV2OworCit1bnNpZ25lZCBjaGFyIG1tY19sb3dsZXZlbF9pbml0KHZvaWQpOwordW5zaWduZWQgY2hhciBtbWNfc2VuZF9jb21tYW5kKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGludCBhcmcsCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpyZXNwb25zZSk7Cit1bnNpZ25lZCBjaGFyIG1tY19zZXR1cF9jbG9jayh1bnNpZ25lZCBpbnQgaWNsaywgdW5zaWduZWQgc2hvcnQgY2xrZCk7Cit1bnNpZ25lZCBjaGFyIG1tY19zZXRfb3BlbmRyYWluKHVuc2lnbmVkIGNoYXIgc3RhdGUpOwordW5zaWduZWQgY2hhciBtbWNfcmVhZF9kYXRhKHVuc2lnbmVkIGludCAqb3V0cHV0X2J1Zik7CisKKyNlbmRpZgkJCQkvKk1NQ19QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvb21hcDMvc3RhcnQuUyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODg5MzUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvb21hcDMvc3RhcnQuUwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqICBhcm1ib290IC0gU3RhcnR1cCBDb2RlIGZvciBPTVAyNDIwL0FSTTExMzYgQ1BVLWNvcmUKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgIFRleGFzIEluc3RydW1lbnRzCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMQlNYXJpdXMgR3L2Z2VyIDxtYWdAc3lzZ28uZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCUFsZXggWvxwa2UgPGF6dUBzeXNnby5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIJR2FyeSBKZW5uZWpvaG4gPGdqQGRlbnguZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAzCVJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMJS3NoaXRpaiA8a3NoaXRpakB0aS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA0CUppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorCisuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CisJYglyZXNldAorIAlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisKK19oYW5nOgorIAkud29yZCBkb19oYW5nCisKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4IC8qIG5vdyAxNio0PTY0ICovCisKKy5nbG9iYWwgX2VuZF92ZWN0CitfZW5kX3ZlY3Q6CisKKwkuYmFsaWdubCAxNiwweGRlYWRiZWVmCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdGFydHVwIENvZGUgKHJlc2V0IHZlY3RvcikKKyAqCisgKiBkbyBpbXBvcnRhbnQgaW5pdCBvbmx5IGlmIHdlIGRvbid0IHN0YXJ0IGZyb20gbWVtb3J5IQorICogc2V0dXAgTWVtb3J5IGFuZCBib2FyZCBzcGVjaWZpYyBiaXRzIHByaW9yIHRvIHJlbG9jYXRpb24uCisgKiByZWxvY2F0ZSBhcm1ib290IHRvIHJhbQorICogc2V0dXAgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCisKKyNpZm5kZWYgU1RBQ0tfQkFTRQorI2RlZmluZSBTVEFDS19CQVNFIFRFWFRfQkFTRQorI2VuZGlmCisJCitfU1RBQ0tfQkFTRToKKyAgICAud29yZCAgIFNUQUNLX0JBU0UKKworLmdsb2JsIF9hcm1ib290X3N0YXJ0CitfYXJtYm9vdF9zdGFydDoKKwkud29yZCBfc3RhcnQKKworLyoKKyAqIFRoZXNlIGFyZSBkZWZpbmVkIGluIHRoZSBib2FyZC1zcGVjaWZpYyBsaW5rZXIgc2NyaXB0LgorICovCisuZ2xvYmwgX2Jzc19zdGFydAorX2Jzc19zdGFydDoKKwkud29yZCBfX2Jzc19zdGFydAorCisuZ2xvYmwgX2Jzc19lbmQKK19ic3NfZW5kOgorCS53b3JkIF9lbmQKKworLyoKKyAqIHRoZSBhY3R1YWwgcmVzZXQgY29kZQorICovCisKK3Jlc2V0OgorCS8qCisJICogc2V0IHRoZSBjcHUgdG8gU1ZDMzIgbW9kZQorCSAqLworCW1ycwlyMCxjcHNyCisJYmljCXIwLHIwLCMweDFmCisJb3JyCXIwLHIwLCMweGQzCisJbXNyCWNwc3IscjAKKworCS8qIENvcHkgdmVjdG9ycyB0byBtYXNrIFJPTSBpbmRpcmVjdCBhZGRyICovCisJYWRyICAgICByMCwgX3N0YXJ0ICAgICAgICAgICAgICAvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworCWFkZCAgICAgcjAsIHIwLCAjNAkJCQkvKiBza2lwIHJlc2V0IHZlY3RvcgkJCSovCisJbW92ICAgICByMiwgIzY0ICAgICAgICAgICAgICAgICAvKiByMiA8LSBzaXplIHRvIGNvcHkgICovCisJYWRkICAgICByMiwgcjAsIHIyICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgICAgICAgICAqLworCW1vdiAgICAgcjEsICNTUkFNX09GRlNFVDAgICAgICAgICAvKiBidWlsZCB2ZWN0IGFkZHIgKi8KKwltb3YgICAgIHIzLCAjU1JBTV9PRkZTRVQxCisJYWRkICAgICByMSwgcjEsIHIzCisJbW92ICAgICByMywgI1NSQU1fT0ZGU0VUMgorCWFkZCAgICAgcjEsIHIxLCByMworbmV4dDoKKwlsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisJc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworCWNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKwlibmUgICAgIG5leHQgICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgdW50aWwgZXF1YWwgKi8KKworCWJsCWNweV9jbGtfY29kZSAgICAgICAgICAgIC8qIHB1dCBkcGxsIGFkanVzdCBjb2RlIGJlaGluZCB2ZWN0b3JzICovCisKKwkvKiB0aGUgbWFzayBST00gY29kZSBzaG91bGQgaGF2ZSBQTEwgYW5kIG90aGVycyBzdGFibGUgKi8KKwlibCAgY3B1X2luaXRfY3JpdAorCityZWxvY2F0ZToJCQkJLyogcmVsb2NhdGUgVS1Cb290IHRvIFJBTQkgICAgKi8KKwlhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KKwlsZHIJcjEsIF9URVhUX0JBU0UJCS8qIHRlc3QgaWYgd2UgcnVuIGZyb20gZmxhc2ggb3IgUkFNICovCisJY21wIHIwLCByMSAgICAgICAgICAgICAgICAgIAkvKiBubyBuZWVkIHRvIHJlbG9jYXRlIGlmIFhJUCAgICAgICAqLworCWJlcSBzdGFja19zZXR1cAkJCS8qIHNraXAgdHh0IGNweSBpZiBYSVAoU1JBTSwgU0RSQU0pICovCisKKwlsZHIJcjIsIF9hcm1ib290X3N0YXJ0CisJbGRyCXIzLCBfYnNzX3N0YXJ0CisJc3ViCXIyLCByMywgcjIJCS8qIHIyIDwtIHNpemUgb2YgYXJtYm9vdCAgICAgICAgICAgICovCisJYWRkCXIyLCByMCwgcjIJCS8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovCisKK2NvcHlfbG9vcDoKKwlsZG1pYQlyMCEsIHtyMy1yMTB9CQkvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworCXN0bWlhCXIxISwge3IzLXIxMH0JCS8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisJY21wCXIwLCByMgkJCS8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVlZSBbcjJdICAgICovCisJYmxlCWNvcHlfbG9vcAorCisJLyogU2V0IHVwIHRoZSBzdGFjawkJCQkJCSAgICAqLworc3RhY2tfc2V0dXA6CisJbGRyCXIwLCBfU1RBQ0tfQkFTRQkJLyogdXBwZXIgMTI4IEtpQjogcmVsb2NhdGVkIHVib290ICAgKi8KKwlzdWIJc3AsIHIwLCAjMTI4CQkvKiBsZWF2ZSAzMiB3b3JkcyBmb3IgYWJvcnQtc3RhY2sgICAqLworCWFuZAlzcCwgc3AsICN+NwkJLyogOCBieXRlIGFsaW5nZWQgZm9yIChsZHIvc3RyKWQgICAgKi8KKworCS8qIENsZWFyIEJTUyAoaWYgYW55KS4gIElzIGJlbG93IHR4ICh3YXRjaCBsb2FkIGFkZHIgLSBuZWVkIHNwYWNlKSAgKi8KK2NsZWFyX2JzczoKKwlsZHIJcjAsIF9ic3Nfc3RhcnQJCS8qIGZpbmQgc3RhcnQgb2YgYnNzIHNlZ21lbnQgICAgICAgICovCisJbGRyCXIxLCBfYnNzX2VuZAkJLyogc3RvcCBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwltb3YgCXIyLCAjMHgwMDAwMDAwMAkJLyogY2xlYXIgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgKi8KK2NsYnNzX2w6CisJc3RyCXIyLCBbcjBdCQkvKiBjbGVhciBCU1MgbG9jYXRpb24gICAgICAgICAgICAgICAqLworCWNtcAlyMCwgcjEJCQkvKiBhcmUgd2UgYXQgdGhlIGVuZCB5ZXQgICAgICAgICAgICAqLworCWFkZAlyMCwgcjAsICM0CQkvKiBpbmNyZW1lbnQgY2xlYXIgaW5kZXggcG9pbnRlciAgICAqLworCWJuZQljbGJzc19sICAgICAgICAgICAgICAgICAvKiBrZWVwIGNsZWFyaW5nIHRpbGwgYXQgZW5kICAgICAgICAqLworCisJbGRyCXBjLCBfc3RhcnRfYXJtYm9vdAkvKiBqdW1wIHRvIEMgY29kZSAgICAgICAgICAgICAgICAgICAqLworCitfc3RhcnRfYXJtYm9vdDoJLndvcmQgc3RhcnRfYXJtYm9vdAorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENQVV9pbml0X2NyaXRpY2FsIHJlZ2lzdGVycworICoKKyAqIHNldHVwIGltcG9ydGFudCByZWdpc3RlcnMKKyAqIHNldHVwIG1lbW9yeSB0aW1pbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitjcHVfaW5pdF9jcml0OgorCS8qCisJICogSW52YWxpZGF0ZSBMMSBJL0QKKwkgKi8KKyAgICAgICAgbW92CXIwLCAjMCAgICAgICAgICAgICAgICAgLyogc2V0IHVwIGZvciBNQ1IgKi8KKyAgICAgICAgbWNyCXAxNSwgMCwgcjAsIGM4LCBjNywgMCAgLyogaW52YWxpZGF0ZSBUTEJzICovCisgICAgICAgIG1jcglwMTUsIDAsIHIwLCBjNywgYzUsIDEgIC8qIGludmFsaWRhdGUgaWNhY2hlICovCisKKwkvKiBJbnZhbGlkZSBMMiBjYWNoZSAoZ3AgZGV2aWNlIGNhbGwgcG9pbnQpCisJICogLSB3YXJuaW5nLCB0aGlzIG1heSBoYXZlIGlzc3VlcyBvbiBFTVUvSFMgZGV2aWNlcworCSAqIHRoaXMgY2FsbCBjYW4gY29ycnVwdCByMC1yNQorCSAqLworCW1vdiByMTIsICMweDEJCUAgc2V0IHVwIHRvIGludmFsaWRlIEwyCisvKgorICogVE9ETzogTmVlZCB0byByZXZlcnQgYmFjayBvbiBHUCBkZXZpY2UuCisgKi8KKy8qCitzbWk6IAkud29yZCAweEUxNjAwMDcwCUAgQ2FsbCBTTUkgbW9uaXRvcgorKi8KKwkvKgorCSAqIGRpc2FibGUgTU1VIHN0dWZmIGFuZCBjYWNoZXMKKwkgKi8KKwltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCisJYmljCXIwLCByMCwgIzB4MDAwMDIwMDAJQCBjbGVhciBiaXRzIDEzICgtLVYtKQorCWJpYwlyMCwgcjAsICMweDAwMDAwMDA3CUAgY2xlYXIgYml0cyAyOjAgKC1DQU0pCisJb3JyCXIwLCByMCwgIzB4MDAwMDAwMDIJQCBzZXQgYml0IDEgKC0tQS0pIEFsaWduCisjaWZuZGVmIENPTkZJR19JQ0FDSEVfT0ZGCisJb3JyCXIwLCByMCwgIzB4MDAwMDE4MDAJQCBzZXQgYml0IDExLDEyICgtLS1JIFotLS0pIEJUQixJLUNhY2hlCisjZW5kaWYKKwltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCisKKwkvKgorICAgICAgICAgKiBKdW1wIHRvIGJvYXJkIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLi4uIFRoZSBNYXNrIFJPTSB3aWxsIGhhdmUgYWxyZWFkeSBpbml0aWFsaXplZAorICAgICAgICAgKiBiYXNpYyBtZW1vcnkuICBHbyBoZXJlIHRvIGJ1bXAgdXAgY2xvY2sgcmF0ZSBhbmQgaGFuZGxlIHdha2UgdXAgY29uZGl0aW9ucy4KKwkgKi8KKwlhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KKwlsZHIJcjEsIF9URVhUX0JBU0UJCS8qIHRlc3QgaWYgd2UgcnVuIGZyb20gZmxhc2ggb3IgUkFNICovCisJY21wICAgICByMCwgcjEgICAgICAgICAgICAgICAgICAvKiBwYXNzIG9uIGluZm8gYWJvdXQgc2tpcHBpbmcgc29tZSBpbml0IHBvcnRpb25zICovCisJbW92ZXEgICByMCwjMHgxICAgICAgICAgICAgICAgICAvKiBmbGFnIHRvIHNraXAgcHJjbSBhbmQgc2RyYyBzZXR1cCAqLworCW1vdm5lICAgcjAsIzB4MAorCisJbW92CWlwLCBsciAgICAgICAgICAvKiBwZXJzZXZlcmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKwlibAlsb3dsZXZlbF9pbml0ICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKwltb3YJbHIsIGlwICAgICAgICAgIC8qIHJlc3RvcmUgbGluayAqLworCW1vdglwYywgbHIgICAgICAgICAgLyogYmFjayB0byBteSBjYWxsZXIgKi8KKworLyoKKyAqIGV4Y2VwdGlvbiBoYW5kbGVyCisgKi8KKyAJLmFsaWduICA1Citkb19oYW5nOgorCWxkcglzcCwgX1RFWFRfQkFTRQkJLyogdXNlIDMyIHdvcmRzIGFib3J0IHN0YWNrICovCisgICAJYmwJaGFuZwkJCS8qIGhhbmcgYW5kIG5ldmVyIHJldHVybiAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9kaXNrL01ha2VmaWxlIGIveC1sb2FkZXIvZGlzay9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjQwOWQ4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZGlzay9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCisjQ0ZMQUdTICs9IC1ERVRfREVCVUcgLURERUJVRworCitMSUIJPSAkKG9iailsaWJkaXNrLmEKKworQ09CSlMJPSBwYXJ0Lm8KKworU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChMSUIpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9kaXNrL3BhcnQuYyBiL3gtbG9hZGVyL2Rpc2svcGFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEzNjdmMTMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kaXNrL3BhcnQuYwpAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGlkZS5oPgorI2luY2x1ZGUgPHBhcnQuaD4KKworI3VuZGVmCVBBUlRfREVCVUcKKworI2lmZGVmCVBBUlRfREVCVUcKKyNkZWZpbmUJUFJJTlRGKGZtdCxhcmdzLi4uKQlwcmludGYgKGZtdCAsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQorI2VuZGlmCisKKyNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQl8fCBcCisgICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCXx8IFwKKyAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKQl8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX01NQykgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19TWVNURU1BQ0UpICkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIHJlcG9ydHMgZGV2aWNlIGluZm8gdG8gdGhlIHVzZXIKKyAqLwordm9pZCBkZXZfcHJpbnQgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKQoreworI2lmZGVmIENPTkZJR19MQkE0OAorCXVpbnQ2NF90IGxiYTUxMjsgLyogbnVtYmVyIG9mIGJsb2NrcyBpZiA1MTJieXRlcyBibG9jayBzaXplICovCisjZWxzZQorCWxiYWludF90IGxiYTUxMjsKKyNlbmRpZgorCisJaWYgKGRldl9kZXNjLT50eXBlPT1ERVZfVFlQRV9VTktOT1dOKSB7CisJCXJldHVybjsKKwl9CisJaWYgKGRldl9kZXNjLT5pZl90eXBlPT1JRl9UWVBFX1NDU0kpICB7CisJCXByaW50ZiAoIiglZDolZCkgIiwgZGV2X2Rlc2MtPnRhcmdldCxkZXZfZGVzYy0+bHVuKTsKKwl9CisJaWYgKGRldl9kZXNjLT5pZl90eXBlPT1JRl9UWVBFX0lERSkgeworCQlwcmludGYgKCJNb2RlbDogJXMgRmlybTogJXMgU2VyIzogJXNcbiIsCisJCQlkZXZfZGVzYy0+dmVuZG9yLAorCQkJZGV2X2Rlc2MtPnJldmlzaW9uLAorCQkJZGV2X2Rlc2MtPnByb2R1Y3QpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIlZlbmRvcjogJXMgUHJvZC46ICVzIFJldjogJXNcbiIsCisJCQlkZXZfZGVzYy0+dmVuZG9yLAorCQkJZGV2X2Rlc2MtPnByb2R1Y3QsCisJCQlkZXZfZGVzYy0+cmV2aXNpb24pOworCX0KKwlwcmludGYgKCIgICAgICAgICAgICBUeXBlOiAiKTsKKwlzd2l0Y2ggKGRldl9kZXNjLT50eXBlICYgMHgxRikgeworCQljYXNlIERFVl9UWVBFX0hBUkRESVNLOiBwcmludGYgKCJIYXJkIERpc2siKTsKKwkJCQkJYnJlYWs7CisJCWNhc2UgREVWX1RZUEVfQ0RST006IAlwcmludGYgKCJDRCBST00iKTsKKwkJCQkJYnJlYWs7CisJCWNhc2UgREVWX1RZUEVfT1BESVNLOiAJcHJpbnRmICgiT3B0aWNhbCBEZXZpY2UiKTsKKwkJCQkJYnJlYWs7CisJCWNhc2UgREVWX1RZUEVfVEFQRTogCXByaW50ZiAoIlRhcGUiKTsKKwkJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CQlwcmludGYgKCIjICUwMlggIyIsIGRldl9kZXNjLT50eXBlICYgMHgxRik7CisJCQkJCWJyZWFrOworCX0KKwlpZiAoKGRldl9kZXNjLT5sYmEgKiBkZXZfZGVzYy0+Ymxrc3opPjBMKSB7CisJCXVsb25nIG1iLCBtYl9xdW90LCBtYl9yZW0sIGdiLCBnYl9xdW90LCBnYl9yZW07CisJCWxiYWludF90IGxiYTsKKworCQlsYmEgPSBkZXZfZGVzYy0+bGJhOworCisJCWxiYTUxMiA9IChsYmEgKiAoZGV2X2Rlc2MtPmJsa3N6LzUxMikpOworCQltYiA9ICgxMCAqIGxiYTUxMikgLyAyMDQ4OwkvKiAyMDQ4ID0gKDEwMjQgKiAxMDI0KSAvIDUxMiBNQiAqLworCQkvKiByb3VuZCB0byAxIGRpZ2l0ICovCisJCW1iX3F1b3QJPSBtYiAvIDEwOworCQltYl9yZW0JPSBtYiAtICgxMCAqIG1iX3F1b3QpOworCisJCWdiID0gbWIgLyAxMDI0OworCQlnYl9xdW90CT0gZ2IgLyAxMDsKKwkJZ2JfcmVtCT0gZ2IgLSAoMTAgKiBnYl9xdW90KTsKKyNpZmRlZiBDT05GSUdfTEJBNDgKKwkJaWYgKGRldl9kZXNjLT5sYmE0OCkKKwkJCXByaW50ZiAoIiAgICAgICAgICAgIFN1cHBvcnRzIDQ4LWJpdCBhZGRyZXNzaW5nXG4iKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0ZHXzY0QklUX0xCQSkgJiYgZGVmaW5lZChDRkdfNjRCSVRfVlNQUklOVEYpCisJCXByaW50ZiAoIiAgICAgICAgICAgIENhcGFjaXR5OiAlbGQuJWxkIE1CID0gJWxkLiVsZCBHQiAoJXFkIHggJWxkKVxuIiwKKwkJCW1iX3F1b3QsIG1iX3JlbSwKKwkJCWdiX3F1b3QsIGdiX3JlbSwKKwkJCWxiYSwKKwkJCWRldl9kZXNjLT5ibGtzeik7CisjZWxzZQorCQlwcmludGYgKCIgICAgICAgICAgICBDYXBhY2l0eTogJWxkLiVsZCBNQiA9ICVsZC4lbGQgR0IgKCVsZCB4ICVsZClcbiIsCisJCQltYl9xdW90LCBtYl9yZW0sCisJCQlnYl9xdW90LCBnYl9yZW0sCisJCQkodWxvbmcpbGJhLAorCQkJZGV2X2Rlc2MtPmJsa3N6KTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXByaW50ZiAoIiAgICAgICAgICAgIENhcGFjaXR5OiBub3QgYXZhaWxhYmxlXG4iKTsKKwl9Cit9CisjZW5kaWYJLyogQ0ZHX0NNRF9JREUgfHwgQ0ZHX0NNRF9TQ1NJIHx8IENGR19DTURfVVNCIHx8IENPTkZJR19NTUMgKi8KKworI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCXx8IFwKKyAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkJfHwgXAorICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCXx8IFwKKyAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTU1DKQl8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgICAgICAgICAgKQorCisjaWYgZGVmaW5lZChDT05GSUdfTUFDX1BBUlRJVElPTikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0RPU19QQVJUSVRJT04pIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19JU09fUEFSVElUSU9OKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQU1JR0FfUEFSVElUSU9OKQorCit2b2lkIGluaXRfcGFydCAoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjKQoreworI2lmZGVmIENPTkZJR19JU09fUEFSVElUSU9OCisJaWYgKHRlc3RfcGFydF9pc28oZGV2X2Rlc2MpID09IDApIHsKKwkJZGV2X2Rlc2MtPnBhcnRfdHlwZSA9IFBBUlRfVFlQRV9JU087CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCisJaWYgKHRlc3RfcGFydF9tYWMoZGV2X2Rlc2MpID09IDApIHsKKwkJZGV2X2Rlc2MtPnBhcnRfdHlwZSA9IFBBUlRfVFlQRV9NQUM7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCisJaWYgKHRlc3RfcGFydF9kb3MoZGV2X2Rlc2MpID09IDApIHsKKwkJZGV2X2Rlc2MtPnBhcnRfdHlwZSA9IFBBUlRfVFlQRV9ET1M7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BTUlHQV9QQVJUSVRJT04KKwlpZiAodGVzdF9wYXJ0X2FtaWdhKGRldl9kZXNjKSA9PSAwKSB7CisJICAgIGRldl9kZXNjLT5wYXJ0X3R5cGUgPSBQQVJUX1RZUEVfQU1JR0E7CisJICAgIHJldHVybjsKKwl9CisjZW5kaWYKK30KKworCitpbnQgZ2V0X3BhcnRpdGlvbl9pbmZvIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYywgaW50IHBhcnQsIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pCit7CisJCXN3aXRjaCAoZGV2X2Rlc2MtPnBhcnRfdHlwZSkgeworI2lmZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfTUFDOgorCQlpZiAoZ2V0X3BhcnRpdGlvbl9pbmZvX21hYyhkZXZfZGVzYyxwYXJ0LGluZm8pID09IDApIHsKKwkJCVBSSU5URiAoIiMjIFZhbGlkIE1BQyBwYXJ0aXRpb24gZm91bmQgIyNcbiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RPU19QQVJUSVRJT04KKwljYXNlIFBBUlRfVFlQRV9ET1M6CisJCWlmIChnZXRfcGFydGl0aW9uX2luZm9fZG9zKGRldl9kZXNjLHBhcnQsaW5mbykgPT0gMCkgeworCQkJUFJJTlRGICgiIyMgVmFsaWQgRE9TIHBhcnRpdGlvbiBmb3VuZCAjI1xuIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSVNPX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX0lTTzoKKwkJaWYgKGdldF9wYXJ0aXRpb25faW5mb19pc28oZGV2X2Rlc2MscGFydCxpbmZvKSA9PSAwKSB7CisJCQlQUklOVEYgKCIjIyBWYWxpZCBJU08gYm9vdCBwYXJ0aXRpb24gZm91bmQgIyNcbiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FNSUdBX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX0FNSUdBOgorCSAgICBpZiAoZ2V0X3BhcnRpdGlvbl9pbmZvX2FtaWdhKGRldl9kZXNjLCBwYXJ0LCBpbmZvKSA9PSAwKQorCSAgICB7CisJCVBSSU5URiAoIiMjIFZhbGlkIEFtaWdhIHBhcnRpdGlvbiBmb3VuZCAjI1xuIik7CisJCXJldHVybiAoMCk7CisJICAgIH0KKwkgICAgYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3BhcnRfaGVhZGVyIChjb25zdCBjaGFyICp0eXBlLCBibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MpCit7CisJc3dpdGNoIChkZXZfZGVzYy0+aWZfdHlwZSkgeworCQljYXNlIElGX1RZUEVfSURFOiAgCXByaW50ZiAoIklERSIpOworCQkJCQlicmVhazsKKwkJY2FzZSBJRl9UWVBFX1NDU0k6IAlwcmludGYgKCJTQ1NJIik7CisJCQkJCWJyZWFrOworCQljYXNlIElGX1RZUEVfQVRBUEk6CXByaW50ZiAoIkFUQVBJIik7CisJCQkJCWJyZWFrOworCQljYXNlIElGX1RZUEVfVVNCOglwcmludGYgKCJVU0IiKTsKKwkJCQkJYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9ET0M6CXByaW50ZiAoIkRPQyIpOworCQkJCQlicmVhazsKKwkJZGVmYXVsdDogCQlwcmludGYgKCJVTktOT1dOIik7CisJCQkJCWJyZWFrOworCX0KKwlwcmludGYgKCIgZGV2aWNlICVkICAtLSAgIFBhcnRpdGlvbiBUeXBlOiAlc1xuXG4iLAorCQkJZGV2X2Rlc2MtPmRldiwgdHlwZSk7Cit9CisKK3ZvaWQgcHJpbnRfcGFydCAoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjKQoreworCisJCXN3aXRjaCAoZGV2X2Rlc2MtPnBhcnRfdHlwZSkgeworI2lmZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfTUFDOgorCQlQUklOVEYgKCIjIyBUZXN0aW5nIGZvciB2YWxpZCBNQUMgcGFydGl0aW9uICMjXG4iKTsKKwkJcHJpbnRfcGFydF9oZWFkZXIgKCJNQUMiLCBkZXZfZGVzYyk7CisJCXByaW50X3BhcnRfbWFjIChkZXZfZGVzYyk7CisJCXJldHVybjsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfRE9TOgorCQlQUklOVEYgKCIjIyBUZXN0aW5nIGZvciB2YWxpZCBET1MgcGFydGl0aW9uICMjXG4iKTsKKwkJcHJpbnRfcGFydF9oZWFkZXIgKCJET1MiLCBkZXZfZGVzYyk7CisJCXByaW50X3BhcnRfZG9zIChkZXZfZGVzYyk7CisJCXJldHVybjsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lTT19QQVJUSVRJT04KKwljYXNlIFBBUlRfVFlQRV9JU086CisJCVBSSU5URiAoIiMjIFRlc3RpbmcgZm9yIHZhbGlkIElTTyBCb290IHBhcnRpdGlvbiAjI1xuIik7CisJCXByaW50X3BhcnRfaGVhZGVyICgiSVNPIiwgZGV2X2Rlc2MpOworCQlwcmludF9wYXJ0X2lzbyAoZGV2X2Rlc2MpOworCQlyZXR1cm47CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BTUlHQV9QQVJUSVRJT04KKwljYXNlIFBBUlRfVFlQRV9BTUlHQToKKwkgICAgUFJJTlRGICgiIyMgVGVzdGluZyBmb3IgYSB2YWxpZCBBbWlnYSBwYXJ0aXRpb24gIyNcbiIpOworCSAgICBwcmludF9wYXJ0X2hlYWRlciAoIkFNSUdBIiwgZGV2X2Rlc2MpOworCSAgICBwcmludF9wYXJ0X2FtaWdhIChkZXZfZGVzYyk7CisJICAgIHJldHVybjsKKyNlbmRpZgorCX0KK30KKworCisjZWxzZQkvKiBuZWl0aGVyIE1BQyBub3IgRE9TIG5vciBJU08gcGFydGl0aW9uIGNvbmZpZ3VyZWQgKi8KKyMgZXJyb3IgbmVpdGhlciBDT05GSUdfTUFDX1BBUlRJVElPTiBub3IgQ09ORklHX0RPU19QQVJUSVRJT04gbm9yIENPTkZJR19JU09fUEFSVElUSU9OIGNvbmZpZ3VyZWQhCisjZW5kaWYKKworI2VuZGlmCS8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgfHwgQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKSAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZSBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxMTI1NwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKQEAgLTAsMCArMSw5NCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCTo9ICQob2JqKWxpYm5hbmQuYQorCitpZmVxICgkKEJPQVJEKSwgb21hcDM0MzBzZHApCitDT0JKUy15CSs9IGs5ZjFnMDhyMGEubworZW5kaWYKKworaWZlcSAoJChCT0FSRCksIG9tYXAzNDMwbGFicmFkb3IpCitDT0JKUy15CSs9IGs5ZjFnMDhyMGEubworZW5kaWYKKworaWZlcSAoJChCT0FSRCksIG9tYXAzZXZtKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBhbTM1MTdldm0pCitDT0JKUy15CSs9IGs5ZjFnMDhyMGEubworZW5kaWYKKworaWZlcSAoJChCT0FSRCksIG9tYXAyNDIwaDQpCitDT0JKUy15CSs9IGs5azEyMTYubworZW5kaWYKKworaWZlcSAoJChCT0FSRCksIG9tYXAyNDMwc2RwKQorQ09CSlMteQkrPSBrOWsxMjE2Lm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwMTcxMGgzKQorQ09CSlMteQkrPSBrOWY1NjE2Lm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBkaWFtb25kKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBkaWFtb25kLXVzYi1sb2FkZXIpCitDT0JKUy15CSs9IGs5ZjFnMDhyMGEubworZW5kaWYKKworaWZlcSAoJChCT0FSRCksIGo0OSkKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgajQ5LXVzYi1sb2FkZXIpCitDT0JKUy15CSs9IGs5ZjFnMDhyMGEubworZW5kaWYKKworIyMgRGlzYWJsZWQgZm9yIG5vdzoKKyMjCSAgY3M4OTAwLm8gY3Q2OTAwMC5vIGRhdGFmbGFzaC5vIGRjMjExNHgubyBkczE3MjIubyBcCisjIwkgIGxhbjkxYzk2Lm8gbXdfZWVwcm9tLm8gbmF0c2VtaS5vIFwKKyMjCSAgc21jOTExMTEubyBzbWlMeW54RU0ubyBzcGlfZWVwcm9tLm8gc3ltNTNjOHh4Lm8gXAorIyMKKworQ09CSlMJOj0gJChDT0JKUy15KQorU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChMSUIpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5ZjFnMDhyMGEuYyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlmMWcwOHIwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmYwNmYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5ZjFnMDhyMGEuYwpAQCAtMCwwICsxLDQyNSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiAgU2Ftc3VuZyBLOUYxRzA4UjBBUTBDIE5BTkQgY2hpcCBkcml2ZXIgZm9yIGFuIE9NQVAyNDIwIGJvYXJkCisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgdS1ib290IGZpbGU6CisgKgljb21tb24vY21kX25hbmQuYworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisKKyNpZiBkZWZpbmVkKENGR19OQU5EX0s5RjFHMDhSMEEpIHx8CVwKKyAgICBkZWZpbmVkKENGR19OQU5EX0s5RjRHMDhVMEMpIHx8CVwKKyAgICBkZWZpbmVkKENGR19OQU5EX01UMjlGMkcxNikKKworI2RlZmluZSBLOUYxRzA4UjBBX01GUgkJMHhlYyAgLyogU2Ftc3VuZyAqLworI2RlZmluZSBLOUYxRzA4UjBBX0lECQkweGExICAvKiBwYXJ0ICMgKi8KKworI2RlZmluZSBTMzRNUzAxRzFfTUZSCQkweDAxICAvKiBTcGFuc2lvbiAqLworI2RlZmluZSBTMzRNUzAxRzFfSUQJCTB4YmEgIC8qIHBhcnQgIyAtIDE2Yml0LCAyR0IgKi8KKworLyogU2luY2UgTWljcm9uIGFuZCBTYW1zdW5nIHBhcnRzIGFyZSBzaW1pbGFyIGluIGdlb21ldHJ5IGFuZCBidXMgd2lkdGgKKyAqIHdlIGNhbiB1c2UgdGhlIHNhbWUgZHJpdmVyLiBOZWVkIHRvIHJldmlzaXQgdG8gbWFrZSB0aGlzIGZpbGUgaW5kZXBlbmRlbnQKKyAqIG9mIHBhcnQvbWFudWZhY3R1cmVyCisgKi8KKyNkZWZpbmUgTVQyOUYxR19NRlIJCTB4MmMgIC8qIE1pY3JvbiAqLworI2RlZmluZSBNVDI5RjFHX0lECQkweGExICAvKiB4OCwgMUdpQiAqLworI2RlZmluZSBNVDI5RjJHX0lECQkweGJhICAvKiB4MTYsIDJHaUIgKi8KKworI2RlZmluZSBIWU5JWDRHaUJfTUZSCQkweEFEICAvKiBIeW5peCAqLworI2RlZmluZSBIWU5JWDRHaUJfSUQJCTB4QkMgIC8qIHgxNiwgNEdpQiAqLworCisjZGVmaW5lIEFERFJfQ09MVU1OCQkxCisjZGVmaW5lIEFERFJfUEFHRQkJMgorI2RlZmluZSBBRERSX0NPTFVNTl9QQUdFCShBRERSX0NPTFVNTiB8IEFERFJfUEFHRSkKKworI2RlZmluZSBBRERSX09PQgkJKDB4NCB8IEFERFJfQ09MVU1OX1BBR0UpCisKKyNkZWZpbmUgUEFHRV9TSVpFCQkyMDQ4CisjZGVmaW5lIE9PQl9TSVpFCQk2NAorI2RlZmluZSBNQVhfTlVNX1BBR0VTCQk2NAorCisjZGVmaW5lIEVDQ19DSEVDS19FTkFCTEUKKworI2lmIENGR19OQU5EX0VDQ18xQklUCisjZGVmaW5lIEVDQ19TSVpFCQkyNAorI2RlZmluZSBFQ0NfU1RFUFMJCTMKKyNkZWZpbmUgb21hcF9lbmFibGVfaHdlY2MKKyNkZWZpbmUgb21hcF9jb3JyZWN0X2RhdGEKKyNkZWZpbmUgb21hcF9jYWxjdWxhdGVfZWNjCisjZWxpZiBDRkdfTkFORF9FQ0NfNEJJVAorI2RlZmluZSBFQ0NfU0laRQkJMjggCisjZGVmaW5lIEVDQ19TVEVQUwkJMjggCisKK2V4dGVybiBlbmFibGVfaHdlY2NfYmNoNCh1aW50MzJfdCBidXNfd2lkdGgsIGludDMyX3QgbW9kZSk7CitleHRlcm4gaW50IG9tYXBfY29ycmVjdF9kYXRhX2JjaDQodWludDhfdCAqZGF0LCB1aW50OF90ICpyZWFkX2VjYywgdWludDhfdCAqY2FsY19lY2MpOworZXh0ZXJuIGludCBvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoNChjb25zdCB1aW50OF90ICpkYXQsIHVpbnQ4X3QgKmVjY19jb2RlKTsKKworI2RlZmluZSBvbWFwX2VuYWJsZV9od2VjYwlvbWFwX2VuYWJsZV9od2VjY19iY2g0CisjZGVmaW5lIG9tYXBfY29ycmVjdF9kYXRhCW9tYXBfY29ycmVjdF9kYXRhX2JjaDQKKyNkZWZpbmUgb21hcF9jYWxjdWxhdGVfZWNjCW9tYXBfY2FsY3VsYXRlX2VjY19iY2g0CisjZWxpZiBDRkdfTkFORF9FQ0NfOEJJVAorI2RlZmluZSBFQ0NfU0laRQkJNTIKKyNkZWZpbmUgRUNDX1NURVBTCQk1MiAKKworZXh0ZXJuIHZvaWQgb21hcF9lbmFibGVfaHdlY2NfYmNoOCh1aW50MzJfdCBidXNfd2lkdGgsIGludDMyX3QgbW9kZSk7CitleHRlcm4gaW50IG9tYXBfY29ycmVjdF9kYXRhX2JjaDgodWludDhfdCAqZGF0LCB1aW50OF90ICpyZWFkX2VjYywgdWludDhfdCAqY2FsY19lY2MpOworZXh0ZXJuIGludCBvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoOChjb25zdCB1aW50OF90ICpkYXQsIHVpbnQ4X3QgKmVjY19jb2RlKTsKKworI2RlZmluZSBvbWFwX2VuYWJsZV9od2VjYwlvbWFwX2VuYWJsZV9od2VjY19iY2g4CisjZGVmaW5lIG9tYXBfY29ycmVjdF9kYXRhCW9tYXBfY29ycmVjdF9kYXRhX2JjaDgKKyNkZWZpbmUgb21hcF9jYWxjdWxhdGVfZWNjCW9tYXBfY2FsY3VsYXRlX2VjY19iY2g4CisjZWxzZQorI2Vycm9yICJOb25lIG9mIENGR19OQU5EX0VDQ197MSw0LDh9QklUIGlzIGRlZmluZWQuIgorI2VuZGlmIC8qIENGR19OQU5EX0VDQ18xQklUICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkZWxheQorICogRGVzY3JpcHRpb246IHNwaW5uaW5nIGRlbGF5IHRvIHVzZSBiZWZvcmUgdWRlbGF5IHdvcmtzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIGRlbGF5ICh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIgorCQkJCQkgICJzdWJzICUwLCAlMCwgIzFcbiIKKwkJCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiIChsb29wcykpOworfQorCitzdGF0aWMgaW50IG5hbmRfcmVhZF9wYWdlKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpOworc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHVfY2hhciAqIGJ1ZiwgdWxvbmcgcGFnZV9hZGRyKTsKKworI2lmZGVmIENGR19OQU5EX0VDQ18xQklUCitzdGF0aWMgdV9jaGFyIGVjY19wb3NbXSA9CisJCXs0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCisJCTQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwKKwkJNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzfTsKKyNlbGlmIENGR19OQU5EX0VDQ180QklUCitzdGF0aWMgdV9jaGFyIGVjY19wb3NbXSA9CisJCXszNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgCisJCTQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCAKKwkJNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIAorCQk1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2M307CisjZWxpZiBDRkdfTkFORF9FQ0NfOEJJVAorc3RhdGljIHVfY2hhciBlY2NfcG9zW10gPQorCQl7MTIsIDEzLCAxNCwKKwkJMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsCisJCTIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LAorCQkyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwKKwkJMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIAorCQk0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgCisJCTUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCAKKwkJNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjN9OworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNoaXBzaXplID0gKDI1NiA8PCAyMCk7CisKKyNpZmRlZiBOQU5EXzE2QklUCitzdGF0aWMgaW50IGJ1c193aWR0aCA9IDE2OworI2Vsc2UKK3N0YXRpYyBpbnQgYnVzX3dpZHRoID0gODsKKyNlbmRpZgorCisvKiBOYW5EX0NvbW1hbmQ6IFNlbmQgYSBmbGFzaCBjb21tYW5kIHRvIHRoZSBmbGFzaCBjaGlwICovCitzdGF0aWMgaW50IE5hbkRfQ29tbWFuZCh1bnNpZ25lZCBjaGFyIGNvbW1hbmQpCit7CisgCU5BTkRfQ1RMX1NFVENMRShOQU5EX0FERFIpOworCisgCVdSSVRFX05BTkRfQ09NTUFORChjb21tYW5kLCBOQU5EX0FERFIpOworIAlOQU5EX0NUTF9DTFJDTEUoTkFORF9BRERSKTsKKworICAJaWYoY29tbWFuZCA9PSBOQU5EX0NNRF9SRVNFVCl7CisJCXVuc2lnbmVkIGNoYXIgcmV0X3ZhbDsKKwkJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1NUQVRVUyk7CisJCWRveworCQkJcmV0X3ZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOy8qIHdhaXQgdGlsbCByZWFkeSAqLworICAJCX0gd2hpbGUoKHJldF92YWwgJiAweDQwKSAhPSAweDQwKTsKKyAJfQorCisJTkFORF9XQUlUX1JFQURZKCk7CisJcmV0dXJuIDA7Cit9CisKKworLyogTmFuRF9BZGRyZXNzOiBTZXQgdGhlIGN1cnJlbnQgYWRkcmVzcyBmb3IgdGhlIGZsYXNoIGNoaXAgKi8KK3N0YXRpYyBpbnQgTmFuRF9BZGRyZXNzKHVuc2lnbmVkIGludCBudW1ieXRlcywgdW5zaWduZWQgbG9uZyBvZnMpCit7CisJdWNoYXIgdTsKKworIAlOQU5EX0NUTF9TRVRBTEUoTkFORF9BRERSKTsKKworCWlmIChudW1ieXRlcyA9PSBBRERSX0NPTFVNTiB8fCBudW1ieXRlcyA9PSBBRERSX0NPTFVNTl9QQUdFCisJCQkJfHwgbnVtYnl0ZXMgPT0gQUREUl9PT0IpCisJeworCQl1c2hvcnQgY29sID0gb2ZzOworCisJCXUgPSBjb2wgICYgMHhmZjsKKwkJV1JJVEVfTkFORF9BRERSRVNTKHUsIE5BTkRfQUREUik7CisKKwkJdSA9IChjb2wgPj4gOCkgJiAweDA3OworCQlpZiAobnVtYnl0ZXMgPT0gQUREUl9PT0IpCisJCQl1ID0gdSB8ICgoYnVzX3dpZHRoID09IDE2KSA/ICgxIDw8IDIpIDogKDEgPDwgMykpOworCQlXUklURV9OQU5EX0FERFJFU1ModSwgTkFORF9BRERSKTsKKwl9CisKKwlpZiAobnVtYnl0ZXMgPT0gQUREUl9QQUdFIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UKKwkJCQl8fCBudW1ieXRlcyA9PSBBRERSX09PQikKKwl7CisJCXUgPSAob2ZzID4+IDExKSAmIDB4ZmY7CisJCVdSSVRFX05BTkRfQUREUkVTUyh1LCBOQU5EX0FERFIpOworCQl1ID0gKG9mcyA+PiAxOSkgJiAweGZmOworCQlXUklURV9OQU5EX0FERFJFU1ModSwgTkFORF9BRERSKTsKKworCQkvKiBPbmUgbW9yZSBhZGRyZXNzIGN5Y2xlIGZvciBkZXZpY2VzID4gMTI4TWlCICovCisJCWlmIChjaGlwc2l6ZSA+ICgxMjggPDwgMjApKSB7CisJCQl1ID0gKG9mcyA+PiAyNykgJiAweGZmOworCQkJV1JJVEVfTkFORF9BRERSRVNTKHUsIE5BTkRfQUREUik7CisJCX0KKwl9CisKKyAJTkFORF9DVExfQ0xSQUxFKE5BTkRfQUREUik7CisKKyAJTkFORF9XQUlUX1JFQURZKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgY2hpcCBtZnIgYW5kIGlkCisgKiByZXR1cm4gMCBpZiB0aGV5IG1hdGNoIGJvYXJkIGNvbmZpZworICogcmV0dXJuIDEgaWYgbm90CisgKi8KK2ludCBuYW5kX2NoaXAoKQoreworCWNvbnN0IGludCBzdXBwb3J0ZWQgPSAwOworCWludCBtZnIsIGlkOworCisgCU5BTkRfRU5BQkxFX0NFKCk7CisKKyAJaWYgKE5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRVNFVCkpIHsKKyAJCXByaW50ZigiRXJyOiBSRVNFVFxuIik7CisgCQlOQU5EX0RJU0FCTEVfQ0UoKTsKKwkJcmV0dXJuICghc3VwcG9ydGVkKTsKKwl9CisKKyAJaWYgKE5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFESUQpKSB7CisgCQlwcmludGYoIkVycjogUkVBRElEXG4iKTsKKyAJCU5BTkRfRElTQUJMRV9DRSgpOworCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworIAl9CisKKyAJTmFuRF9BZGRyZXNzKEFERFJfQ09MVU1OLCAwKTsKKworIAltZnIgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKwlpZCA9IFJFQURfTkFORChOQU5EX0FERFIpOworCisJZGVidWcoIk5BTkQ6ICV4OiV4XG4iLCBtZnIsIGlkKTsKKworCU5BTkRfRElTQUJMRV9DRSgpOworCisJc3dpdGNoIChtZnIpIHsKKworCWNhc2UgSzlGMUcwOFIwQV9NRlI6CisJCXN3aXRjaCAoaWQpIHsKKworCQljYXNlIEs5RjFHMDhSMEFfSUQ6CQlyZXR1cm4gKHN1cHBvcnRlZCk7CisJCWRlZmF1bHQ6CQkJCXJldHVybiAoIXN1cHBvcnRlZCk7CisKKwkJfQorCQlicmVhazsKKworCWNhc2UgTVQyOUYxR19NRlI6CisJCXN3aXRjaCAoaWQpIHsKKworCQljYXNlIE1UMjlGMUdfSUQ6CQkKKwkJY2FzZSBNVDI5RjJHX0lEOgkJcmV0dXJuIChzdXBwb3J0ZWQpOworCQlkZWZhdWx0OgkJCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEhZTklYNEdpQl9NRlI6CisJCXN3aXRjaCAoaWQpIHsKKworCQljYXNlIEhZTklYNEdpQl9JRDoJCXJldHVybiAoc3VwcG9ydGVkKTsKKwkJZGVmYXVsdDoJCQkJcmV0dXJuICghc3VwcG9ydGVkKTsKKworCQl9CisJCWJyZWFrOworCWNhc2UgUzM0TVMwMUcxX01GUjoKKwkJc3dpdGNoIChpZCkgeworCisJCWNhc2UgUzM0TVMwMUcxX0lEOgkJcmV0dXJuIChzdXBwb3J0ZWQpOworCQlkZWZhdWx0OgkJCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworCisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJCQkJcmV0dXJuICghc3VwcG9ydGVkKTsKKworCX0KKworCXJldHVybiAoIXN1cHBvcnRlZCk7Cit9CisKKy8qIHJlYWQgYSBibG9jayBkYXRhIHRvIGJ1ZgorICogcmV0dXJuIDEgaWYgdGhlIGJsb2NrIGlzIGJhZCBvciBFQ0MgZXJyb3IgY2FuJ3QgYmUgY29ycmVjdGVkIGZvciBhbnkgcGFnZQorICogcmV0dXJuIDAgb24gc3VjZXNzCisgKi8KK2ludCBuYW5kX3JlYWRfYmxvY2sodW5zaWduZWQgY2hhciAqYnVmLCB1bG9uZyBibG9ja19hZGRyKQoreworCWludCBpLCBvZmZzZXQgPSAwOworCisjaWZkZWYgRUNDX0NIRUNLX0VOQUJMRQorCXUxNiBvb2JfYnVmW09PQl9TSVpFID4+IDFdOworCisJLyogY2hlY2sgYmFkIGJsb2NrICovCisJLyogMHRoIHdvcmQgaW4gc3BhcmUgYXJlYSBuZWVkcyBiZSAweGZmICovCisJaWYgKG5hbmRfcmVhZF9vb2IoKHVuc2lnbmVkIGNoYXIgKilvb2JfYnVmLCBibG9ja19hZGRyKQorCQl8fCAob29iX2J1ZlswXSAmIDB4ZmYpICE9IDB4ZmYpIHsKKwkJcHJpbnRmKCJTa2lwcGVkIGJhZCBibG9jayBhdCAweCV4XG4iLCBibG9ja19hZGRyKTsKKwkJcmV0dXJuIE5BTkRfUkVBRF9TS0lQUEVEX0JBRF9CTE9DSzsgICAgLyogc2tpcCBiYWQgYmxvY2sgKi8KKwl9CisjZW5kaWYKKwkvKiByZWFkIHRoZSBibG9jayBwYWdlIGJ5IHBhZ2UqLworCWZvciAoaT0wOyBpPE1BWF9OVU1fUEFHRVM7IGkrKyl7CisJCWlmIChuYW5kX3JlYWRfcGFnZShidWYrb2Zmc2V0LCBibG9ja19hZGRyICsgb2Zmc2V0KSkKKwkJCXJldHVybiBOQU5EX1JFQURfRUNDX0ZBSUxVUkU7CisJCW9mZnNldCArPSBQQUdFX1NJWkU7CisJfQorCisJcmV0dXJuIE5BTkRfUkVBRF9TVUNDRVNTOworfQorc3RhdGljIGludCBjb3VudDsKKy8qIHJlYWQgYSBwYWdlIHdpdGggRUNDICovCitzdGF0aWMgaW50IG5hbmRfcmVhZF9wYWdlKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpCit7CisjaWZkZWYgRUNDX0NIRUNLX0VOQUJMRQorCS8qIGluY3JlYXNlZCBzaXplIG9mIGVjY19jb2RlIGFuZCBlY2NfY2FsYyB0byBtYXRjaCB0aGUgT09CIHNpemUsIAorCSAgIGFzIGlzIGRvbmUgaW4gdGhlIGtlcm5lbCAqLworCXVfY2hhciBlY2NfY29kZVtPT0JfU0laRV07CisJdV9jaGFyIGVjY19jYWxjW09PQl9TSVpFXTsKKwl1X2NoYXIgb29iX2J1ZltPT0JfU0laRV07CisjZW5kaWYKKwl1MTYgdmFsOworCWludCBjbnRyOworCWludCBsZW47CisKKyNpZmRlZiBOQU5EXzE2QklUCisJdTE2ICpwOworI2Vsc2UKKwl1X2NoYXIgKnA7CisjZW5kaWYKKworCU5BTkRfRU5BQkxFX0NFKCk7CisJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQUQwKTsKKwlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU5fUEFHRSwgcGFnZV9hZGRyKTsKKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRFNUQVJUKTsKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKworCS8qIEEgZGVsYXkgc2VlbXMgdG8gYmUgaGVscGluZyBoZXJlLiBuZWVkcyBtb3JlIGludmVzdGlnYXRpb24gKi8KKwlkZWxheSgxMDAwMCk7CisKKwlvbWFwX2VuYWJsZV9od2VjYyhidXNfd2lkdGgsIDApOworCisJLyogcmVhZCB0aGUgcGFnZSAqLworCWxlbiA9IChidXNfd2lkdGggPT0gMTYpID8gUEFHRV9TSVpFID4+IDEgOiBQQUdFX1NJWkU7CisJcCA9ICh1MTYgKilidWY7CisJZm9yIChjbnRyID0gMDsgY250ciA8IGxlbjsgY250cisrKXsKKwkJKnArKyA9IFJFQURfTkFORChOQU5EX0FERFIpOworCQlkZWxheSgxMCk7CisgICAJfQorCisjaWZkZWYgRUNDX0NIRUNLX0VOQUJMRQorCW9tYXBfY2FsY3VsYXRlX2VjYyhidWYsICZlY2NfY2FsY1swXSk7CisKKwkvKiByZWFkIHRoZSBPT0IgYXJlYSAqLworCXAgPSAodTE2ICopb29iX2J1ZjsKKyAgICAgICAgbGVuID0gKGJ1c193aWR0aCA9PSAxNikgPyBPT0JfU0laRSA+PiAxIDogT09CX1NJWkU7CisJZm9yIChjbnRyID0gMDsgY250ciA8IGxlbjsgY250cisrKXsKKwkJKnArKyA9IFJFQURfTkFORChOQU5EX0FERFIpOworCQlkZWxheSgxMCk7CisgCX0KKwljb3VudCA9IDA7CisgCU5BTkRfRElTQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBoaWdoICovCisKKwkvKiBOZWVkIHRvIGVuYWJsZSBIV0VDQyBmb3IgUkVBRElORyAqLworCisgCS8qIFBpY2sgdGhlIEVDQyBieXRlcyBvdXQgb2YgdGhlIG9vYiBkYXRhICovCisJZm9yIChjbnRyID0gMDsgY250ciA8IEVDQ19TSVpFOyBjbnRyKyspCisJCWVjY19jb2RlW2NudHJdID0gIG9vYl9idWZbZWNjX3Bvc1tjbnRyXV07CisKKwlmb3IoY291bnQgPSAwOyBjb3VudCA8IEVDQ19TSVpFOyBjb3VudCArPSBFQ0NfU1RFUFMpIHsKKyNpZiBDRkdfTkFORF9FQ0NfMUJJVAorIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmLCAmZWNjX2NvZGVbY291bnRdLCAmZWNjX2NhbGNbMF0pID09IC0xKSB7CisjZWxzZQorCQlpZiAob21hcF9jb3JyZWN0X2RhdGEoYnVmLCAmZWNjX2NvZGVbY291bnRdLCAmZWNjX2NhbGNbMF0pID09IC0xKSB7CisjZW5kaWYKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKTsKKwkJCWZvciAodmFsPTA7IHZhbCA8MjU2OyB2YWwrKykKKwkJCQlwcmludGYoIiV4ICIsIGJ1Zlt2YWxdKTsKKwkJCXByaW50ZigiXG4iKTsKKyAgCQkJcmV0dXJuIDE7CisgCQl9CisJCWJ1ZiArPSAyNTY7CisJCXBhZ2VfYWRkciArPSAyNTY7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgZnJvbSB0aGUgMTYgYnl0ZXMgb2Ygb29iIGRhdGEgdGhhdCBjb3JyZXNwb25kIHRvIGEgNTEyIC8gMjA0OCBieXRlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX29vYih1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKQoreworCWludCBjbnRyOworCWludCBsZW47CisKKyNpZmRlZiBOQU5EXzE2QklUCisJdTE2ICpwOworI2Vsc2UKKwl1X2NoYXIgKnA7CisjZW5kaWYKKwlwID0gKHUxNiAqKWJ1ZjsKKyAgICAgICAgbGVuID0gKGJ1c193aWR0aCA9PSAxNikgPyBPT0JfU0laRSA+PiAxIDogT09CX1NJWkU7CisKKyAgCU5BTkRfRU5BQkxFX0NFKCk7ICAvKiBzZXQgcGluIGxvdyAqLworCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFEMCk7CisgCU5hbkRfQWRkcmVzcyhBRERSX09PQiwgcGFnZV9hZGRyKTsKKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRFNUQVJUKTsKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKworCS8qIEEgZGVsYXkgc2VlbXMgdG8gYmUgaGVscGluZyBoZXJlLiBuZWVkcyBtb3JlIGludmVzdGlnYXRpb24gKi8KKwlkZWxheSgxMDAwMCk7CisJZm9yIChjbnRyID0gMDsgY250ciA8IGxlbjsgY250cisrKQorCQkqcCsrID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKwlOQU5EX0RJU0FCTEVfQ0UoKTsgIC8qIHNldCBwaW4gaGlnaCAqLworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogZGVmaW5lZChDRkdfTkFORF9LOUYxRzA4UjBBKSB8fAorCQkqIGRlZmluZWQoQ0ZHX05BTkRfSzlGNEcwOFUwQykgfHwKKwkJKiBkZWZpbmVkKENGR19OQU5EX01UMjlGMkcxNikKKwkJKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlmNTYxNi5jIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWY1NjE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiMTQyYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlmNTYxNi5jCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqICBTYW1zdW5nIEs5RjU2MTZRMEMgTkFORCBjaGlwIGRyaXZlciBmb3IgYW4gT01BUDE2eHggYm9hcmQKKyAqIAorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgdS1ib290IGZpbGU6CisgKgljb21tb24vY21kX25hbmQuYworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENGR19OQU5EX0s5RjU2MTYKKworI2RlZmluZSBLOUY1NjE2X01GUgkJMHhlYworI2RlZmluZSBLOUY1NjE2X0lECQkweDQ1CisKKyNkZWZpbmUgQUREUl9DT0xVTU4JCTEgICAgICAgICAgCisjZGVmaW5lIEFERFJfUEFHRQkJMiAgICAgICAgICAgICAKKyNkZWZpbmUgQUREUl9DT0xVTU5fUEFHRQkzCisKKyNkZWZpbmUgUEFHRV9TSVpFCQk1MTIKKworc3RhdGljIGludCBuYW5kX3JlYWRfcGFnZSh1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKTsKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX29vYih1X2NoYXIgKiBidWYsIHVsb25nIHBhZ2VfYWRkcik7CisKKy8qIEpGRlMyIDUxMi1ieXRlLXBhZ2UgRUNDIGxheW91dCAqLworc3RhdGljIHVfY2hhciBlY2NfcG9zW10gPSB7MCwxLDIsMyw2LDd9Oworc3RhdGljIHVfY2hhciBlY2N2YWxpZF9wb3MgPSA0OworCisvKiBOYW5EX0NvbW1hbmQ6IFNlbmQgYSBmbGFzaCBjb21tYW5kIHRvIHRoZSBmbGFzaCBjaGlwICovCitzdGF0aWMgaW50IE5hbkRfQ29tbWFuZCh1bnNpZ25lZCBjaGFyIGNvbW1hbmQpCit7CisgCU5BTkRfQ1RMX1NFVENMRShOQU5EX0FERFIpOworIAlXUklURV9OQU5EX0NPTU1BTkQoY29tbWFuZCwgTkFORF9BRERSKTsKKyAJTkFORF9DVExfQ0xSQ0xFKE5BTkRfQUREUik7CisKKyAgCWlmKGNvbW1hbmQgPT0gTkFORF9DTURfUkVTRVQpeworCQl1bnNpZ25lZCBjaGFyIHJldF92YWw7CisJCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9TVEFUVVMpOworCQlkb3sKKwkJCXJldF92YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsvKiB3YWl0IHRpbGwgcmVhZHkgKi8KKyAgCQl9IHdoaWxlKChyZXRfdmFsICYgMHg0MCkgIT0gMHg0MCk7CisgCX0KKyAJCisgCU5BTkRfV0FJVF9SRUFEWSgpOworCXJldHVybiAwOworfQorCisvKiBOYW5EX0FkZHJlc3M6IFNldCB0aGUgY3VycmVudCBhZGRyZXNzIGZvciB0aGUgZmxhc2ggY2hpcCAqLworc3RhdGljIGludCBOYW5EX0FkZHJlc3MoaW50IG51bWJ5dGVzLCB1bnNpZ25lZCBsb25nIG9mcykKK3sKKyAJaW50IGk7CisKKyAJTkFORF9DVExfU0VUQUxFKE5BTkRfQUREUik7CisgCisJaWYgKG51bWJ5dGVzID09IEFERFJfQ09MVU1OIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UpCisJCVdSSVRFX05BTkRfQUREUkVTUyhvZnMsIE5BTkRfQUREUik7CisKKwlvZnMgPSBvZnMgPj4gODsKKworCWlmIChudW1ieXRlcyA9PSBBRERSX1BBR0UgfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRSkKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKywgb2ZzID0gb2ZzID4+IDgpCisJCQlXUklURV9OQU5EX0FERFJFU1Mob2ZzLCBOQU5EX0FERFIpOworCisgCU5BTkRfQ1RMX0NMUkFMRShOQU5EX0FERFIpOworCisgCU5BTkRfV0FJVF9SRUFEWSgpOworCXJldHVybiAwOworfQorCisvKiByZWFkIGNoaXAgbWZyIGFuZCBpZAorICogcmV0dXJuIDAgaWYgdGhleSBtYXRjaCBib2FyZCBjb25maWcKKyAqIHJldHVybiAxIGlmIG5vdAorICovCitpbnQgbmFuZF9jaGlwKCkKK3sKKwlpbnQgbWZyLCBpZDsKKworIAlOQU5EX0VOQUJMRV9DRSgpOworCisgCWlmIChOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVTRVQpKSB7CisgCQlwcmludGYoIkVycjogUkVTRVRcbiIpOworIAkJTkFORF9ESVNBQkxFX0NFKCk7ICAgCisJCXJldHVybiAxOworCX0KKyAKKyAJaWYgKE5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFESUQpKSB7CisgCQlwcmludGYoIkVycjogUkVBRElEXG4iKTsKKyAJCU5BTkRfRElTQUJMRV9DRSgpOworCQlyZXR1cm4gMTsKKyAJfQorIAorIAlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU4sIDApOworCisgCW1mciA9IFJFQURfTkFORChOQU5EX0FERFIpOworCWlkID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisKKwlOQU5EX0RJU0FCTEVfQ0UoKTsKKworICAJcmV0dXJuIChtZnIgIT0gSzlGNTYxNl9NRlIgfHwgaWQgIT0gSzlGNTYxNl9JRCk7Cit9CisKKy8qIHJlYWQgYSBibG9jayBkYXRhIHRvIGJ1ZgorICogcmV0dXJuIDEgaWYgdGhlIGJsb2NrIGlzIGJhZCBvciBFQ0MgZXJyb3IgY2FuJ3QgYmUgY29ycmVjdGVkIGZvciBhbnkgcGFnZQorICogcmV0dXJuIDAgb24gc3VjZXNzCisgKi8gCitpbnQgbmFuZF9yZWFkX2Jsb2NrKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWxvbmcgYmxvY2tfYWRkcikKK3sKKwlpbnQgaSwgb2Zmc2V0ID0gMDsKKwl1Y2hhciBvb2JfYnVmWzE2XTsKKyAJCisJLyogY2hlY2sgYmFkIGJsb2NrICovCisJLyogMHRoIGFuZCA1dGggd29yZHMgbmVlZCBiZSAweGZmZmYgKi8KKwlpZiAobmFuZF9yZWFkX29vYihvb2JfYnVmLCBibG9ja19hZGRyKSB8fAorLy8JCW9vYl9idWZbMF0gIT0gMHhmZiB8fCBvb2JfYnVmWzFdICE9IDB4ZmYgfHwKKy8vCQlvb2JfYnVmWzEwXSAhPSAweGZmIHx8IG9vYl9idWZbMTFdICE9IDB4ZmYgKXsKKwkJb29iX2J1Zls1XSAhPSAweGZmKXsKKwkJcHJpbnRmKCJTa2lwcGVkIGJhZCBibG9jayBhdCAweCV4XG4iLCBibG9ja19hZGRyKTsKKyAJCXJldHVybiBOQU5EX1JFQURfU0tJUFBFRF9CQURfQkxPQ0s7ICAgIC8qIHNraXAgYmFkIGJsb2NrICovCisJfQorCisJLyogcmVhZCB0aGUgYmxvY2sgcGFnZSBieSBwYWdlKi8KKwlmb3IgKGk9MDsgaTwzMjsgaSsrKXsKKwkJaWYgKG5hbmRfcmVhZF9wYWdlKGJ1ZitvZmZzZXQsIGJsb2NrX2FkZHIgKyBvZmZzZXQpKQorCQkJcmV0dXJuIE5BTkRfUkVBRF9FQ0NfRkFJTFVSRTsKKwkJb2Zmc2V0ICs9IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gTkFORF9SRUFEX1NVQ0NFU1M7Cit9CisKKy8qIHJlYWQgYSBwYWdlIHdpdGggRUNDICovCitzdGF0aWMgaW50IG5hbmRfcmVhZF9wYWdlKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpCit7CisgCXVfY2hhciBlY2NfY29kZVs2XTsKKwl1X2NoYXIgZWNjX2NhbGNbM107CisgCXVfY2hhciBvb2JfYnVmWzE2XTsKKwl1X2NoYXIgKnA7CisJdTE2IHZhbDsKKwlpbnQgY250cjsKKworCU5BTkRfRU5BQkxFX0NFKCk7ICAgCisJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQUQwKTsKKwlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU5fUEFHRSwgcGFnZV9hZGRyPj4xKTsKKworCU5BTkRfV0FJVF9SRUFEWSgpOworIAlwID0gYnVmOworCWZvciAoY250ciA9IDA7IGNudHIgPCAyNTY7IGNudHIrKyl7CisJCXZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOworCQkqcCsrID0gdmFsICYgMHhmZjsKKwkJKnArKyA9IHZhbCA+PiA4OworIAl9CisKKwlwID0gb29iX2J1ZjsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgODsgY250cisrKXsKKyAJCXZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOworCQkqcCsrID0gdmFsICYgMHhmZjsKKwkJKnArKyA9IHZhbCA+PiA4OworIAl9CisgCU5BTkRfRElTQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBoaWdoICovCisKKyAJLyogUGljayB0aGUgRUNDIGJ5dGVzIG91dCBvZiB0aGUgb29iIGRhdGEgKi8KKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgNjsgY250cisrKQorCQllY2NfY29kZVtjbnRyXSA9ICBvb2JfYnVmW2VjY19wb3NbY250cl1dOworCisKKwlpZiAoKG9vYl9idWZbZWNjdmFsaWRfcG9zXSAmIDB4MGYpICE9IDB4MGYpIHsKKyAJCW5hbmRfY2FsY3VsYXRlX2VjYyAoYnVmLCAmZWNjX2NhbGNbMF0pOworCQlpZiAobmFuZF9jb3JyZWN0X2RhdGEgKGJ1ZiwgJmVjY19jb2RlWzBdLCAmZWNjX2NhbGNbMF0pID09IC0xKSB7CisgCQkJcHJpbnRmICgiRUNDIEZhaWxlZCwgcGFnZSAweCUwOHhcbiIsIHBhZ2VfYWRkcik7CisgIAkJCXJldHVybiAxOworIAkJfQorCX0KKwkKKwlpZiAoKG9vYl9idWZbZWNjdmFsaWRfcG9zXSAmIDB4ZjApICE9IDB4ZjApIHsKKyAJCW5hbmRfY2FsY3VsYXRlX2VjYyAoYnVmICsgMjU2LCAmZWNjX2NhbGNbMF0pOworCQlpZiAobmFuZF9jb3JyZWN0X2RhdGEgKGJ1ZiArIDI1NiwgJmVjY19jb2RlWzNdLCAmZWNjX2NhbGNbMF0pID09IC0xKSB7CisgCQkJcHJpbnRmICgiRUNDIEZhaWxlZCwgcGFnZSAweCUwOHhcbiIsIHBhZ2VfYWRkcisweDEwMCk7CisgIAkJCXJldHVybiAxOworIAkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiByZWFkIGZyb20gdGhlIDE2IGJ5dGVzIG9mIG9vYiBkYXRhIHRoYXQgY29ycmVzcG9uZCB0byBhIDUxMiBieXRlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX29vYih1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKQoreworCXUxNiB2YWw7CisJaW50IGNudHI7CisgICAgCQorICAJTkFORF9FTkFCTEVfQ0UoKTsgIC8qIHNldCBwaW4gbG93ICovCisJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURPT0IpOworIAlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU5fUEFHRSwgcGFnZV9hZGRyPj4xKTsKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKworCWZvciAoY250ciA9IDA7IGNudHIgPCA4OyBjbnRyKyspeworCQl2YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKwkJKmJ1ZisrID0gdmFsICYgMHhmZjsKKwkJKmJ1ZisrID0gdmFsID4+IDg7CisgIAl9CisKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKwlOQU5EX0RJU0FCTEVfQ0UoKTsgIC8qIHNldCBwaW4gaGlnaCAqLworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWsxMjE2LmMgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5azEyMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWUzMDVkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWsxMjE2LmMKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogIFNhbXN1bmcgSzlLMTIxNlEwQyBOQU5EIGNoaXAgZHJpdmVyIGZvciBhbiBPTUFQMjQyMCBib2FyZAorICogCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyB1LWJvb3QgZmlsZToKKyAqCWNvbW1vbi9jbWRfbmFuZC5jCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ0ZHX05BTkRfSzlLMTIxNgorCisjZGVmaW5lIEs5SzEyMTZfTUZSCQkweGVjCisjZGVmaW5lIEs5SzEyMTZfSUQJCTB4NDYKKworI2RlZmluZSBBRERSX0NPTFVNTgkJMSAgICAgICAgICAKKyNkZWZpbmUgQUREUl9QQUdFCQkyICAgICAgICAgICAgIAorI2RlZmluZSBBRERSX0NPTFVNTl9QQUdFCTMKKworI2RlZmluZSBQQUdFX1NJWkUJCTUxMgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkgKHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iCisJCQkJCSAgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIgKGxvb3BzKSk7Cit9CisKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcik7CitzdGF0aWMgaW50IG5hbmRfcmVhZF9vb2IodV9jaGFyICogYnVmLCB1bG9uZyBwYWdlX2FkZHIpOworCisvKiBKRkZTMiA1MTItYnl0ZS1wYWdlIEVDQyBsYXlvdXQgKi8KK3N0YXRpYyB1X2NoYXIgZWNjX3Bvc1tdID0gezAsMSwyLDMsNiw3fTsKK3N0YXRpYyB1X2NoYXIgZWNjdmFsaWRfcG9zID0gNDsKKworLyogTmFuRF9Db21tYW5kOiBTZW5kIGEgZmxhc2ggY29tbWFuZCB0byB0aGUgZmxhc2ggY2hpcCAqLworc3RhdGljIGludCBOYW5EX0NvbW1hbmQodW5zaWduZWQgY2hhciBjb21tYW5kKQoreworIAlOQU5EX0NUTF9TRVRDTEUoTkFORF9BRERSKTsKKyAJV1JJVEVfTkFORF9DT01NQU5EKGNvbW1hbmQsIE5BTkRfQUREUik7CisgCU5BTkRfQ1RMX0NMUkNMRShOQU5EX0FERFIpOworCisgIAlpZihjb21tYW5kID09IE5BTkRfQ01EX1JFU0VUKXsKKwkJdW5zaWduZWQgY2hhciByZXRfdmFsOworCQlOYW5EX0NvbW1hbmQoTkFORF9DTURfU1RBVFVTKTsKKwkJZG97CisJCQlyZXRfdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7Lyogd2FpdCB0aWxsIHJlYWR5ICovCisgIAkJfSB3aGlsZSgocmV0X3ZhbCAmIDB4NDApICE9IDB4NDApOworIAl9CisgCQorIAlOQU5EX1dBSVRfUkVBRFkoKTsKKwlyZXR1cm4gMDsKK30KKworLyogTmFuRF9BZGRyZXNzOiBTZXQgdGhlIGN1cnJlbnQgYWRkcmVzcyBmb3IgdGhlIGZsYXNoIGNoaXAgKi8KK3N0YXRpYyBpbnQgTmFuRF9BZGRyZXNzKGludCBudW1ieXRlcywgdW5zaWduZWQgbG9uZyBvZnMpCit7CisgCWludCBpOworCisgCU5BTkRfQ1RMX1NFVEFMRShOQU5EX0FERFIpOworIAorCWlmIChudW1ieXRlcyA9PSBBRERSX0NPTFVNTiB8fCBudW1ieXRlcyA9PSBBRERSX0NPTFVNTl9QQUdFKQorCQlXUklURV9OQU5EX0FERFJFU1Mob2ZzLCBOQU5EX0FERFIpOworCisJb2ZzID0gb2ZzID4+IDk7CisKKwlpZiAobnVtYnl0ZXMgPT0gQUREUl9QQUdFIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UpCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyssIG9mcyA9IG9mcyA+PiA4KQorCQkJV1JJVEVfTkFORF9BRERSRVNTKG9mcywgTkFORF9BRERSKTsKKworIAlOQU5EX0NUTF9DTFJBTEUoTkFORF9BRERSKTsKKworIAlOQU5EX1dBSVRfUkVBRFkoKTsKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBjaGlwIG1mciBhbmQgaWQKKyAqIHJldHVybiAwIGlmIHRoZXkgbWF0Y2ggYm9hcmQgY29uZmlnCisgKiByZXR1cm4gMSBpZiBub3QKKyAqLworaW50IG5hbmRfY2hpcCgpCit7CisJaW50IG1mciwgaWQ7CisKKyAJTkFORF9FTkFCTEVfQ0UoKTsKKworIAlpZiAoTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFU0VUKSkgeworIAkJcHJpbnRmKCJFcnI6IFJFU0VUXG4iKTsKKyAJCU5BTkRfRElTQUJMRV9DRSgpOyAgIAorCQlyZXR1cm4gMTsKKwl9CisgCisgCWlmIChOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRElEKSkgeworIAkJcHJpbnRmKCJFcnI6IFJFQURJRFxuIik7CisgCQlOQU5EX0RJU0FCTEVfQ0UoKTsKKwkJcmV0dXJuIDE7CisgCX0KKyAKKyAJTmFuRF9BZGRyZXNzKEFERFJfQ09MVU1OLCAwKTsKKworIAltZnIgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKwlpZCA9IFJFQURfTkFORChOQU5EX0FERFIpOworCisJTkFORF9ESVNBQkxFX0NFKCk7CisKKyAgCXJldHVybiAobWZyICE9IEs5SzEyMTZfTUZSIHx8IGlkICE9IEs5SzEyMTZfSUQpOworfQorCisvKiByZWFkIGEgYmxvY2sgZGF0YSB0byBidWYKKyAqIHJldHVybiAxIGlmIHRoZSBibG9jayBpcyBiYWQgb3IgRUNDIGVycm9yIGNhbid0IGJlIGNvcnJlY3RlZCBmb3IgYW55IHBhZ2UKKyAqIHJldHVybiAwIG9uIHN1Y2VzcworICovIAoraW50IG5hbmRfcmVhZF9ibG9jayh1bnNpZ25lZCBjaGFyICpidWYsIHVsb25nIGJsb2NrX2FkZHIpCit7CisJaW50IGksIG9mZnNldCA9IDA7CisJdWNoYXIgb29iX2J1ZlsxNl07CisgCQorCS8qIGNoZWNrIGJhZCBibG9jayAqLworCS8qIDB0aCBhbmQgNXRoIHdvcmRzIG5lZWQgYmUgMHhmZmZmICovCisJaWYgKG5hbmRfcmVhZF9vb2Iob29iX2J1ZiwgYmxvY2tfYWRkcikgfHwKKy8vCQlvb2JfYnVmWzBdICE9IDB4ZmYgfHwgb29iX2J1ZlsxXSAhPSAweGZmIHx8CisvLwkJb29iX2J1ZlsxMF0gIT0gMHhmZiB8fCBvb2JfYnVmWzExXSAhPSAweGZmICl7CisJCW9vYl9idWZbNV0gIT0gMHhmZil7CisJCXByaW50ZigiU2tpcHBlZCBiYWQgYmxvY2sgYXQgMHgleFxuIiwgYmxvY2tfYWRkcik7CisgCQlyZXR1cm4gTkFORF9SRUFEX1NLSVBQRURfQkFEX0JMT0NLOyAgICAvKiBza2lwIGJhZCBibG9jayAqLworCX0KKworCS8qIHJlYWQgdGhlIGJsb2NrIHBhZ2UgYnkgcGFnZSovCisJZm9yIChpPTA7IGk8MzI7IGkrKyl7CisJCWlmIChuYW5kX3JlYWRfcGFnZShidWYrb2Zmc2V0LCBibG9ja19hZGRyICsgb2Zmc2V0KSkKKwkJCXJldHVybiBOQU5EX1JFQURfRUNDX0ZBSUxVUkU7CisJCW9mZnNldCArPSBQQUdFX1NJWkU7CisJfQorCisJcmV0dXJuIE5BTkRfUkVBRF9TVUNDRVNTOworfQorc3RhdGljIGNvdW50ID0gMDsKKy8qIHJlYWQgYSBwYWdlIHdpdGggRUNDICovCitzdGF0aWMgaW50IG5hbmRfcmVhZF9wYWdlKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpCit7CisgCXVfY2hhciBlY2NfY29kZVs2XTsKKwl1X2NoYXIgZWNjX2NhbGNbM107CisgCXVfY2hhciBvb2JfYnVmWzE2XTsKKwl1X2NoYXIgKnA7CisJdTE2IHZhbDsKKwlpbnQgY250cjsKKworCU5BTkRfRU5BQkxFX0NFKCk7ICAgCisJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQUQwKTsKKwlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU5fUEFHRSwgcGFnZV9hZGRyKTsKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKworCWRlbGF5KDUwMCk7IC8qIHdlIGdvIHRocm91Z2ggTkZDIG5lZWQgYSBiaWdnZXIgZGVsYXkuIDIwMCBpcyBub3QgZW5vdWdoICovCisgCisgIAlwID0gYnVmOworCWZvciAoY250ciA9IDA7IGNudHIgPCAyNTY7IGNudHIrKyl7CisJCXZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOworIAkJKnArKyA9IHZhbCAmIDB4ZmY7CisgCQkqcCsrID0gdmFsID4+IDg7CisgICAJfQorCisJcCA9IG9vYl9idWY7CisJZm9yIChjbnRyID0gMDsgY250ciA8IDg7IGNudHIrKyl7CisgCQl2YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKwkJKnArKyA9IHZhbCAmIDB4ZmY7CisJCSpwKysgPSB2YWwgPj4gODsKKyAJfQorCWNvdW50ID0gMTsKKyAJTkFORF9ESVNBQkxFX0NFKCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKworIAkvKiBQaWNrIHRoZSBFQ0MgYnl0ZXMgb3V0IG9mIHRoZSBvb2IgZGF0YSAqLworCWZvciAoY250ciA9IDA7IGNudHIgPCA2OyBjbnRyKyspCisJCWVjY19jb2RlW2NudHJdID0gIG9vYl9idWZbZWNjX3Bvc1tjbnRyXV07CisKKwlpZiAoKG9vYl9idWZbZWNjdmFsaWRfcG9zXSAmIDB4MGYpICE9IDB4MGYpIHsKKyAJCW5hbmRfY2FsY3VsYXRlX2VjYyAoYnVmLCAmZWNjX2NhbGNbMF0pOworCQlpZiAobmFuZF9jb3JyZWN0X2RhdGEgKGJ1ZiwgJmVjY19jb2RlWzBdLCAmZWNjX2NhbGNbMF0pID09IC0xKSB7CisgCQkJcHJpbnRmICgiRUNDIEZhaWxlZCwgcGFnZSAweCUwOHhcbiIsIHBhZ2VfYWRkcik7CisJCQlmb3IgKHZhbD0wOyB2YWwgPDI1NjsgdmFsKyspCisJCQkJcHJpbnRmKCIleCAiLCBidWZbdmFsXSk7CisJCQlwcmludGYoIlxuIik7CisgIAkJCXJldHVybiAxOworIAkJfQorCX0KKwkKKwlpZiAoKG9vYl9idWZbZWNjdmFsaWRfcG9zXSAmIDB4ZjApICE9IDB4ZjApIHsKKyAJCW5hbmRfY2FsY3VsYXRlX2VjYyAoYnVmICsgMjU2LCAmZWNjX2NhbGNbMF0pOworCQlpZiAobmFuZF9jb3JyZWN0X2RhdGEgKGJ1ZiArIDI1NiwgJmVjY19jb2RlWzNdLCAmZWNjX2NhbGNbMF0pID09IC0xKSB7CisgCQkJcHJpbnRmICgiRUNDIEZhaWxlZCwgcGFnZSAweCUwOHhcbiIsIHBhZ2VfYWRkcisweDEwMCk7CisJCQlmb3IgKHZhbD0wOyB2YWwgPDI1NjsgdmFsKyspCisJCQkJcHJpbnRmKCIleCAiLCBidWZbdmFsKzI1Nl0pOworCQkJcHJpbnRmKCJcbiIpOworICAJCQlyZXR1cm4gMTsKKyAJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBmcm9tIHRoZSAxNiBieXRlcyBvZiBvb2IgZGF0YSB0aGF0IGNvcnJlc3BvbmQgdG8gYSA1MTIgYnl0ZSBwYWdlLgorICovCitzdGF0aWMgaW50IG5hbmRfcmVhZF9vb2IodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcikKK3sKKwl1MTYgdmFsOworCWludCBjbnRyOworICAgIAkKKyAgCU5BTkRfRU5BQkxFX0NFKCk7ICAvKiBzZXQgcGluIGxvdyAqLworCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFET09CKTsKKyAJTmFuRF9BZGRyZXNzKEFERFJfQ09MVU1OX1BBR0UsIHBhZ2VfYWRkcik7CisJTkFORF9XQUlUX1JFQURZKCk7CisKKy8qCWRvIHsKKwkJKih2b2xhdGlsZSB1MzIgKikoMHg2ODAwQTA3YykgPSBOQU5EX0NNRF9TVEFUVVM7CisJICB2YWwgPSAqKHZvbGF0aWxlIHUzMiAqKSgweDY4MDBBMDg0KTsKKwkgIHByaW50ZigidmFsID0gJXhcbiIsIHZhbCk7CQorCX0gd2hpbGUgKCh2YWwgJiAweDQwKSAhPSAweDQwKTsKKyovCisJLyogdGhlIGFib3ZlIGNvZGUgZnJvbSBPU1RCb290IGRvZXNuJ3Qgd29yaywgd2UgdXNlIGRlbGF5ICovCisJZGVsYXkoNTAwKTsgLyogd2UgZ28gdGhyb3VnaCBORkMgbmVlZCBhIGJpZ2dlciBkZWxheS4gMjAwIGlzIG5vdCBlbm91Z2ggKi8KKyAKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgODsgY250cisrKXsKKwkJdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCSpidWYrKyA9IHZhbCAmIDB4ZmY7CisJCSpidWYrKyA9IHZhbCA+PiA4OworICAJfQorICAKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKwlOQU5EX0RJU0FCTEVfQ0UoKTsgIC8qIHNldCBwaW4gaGlnaCAqLworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9NYWtlZmlsZSBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL29uZW5hbmQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2MTk1YwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL29uZW5hbmQvTWFrZWZpbGUKQEAgLTAsMCArMSw0NSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBTYW1zdW5nIEVsZWN0cm9uaWNzLgorIyBLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJOj0gJChvYmopbGlib25lbmFuZC5hCisKK0NPQkpTLXkJOj0gb25lbmFuZC5vCisKK0NPQkpTCTo9ICQoQ09CSlMteSkKK1NSQ1MJOj0gJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorCithbGw6CSQoTElCKQorCiskKExJQik6ICQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZC5jIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzZjcwNgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZC5jCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA1IFNhbXN1bmcgRWxlY3Ryb25pcworICogS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpbmNsdWRlICJvbmVuYW5kX3JlZ3MuaCIKKworI2lmIGRlZmluZWQoQ0ZHX01NQ19PTkVOQU5EKSB8fCBkZWZpbmVkKENGR19HUE1DX09ORU5BTkQpCisjZGVmaW5lIG9uZW5hbmRfcmVhZHcoYSkJKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoYSkpCisjZGVmaW5lIG9uZW5hbmRfd3JpdGV3KHYsIGEpCSgoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShhKSkgPSAodTE2KSAodikpCisKKyNkZWZpbmUgU0FNU1VOR19NRlJfSUQJCTB4RUMKKyNkZWZpbmUgS0ZNMUcxNlEyQV9ERVZfSUQJMHgzMAorI2RlZmluZSBLRk4yRzE2UTJBX0RFVl9JRAkweDQwCisKKworI2RlZmluZSBUSElTX09ORU5BTkQoYSkJCShPTkVOQU5EX0FERFIgKyAoYSkpCisKKyNkZWZpbmUgUkVBRF9JTlRFUlJVUFQoKQkJCQkJCVwKKwlvbmVuYW5kX3JlYWR3KFRISVNfT05FTkFORChPTkVOQU5EX1JFR19JTlRFUlJVUFQpKQorCisjZGVmaW5lIFJFQURfQ1RSTF9TVEFUVVMoKQkJCQkJCVwKKwlvbmVuYW5kX3JlYWR3KFRISVNfT05FTkFORChPTkVOQU5EX1JFR19DVFJMX1NUQVRVUykpCisKKyNkZWZpbmUgUkVBRF9FQ0NfU1RBVFVTKCkJCQkJCQlcCisJb25lbmFuZF9yZWFkdyhUSElTX09ORU5BTkQoT05FTkFORF9SRUdfRUNDX1NUQVRVUykpCisJCisjZGVmaW5lIFNFVF9FTUlGU19DU19DT05GSUcodikJCQkJCVwKKwkoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKE9NQVBfRU1JRlNfQ1NfQ09ORklHKSA9ICh2KSkKKworI2RlZmluZSBvbmVuYW5kX2Jsb2NrX2FkZHJlc3MoYmxvY2spCQkoYmxvY2spCisjZGVmaW5lIG9uZW5hbmRfc2VjdG9yX2FkZHJlc3MocGFnZSkJCShwYWdlIDw8IDIpCisjZGVmaW5lIG9uZW5hbmRfYnVmZmVyX2FkZHJlc3MoKQkJKCgxIDw8IDMpIDw8IDgpCisjZGVmaW5lIG9uZW5hbmRfYnVmZmVycmFtX2FkZHJlc3MoYmxvY2spCSgwKQorCisjaWYgZGVmaW5lZChDRkdfU1lOQ19CVVJTVF9SRUFEKSAmJiBkZWZpbmVkKENPTkZJR19PTUFQMTYxMCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc3luY19idXJzdF9yZWFkKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHZhbHVlOworCXZhbHVlID0gMAorCQl8ICgweDEgPDwgMTUpCQkvKiBSZWFkIE1vZGU6IFN5bmNocm9ub3VzICovCisJCXwgKDB4NCA8PCAxMikJCS8qIEJ1cnN0IFJlYWQgTGF0ZW5jeTogNCBjeWNsZXMgKi8KKwkJfCAoMHg0IDw8IDkpCQkvKiBCdXJzdCBMZW5ndGg6IDggd29yZCAqLworCQl8ICgweDEgPDwgNykJCS8qIFJEWSBzaWduYWwgcGxhcml0eSAqLworCQl8ICgweDEgPDwgNikJCS8qIElOVCBzaWduYWwgcGxhcml0eSAqLworCQl8ICgweDEgPDwgNSkJCS8qIEkvTyBidWZmZXIgZW5hYmxlICovCisJCTsKKwlvbmVuYW5kX3dyaXRldyh2YWx1ZSwgVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX1NZU19DRkcxKSk7CisKKwl2YWx1ZSA9IDAKKwkJfCAoNCA8PCAxNikJCS8qIFN5bmNocm9ub3VzIEJ1cnN0IFJlYWQgKi8KKwkJfCAoMSA8PCAxMikJCS8qIFBHV1NUL1dFTEVOICovCisJCXwgKDEgPDwgOCkJCS8qIFdSV1NUICovCisJCXwgKDQgPDwgNCkJCS8qIFJEV1NUICovCisJCXwgKDEgPDwgMCkJCS8qIEZDTEtESVYgPT4gNDhNSHogKi8KKwkJOworCVNFVF9FTUlGU19DU19DT05GSUcodmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2FzeW5jX3JlYWQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJdmFsdWUgPSAwCisJCXwgKDB4MCA8PCAxNSkJCS8qIFJlYWQgTW9kZTogQXN5bmNocm9ub3VzICovCisJCXwgKDB4NCA8PCAxMikJCS8qIEJ1cnN0IFJlYWQgTGF0ZW5jeTogNCBjeWNsZXMgKi8KKwkJfCAoMHgwIDw8IDkpCQkvKiBCdXJzdCBMZW5ndGg6IGNvbnRpbnVvdXMgKi8KKwkJfCAoMHgxIDw8IDcpCQkvKiBSRFkgc2lnbmFsIHBsYXJpdHkgKi8KKwkJfCAoMHgxIDw8IDYpCQkvKiBJTlQgc2lnbmFsIHBsYXJpdHkgKi8KKwkJfCAoMHgwIDw8IDUpCQkvKiBJL08gYnVmZmVyIGRpc2FibGUgKi8KKwkJOworCW9uZW5hbmRfd3JpdGV3KHZhbHVlLCBUSElTX09ORU5BTkQoT05FTkFORF9SRUdfU1lTX0NGRzEpKTsKKworCXZhbHVlID0gMAorCQl8ICgwIDw8IDE2KQkJLyogQXN5bmNocm9ub3VzIFJlYWQgKi8KKwkJfCAoMSA8PCAxMikJCS8qIFBHV1NUL1dFTEVOICovCisJCXwgKDEgPDwgOCkJCS8qIFdSV1NUICovCisJCXwgKDMgPDwgNCkJCS8qIFJEV1NUICovCisJCXwgKDEgPDwgMCkJCS8qIEZDTEtESVYgPT4gNDhNSHogKi8KKwkJOworCVNFVF9FTUlGU19DU19DT05GSUcodmFsdWUpOworfQorI2Vsc2UKKyNkZWZpbmUgc2V0X3N5bmNfYnVyc3RfcmVhZCguLi4pCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc2V0X2FzeW5jX3JlYWQoLi4uKQkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKK2ludAorb25lbmFuZF9jaGlwKCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBtZl9pZCwgZGV2X2lkOworCW1mX2lkID0gKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX01BTlVGQUNUVVJFUl9JRCkpKTsKKwlkZXZfaWQgPSAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShUSElTX09ORU5BTkQoT05FTkFORF9SRUdfREVWSUNFX0lEKSkpOworCisJaWYobWZfaWQgPT0gU0FNU1VOR19NRlJfSUQpIHsKKwkJaWYgKGRldl9pZCA9PSBLRk0xRzE2UTJBX0RFVl9JRCkgeworCQlwcmludGYoIkRldGVjdGVkIFNhbXN1bmcgTXV4T25lTkFORDFHIEZsYXNoIFxyXG4iKTsKKwkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoZGV2X2lkID09IEtGTjJHMTZRMkFfREVWX0lEKSB7CisJCQlwcmludGYoIkRldGVjdGVkIFNhbXN1bmcgTXV4T25lTkFORDJHIEZsYXNoIFxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIgT05FTkFORCBGbGFzaCB1bnN1cHBvcnRlZFxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJPTkVOQU5EIEZsYXNoIFVuc3VwcG9ydGVkXHJcbiIpOworCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qIHJlYWQgYSBwYWdlIHdpdGggRUNDICovCitzdGF0aWMgaW5saW5lIGludCBvbmVuYW5kX3JlYWRfcGFnZSh1bG9uZyBibG9jaywgdWxvbmcgcGFnZSwgdV9jaGFyICpidWYpCit7CisJdW5zaWduZWQgbG9uZyAqYmFzZTsKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DUFkzMgorCXVuc2lnbmVkIGludCBvZmZzZXQsIHZhbHVlOworCXVuc2lnbmVkIGxvbmcgKnA7CisJdW5zaWduZWQgaW50IGN0cmwsIGVjYzsKKwl1bnNpZ25lZCBzaG9ydCBiYm1hcmtlcjsKKyNlbmRpZgorCisJb25lbmFuZF93cml0ZXcob25lbmFuZF9ibG9ja19hZGRyZXNzKGJsb2NrKSwKKwkJVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MxKSk7CisKKwlvbmVuYW5kX3dyaXRldyhvbmVuYW5kX3NlY3Rvcl9hZGRyZXNzKHBhZ2UpLAorCQlUSElTX09ORU5BTkQoT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzgpKTsKKworCW9uZW5hbmRfd3JpdGV3KG9uZW5hbmRfYnVmZmVyX2FkZHJlc3MoKSwKKwkJVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX1NUQVJUX0JVRkZFUikpOworCisJb25lbmFuZF93cml0ZXcob25lbmFuZF9idWZmZXJyYW1fYWRkcmVzcyhibG9jayksCisJCVRISVNfT05FTkFORChPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTMikpOworCisJb25lbmFuZF93cml0ZXcoT05FTkFORF9JTlRfQ0xFQVIsIFRISVNfT05FTkFORChPTkVOQU5EX1JFR19JTlRFUlJVUFQpKTsKKworCW9uZW5hbmRfd3JpdGV3KE9ORU5BTkRfQ01EX1JFQUQsIFRISVNfT05FTkFORChPTkVOQU5EX1JFR19DT01NQU5EKSk7CisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNQ1BZMzIKKyAJcCA9ICh1bnNpZ25lZCBsb25nICopIGJ1ZjsKKyNlbmRpZgorCWJhc2UgPSAodW5zaWduZWQgbG9uZyAqKSAoT05FTkFORF9BRERSICsgT05FTkFORF9EQVRBUkFNKTsKKworCXdoaWxlICghKFJFQURfSU5URVJSVVBUKCkgJiBPTkVOQU5EX0lOVF9NQVNURVIpKQorCQljb250aW51ZTsKKwkvKiBDaGVjayBpZiB0aGUgYmxvY2sgaXMgYmFkLiBCYWQgYmxvY2sgbWFya2VycyAgICAqLworCS8qIGFyZSBzdG9yZWQgaW4gc3BhcmUgYXJlYSBvZiAxc3Qgb3IgMm5kIHBhZ2UgKi8KKwlpZiAoKHBhZ2UgPT0gMCkgfHwgKHBhZ2UgPT0gMSkpCisJeworCSAgICB1bnNpZ25lZCBsb25nICpzcGFyZUFyZWEgPSAodW5zaWduZWQgbG9uZyAqKSAoT05FTkFORF9BRERSICsgT05FTkFORF9TUEFSRVJBTSk7CisJICAgIGJibWFya2VyID0gKnNwYXJlQXJlYTsKKyAgICAgICAgICAgIC8qIGZvciBiYWQgYmxvY2sgbWFya2VycyAqLworICAgICAgICAgICAgaWYgKGJibWFya2VyICE9IDB4RkZGRil7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisJfQorCisJY3RybCA9IFJFQURfQ1RSTF9TVEFUVVMoKTsKKwkKKwlpZiAoY3RybCAmIE9ORU5BTkRfQ1RSTF9FUlJPUikgeworCQloYW5nKCk7CisJfQorCQorCWlmIChSRUFEX0lOVEVSUlVQVCgpICYgT05FTkFORF9JTlRfUkVBRCkgeworCisJCWVjYyA9IFJFQURfRUNDX1NUQVRVUygpOworCQlpZiAoZWNjICYgT05FTkFORF9FQ0NfMkJJVF9BTEwpIHsKKwkJCWhhbmcoKTsKKwkJfQorCX0KKwkKKyNpZmRlZiBfX0hBVkVfQVJDSF9NRU1DUFkzMgorCS8qIDMyIGJ5dGVzIGJvdW5kYXJ5IG1lbW9yeSBjb3B5ICovCisJbWVtY3B5MzIoYnVmLCBiYXNlLCBPTkVOQU5EX1BBR0VfU0laRSk7CisjZWxzZQorCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgKE9ORU5BTkRfUEFHRV9TSVpFID4+IDIpOyBvZmZzZXQrKykgeworCQl2YWx1ZSA9ICooYmFzZSArIG9mZnNldCk7CisJCSpwKysgPSB2YWx1ZTsKKyAJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBPTkVOQU5EX1NUQVJUX1BBR0UJCTAKKyNkZWZpbmUgT05FTkFORF9QQUdFU19QRVJfQkxPQ0sJCTY0CisKKy8qKgorICogb25lbmFuZF9yZWFkX2Jsb2NrIC0gUmVhZCBhIGJsb2NrIGRhdGEgdG8gYnVmCisgKiBAcmV0dXJuIDAgb24gc3VjZXNzCisgKi8gCisKK2ludCBvbmVuYW5kX3JlYWRfYmxvY2sodW5zaWduZWQgY2hhciAqYnVmLCB1bG9uZyBibG9jaykKK3sKKwlpbnQgcGFnZSwgb2Zmc2V0ID0gMDsKKworCXNldF9zeW5jX2J1cnN0X3JlYWQoKTsKKworCS8qIE5PVEU6IHlvdSBtdXN0IHJlYWQgcGFnZSBmcm9tIHBhZ2UgMSBvZiBibG9jayAwICovCisJLyogcmVhZCB0aGUgYmxvY2sgcGFnZSBieSBwYWdlKi8KKwlmb3IgKHBhZ2UgPSBPTkVOQU5EX1NUQVJUX1BBR0U7CisJICAgIHBhZ2UgPCBPTkVOQU5EX1BBR0VTX1BFUl9CTE9DSzsgcGFnZSsrKSB7CisKKwkJaWYgKG9uZW5hbmRfcmVhZF9wYWdlKGJsb2NrLCBwYWdlLCBidWYgKyBvZmZzZXQpKXsKKwkJICAgIHNldF9hc3luY19yZWFkKCk7CisJCSAgICByZXR1cm4gMTsKKwkJfQorCisJCW9mZnNldCArPSBPTkVOQU5EX1BBR0VfU0laRTsKKwl9CisKKwlzZXRfYXN5bmNfcmVhZCgpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19NTUNfT05FTkFORCkgfHwgZGVmaW5lZChDRkdfR1BNQ19PTkVOQU5EKSAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX3JlZ3MuaCBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhY2M4YwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9yZWdzLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9tdGQvb25lbmFuZF9yZWdzLmgKKyAqCisgKiAgT25lTkFORCBSZWdpc3RlciBoZWFkZXIgZmlsZQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX09ORU5BTkRfUkVHX0gKKyNkZWZpbmUgX19PTkVOQU5EX1JFR19ICisKKy8qIE1lbW9yeSBBZGRyZXNzIE1hcCBUcmFuc2xhdGlvbiAoV29yZCBvcmRlcikgKi8KKyNkZWZpbmUgT05FTkFORF9NRU1PUllfTUFQKHgpCQkoKHgpIDw8IDEpCisKKy8qCisgKiBFeHRlcm5hbCBCdWZmZXJSQU0gYXJlYQorICovCisjZGVmaW5lCU9ORU5BTkRfQk9PVFJBTQkJCU9ORU5BTkRfTUVNT1JZX01BUCgweDAwMDApCisjZGVmaW5lCU9ORU5BTkRfREFUQVJBTQkJCU9ORU5BTkRfTUVNT1JZX01BUCgweDAyMDApCisjZGVmaW5lCU9ORU5BTkRfU1BBUkVSQU0JCU9ORU5BTkRfTUVNT1JZX01BUCgweDgwMTApCisKKy8qCisgKiBPbmVOQU5EIFJlZ2lzdGVycworICovCisjZGVmaW5lIE9ORU5BTkRfUkVHX01BTlVGQUNUVVJFUl9JRAlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDAwKQorI2RlZmluZSBPTkVOQU5EX1JFR19ERVZJQ0VfSUQJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYwMDEpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1ZFUlNJT05fSUQJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYwMDIpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0RBVEFfQlVGRkVSX1NJWkUJT05FTkFORF9NRU1PUllfTUFQKDB4RjAwMykKKyNkZWZpbmUgT05FTkFORF9SRUdfQk9PVF9CVUZGRVJfU0laRQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDA0KQorI2RlZmluZSBPTkVOQU5EX1JFR19OVU1fQlVGRkVSUwkJT05FTkFORF9NRU1PUllfTUFQKDB4RjAwNSkKKyNkZWZpbmUgT05FTkFORF9SRUdfVEVDSE5PTE9HWQkJT05FTkFORF9NRU1PUllfTUFQKDB4RjAwNikKKworI2RlZmluZSBPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTMQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMTAwKQorI2RlZmluZSBPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTMglPTkVOQU5EX01FTU9SWV9NQVAoMHhGMTAxKQorI2RlZmluZSBPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTMwlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMTAyKQorI2RlZmluZSBPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTNAlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMTAzKQorI2RlZmluZSBPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTNQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMTA0KQorI2RlZmluZSBPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTNglPTkVOQU5EX01FTU9SWV9NQVAoMHhGMTA1KQorI2RlZmluZSBPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTNwlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMTA2KQorI2RlZmluZSBPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTOAlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMTA3KQorCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0JVRkZFUglPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjAwKQorI2RlZmluZSBPTkVOQU5EX1JFR19DT01NQU5ECQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjIwKQorI2RlZmluZSBPTkVOQU5EX1JFR19TWVNfQ0ZHMQkJT05FTkFORF9NRU1PUllfTUFQKDB4RjIyMSkKKyNkZWZpbmUgT05FTkFORF9SRUdfU1lTX0NGRzIJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyMjIpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0NUUkxfU1RBVFVTCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjQwKQorI2RlZmluZSBPTkVOQU5EX1JFR19JTlRFUlJVUFQJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyNDEpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0JMT0NLX0FERFJFU1MJT05FTkFORF9NRU1PUllfTUFQKDB4RjI0QykKKyNkZWZpbmUgT05FTkFORF9SRUdfRU5EX0JMT0NLX0FERFJFU1MJT05FTkFORF9NRU1PUllfTUFQKDB4RjI0RCkKKyNkZWZpbmUgT05FTkFORF9SRUdfV1BfU1RBVFVTCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjRFKQorCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19TVEFUVVMJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19NMAkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwMSkKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX1MwCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjAyKQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfTTEJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDMpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19TMQkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwNCkKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX00yCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjA1KQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfUzIJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDYpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19NMwkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwNykKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX1MzCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjA4KQorCisvKgorICogRGV2aWNlIElEIFJlZ2lzdGVyIEYwMDFoIChSKQorICovCisjZGVmaW5lIE9ORU5BTkRfREVWSUNFX0RFTlNJVFlfU0hJRlQJKDQpCisjZGVmaW5lIE9ORU5BTkRfREVWSUNFX0lTX0REUAkJKDEgPDwgMykKKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfSVNfREVNVVgJCSgxIDw8IDIpCisjZGVmaW5lIE9ORU5BTkRfREVWSUNFX1ZDQ19NQVNLCQkoMHgzKQorCisjZGVmaW5lIE9ORU5BTkRfREVWSUNFX0RFTlNJVFlfNTEyTWIJKDB4MDAyKQorCisvKgorICogVmVyc2lvbiBJRCBSZWdpc3RlciBGMDAyaCAoUikKKyAqLworI2RlZmluZSBPTkVOQU5EX1ZFUlNJT05fUFJPQ0VTU19TSElGVAkoOCkKKworLyoKKyAqIFN0YXJ0IEFkZHJlc3MgMSBGMTAwaCAoUi9XKQorICovCisjZGVmaW5lIE9ORU5BTkRfRERQX1NISUZUCQkoMTUpCisKKy8qCisgKiBTdGFydCBBZGRyZXNzIDggRjEwN2ggKFIvVykKKyAqLworI2RlZmluZSBPTkVOQU5EX0ZQQV9NQVNLCQkoMHgzZikKKyNkZWZpbmUgT05FTkFORF9GUEFfU0hJRlQJCSgyKQorI2RlZmluZSBPTkVOQU5EX0ZTQV9NQVNLCQkoMHgwMykKKworLyoKKyAqIFN0YXJ0IEJ1ZmZlciBSZWdpc3RlciBGMjAwaCAoUi9XKQorICovCisjZGVmaW5lIE9ORU5BTkRfQlNBX01BU0sJCSgweDAzKQorI2RlZmluZSBPTkVOQU5EX0JTQV9TSElGVAkJKDgpCisjZGVmaW5lIE9ORU5BTkRfQlNBX0JPT1RSQU0JCSgwIDw8IDIpCisjZGVmaW5lIE9ORU5BTkRfQlNBX0RBVEFSQU0wCQkoMiA8PCAyKQorI2RlZmluZSBPTkVOQU5EX0JTQV9EQVRBUkFNMQkJKDMgPDwgMikKKyNkZWZpbmUgT05FTkFORF9CU0NfTUFTSwkJKDB4MDMpCisKKy8qCisgKiBDb21tYW5kIFJlZ2lzdGVyIEYyMjBoIChSL1cpCisgKi8KKyNkZWZpbmUgT05FTkFORF9DTURfUkVBRAkJKDB4MDApCisjZGVmaW5lIE9ORU5BTkRfQ01EX1JFQURPT0IJCSgweDEzKQorI2RlZmluZSBPTkVOQU5EX0NNRF9QUk9HCQkoMHg4MCkKKyNkZWZpbmUgT05FTkFORF9DTURfUFJPR09PQgkJKDB4MUEpCisjZGVmaW5lIE9ORU5BTkRfQ01EX1VOTE9DSwkJKDB4MjMpCisjZGVmaW5lIE9ORU5BTkRfQ01EX0xPQ0sJCSgweDJBKQorI2RlZmluZSBPTkVOQU5EX0NNRF9MT0NLX1RJR0hUCQkoMHgyQykKKyNkZWZpbmUgT05FTkFORF9DTURfRVJBU0UJCSgweDk0KQorI2RlZmluZSBPTkVOQU5EX0NNRF9SRVNFVAkJKDB4RjApCisjZGVmaW5lIE9ORU5BTkRfQ01EX1JFQURJRAkJKDB4OTApCisKKy8qIE5PVEU6IFRob3NlIGFyZSBub3QgKlJFQUwqIGNvbW1hbmRzICovCisjZGVmaW5lIE9ORU5BTkRfQ01EX0JVRkZFUlJBTQkJKDB4MTk3OCkKKworLyoKKyAqIFN5c3RlbSBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgRjIyMWggKFIsIFIvVykKKyAqLworI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX1NZTkNfUkVBRAkoMSA8PCAxNSkKKyNkZWZpbmUgT05FTkFORF9TWVNfQ0ZHMV9CUkwJCSgxMikKKyNkZWZpbmUgT05FTkFORF9TWVNfQ0ZHMV9CTAkJKDkpCisjZGVmaW5lIE9ORU5BTkRfU1lTX0NGRzFfTk9fRUNDCQkoMSA8PCA4KQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX1JEWQkJKDEgPDwgNykKKyNkZWZpbmUgT05FTkFORF9TWVNfQ0ZHMV9JTlQJCSgxIDw8IDYpCisjZGVmaW5lIE9ORU5BTkRfU1lTX0NGRzFfSU9CRQkJKDEgPDwgNSkKKyNkZWZpbmUgT05FTkFORF9TWVNfQ0ZHMV9SRFlfQ09ORgkoMSA8PCA0KQorCisvKgorICogQ29udHJvbGxlciBTdGF0dXMgUmVnaXN0ZXIgRjI0MGggKFIpCisgKi8KKyNkZWZpbmUgT05FTkFORF9DVFJMX09OR08JCSgxIDw8IDE1KQorI2RlZmluZSBPTkVOQU5EX0NUUkxfTE9DSwkJKDEgPDwgMTQpCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9MT0FECQkoMSA8PCAxMykKKyNkZWZpbmUgT05FTkFORF9DVFJMX1BST0dSQU0JCSgxIDw8IDEyKQorI2RlZmluZSBPTkVOQU5EX0NUUkxfRVJBU0UJCSgxIDw8IDExKQorI2RlZmluZSBPTkVOQU5EX0NUUkxfRVJST1IJCSgxIDw8IDEwKQorI2RlZmluZSBPTkVOQU5EX0NUUkxfUlNUQgkJKDEgPDwgNykKKworLyoKKyAqIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgRjI0MWggKFIpCisgKi8KKyNkZWZpbmUgT05FTkFORF9JTlRfTUFTVEVSCQkoMSA8PCAxNSkKKyNkZWZpbmUgT05FTkFORF9JTlRfUkVBRAkJKDEgPDwgNykKKyNkZWZpbmUgT05FTkFORF9JTlRfV1JJVEUJCSgxIDw8IDYpCisjZGVmaW5lIE9ORU5BTkRfSU5UX0VSQVNFCQkoMSA8PCA1KQorI2RlZmluZSBPTkVOQU5EX0lOVF9SRVNFVAkJKDEgPDwgNCkKKyNkZWZpbmUgT05FTkFORF9JTlRfQ0xFQVIJCSgwIDw8IDApCisKKy8qCisgKiBOQU5EIEZsYXNoIFdyaXRlIFByb3RlY3Rpb24gU3RhdHVzIFJlZ2lzdGVyIEYyNEVoIChSKQorICovCisjZGVmaW5lIE9ORU5BTkRfV1BfVVMJCQkoMSA8PCAyKQorI2RlZmluZSBPTkVOQU5EX1dQX0xTCQkJKDEgPDwgMSkKKyNkZWZpbmUgT05FTkFORF9XUF9MVFMJCQkoMSA8PCAwKQorCisvKgorICogRUNDIFN0YXR1cyBSZWlnc2VyIEZGMDBoIChSKQorICovCisjZGVmaW5lIE9ORU5BTkRfRUNDXzFCSVQJCSgxIDw8IDApCisjZGVmaW5lIE9ORU5BTkRfRUNDXzJCSVQJCSgxIDw8IDEpCisjZGVmaW5lIE9ORU5BTkRfRUNDXzJCSVRfQUxMCQkoMHhBQUFBKQorCisjZW5kaWYJLyogX19PTkVOQU5EX1JFR19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL3J0Yy9NYWtlZmlsZSBiL3gtbG9hZGVyL2RyaXZlcnMvcnRjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMzE0NGYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL3J0Yy9NYWtlZmlsZQpAQCAtMCwwICsxLDQ2IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMS0yMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWJydGMuYQorCitDT0JKUy15ICs9IGRhdGUubworCitDT0JKUwk6PSAkKHNvcnQgJChDT0JKUy15KSkKK1NSQ1MJOj0gJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorCithbGw6CSQoTElCKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9ydGMvZGF0ZS5jIGIveC1sb2FkZXIvZHJpdmVycy9ydGMvZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMGFkOTIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL3J0Yy9kYXRlLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIERhdGUgJiBUaW1lIHN1cHBvcnQgZm9yIFBoaWxpcHMgUENGODU2MyBSVEMKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHJ0Yy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpIHx8IGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkKKworI2RlZmluZSBGRUJSVUFSWQkJMgorI2RlZmluZQlTVEFSVE9GVElNRQkJMTk3MAorI2RlZmluZSBTRUNEQVkJCQk4NjQwMEwKKyNkZWZpbmUgU0VDWVIJCQkoU0VDREFZICogMzY1KQorI2RlZmluZQlsZWFweWVhcih5ZWFyKQkJKCh5ZWFyKSAlIDQgPT0gMCkKKyNkZWZpbmUJZGF5c19pbl95ZWFyKGEpCQkobGVhcHllYXIoYSkgPyAzNjYgOiAzNjUpCisjZGVmaW5lCWRheXNfaW5fbW9udGgoYSkJKG1vbnRoX2RheXNbKGEpIC0gMV0pCisKK3N0YXRpYyBpbnQgbW9udGhfZGF5c1sxMl0gPSB7CisJMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMQorfTsKKworLyoKKyAqIFRoaXMgb25seSB3b3JrcyBmb3IgdGhlIEdyZWdvcmlhbiBjYWxlbmRhciAtIGkuZS4gYWZ0ZXIgMTc1MiAoaW4gdGhlIFVLKQorICovCit2b2lkIEdyZWdvcmlhbkRheShzdHJ1Y3QgcnRjX3RpbWUgKiB0bSkKK3sKKwlpbnQgbGVhcHNUb0RhdGU7CisJaW50IGxhc3RZZWFyOworCWludCBkYXk7CisJaW50IE1vbnRoT2Zmc2V0W10gPSB7IDAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNCB9OworCisJbGFzdFllYXI9dG0tPnRtX3llYXItMTsKKworCS8qCisJICogTnVtYmVyIG9mIGxlYXAgY29ycmVjdGlvbnMgdG8gYXBwbHkgdXAgdG8gZW5kIG9mIGxhc3QgeWVhcgorCSAqLworCWxlYXBzVG9EYXRlID0gbGFzdFllYXIvNCAtIGxhc3RZZWFyLzEwMCArIGxhc3RZZWFyLzQwMDsKKworCS8qCisJICogVGhpcyB5ZWFyIGlzIGEgbGVhcCB5ZWFyIGlmIGl0IGlzIGRpdmlzaWJsZSBieSA0IGV4Y2VwdCB3aGVuIGl0IGlzCisJICogZGl2aXNpYmxlIGJ5IDEwMCB1bmxlc3MgaXQgaXMgZGl2aXNpYmxlIGJ5IDQwMAorCSAqCisJICogZS5nLiAxOTA0IHdhcyBhIGxlYXAgeWVhciwgMTkwMCB3YXMgbm90LCAxOTk2IGlzLCBhbmQgMjAwMCB3aWxsIGJlCisJICovCisJaWYoKHRtLT50bV95ZWFyJTQ9PTApICYmCisJICAgKCh0bS0+dG1feWVhciUxMDAhPTApIHx8ICh0bS0+dG1feWVhciU0MDA9PTApKSAmJgorCSAgICh0bS0+dG1fbW9uPjIpKSB7CisJCS8qCisJCSAqIFdlIGFyZSBwYXN0IEZlYi4gMjkgaW4gYSBsZWFwIHllYXIKKwkJICovCisJCWRheT0xOworCX0gZWxzZSB7CisJCWRheT0wOworCX0KKworCWRheSArPSBsYXN0WWVhciozNjUgKyBsZWFwc1RvRGF0ZSArIE1vbnRoT2Zmc2V0W3RtLT50bV9tb24tMV0gKyB0bS0+dG1fbWRheTsKKworCXRtLT50bV93ZGF5PWRheSU3OworfQorCit2b2lkIHRvX3RtKGludCB0aW0sIHN0cnVjdCBydGNfdGltZSAqIHRtKQoreworCXJlZ2lzdGVyIGludCAgICBpOworCXJlZ2lzdGVyIGxvbmcgICBobXMsIGRheTsKKworCWRheSA9IHRpbSAvIFNFQ0RBWTsKKwlobXMgPSB0aW0gJSBTRUNEQVk7CisKKwkvKiBIb3VycywgbWludXRlcywgc2Vjb25kcyBhcmUgZWFzeSAqLworCXRtLT50bV9ob3VyID0gaG1zIC8gMzYwMDsKKwl0bS0+dG1fbWluID0gKGhtcyAlIDM2MDApIC8gNjA7CisJdG0tPnRtX3NlYyA9IChobXMgJSAzNjAwKSAlIDYwOworCisJLyogTnVtYmVyIG9mIHllYXJzIGluIGRheXMgKi8KKwlmb3IgKGkgPSBTVEFSVE9GVElNRTsgZGF5ID49IGRheXNfaW5feWVhcihpKTsgaSsrKSB7CisJCWRheSAtPSBkYXlzX2luX3llYXIoaSk7CisJfQorCXRtLT50bV95ZWFyID0gaTsKKworCS8qIE51bWJlciBvZiBtb250aHMgaW4gZGF5cyBsZWZ0ICovCisJaWYgKGxlYXB5ZWFyKHRtLT50bV95ZWFyKSkgeworCQlkYXlzX2luX21vbnRoKEZFQlJVQVJZKSA9IDI5OworCX0KKwlmb3IgKGkgPSAxOyBkYXkgPj0gZGF5c19pbl9tb250aChpKTsgaSsrKSB7CisJCWRheSAtPSBkYXlzX2luX21vbnRoKGkpOworCX0KKwlkYXlzX2luX21vbnRoKEZFQlJVQVJZKSA9IDI4OworCXRtLT50bV9tb24gPSBpOworCisJLyogRGF5cyBhcmUgd2hhdCBpcyBsZWZ0IG92ZXIgKCsxKSBmcm9tIGFsbCB0aGF0LiAqLworCXRtLT50bV9tZGF5ID0gZGF5ICsgMTsKKworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBkYXkgb2Ygd2VlaworCSAqLworCUdyZWdvcmlhbkRheSh0bSk7Cit9CisKKy8qIENvbnZlcnRzIEdyZWdvcmlhbiBkYXRlIHRvIHNlY29uZHMgc2luY2UgMTk3MC0wMS0wMSAwMDowMDowMC4KKyAqIEFzc3VtZXMgaW5wdXQgaW4gbm9ybWFsIGRhdGUgZm9ybWF0LCBpLmUuIDE5ODAtMTItMzEgMjM6NTk6NTkKKyAqID0+IHllYXI9MTk4MCwgbW9uPTEyLCBkYXk9MzEsIGhvdXI9MjMsIG1pbj01OSwgc2VjPTU5LgorICoKKyAqIFtGb3IgdGhlIEp1bGlhbiBjYWxlbmRhciAod2hpY2ggd2FzIHVzZWQgaW4gUnVzc2lhIGJlZm9yZSAxOTE3LAorICogQnJpdGFpbiAmIGNvbG9uaWVzIGJlZm9yZSAxNzUyLCBhbnl3aGVyZSBlbHNlIGJlZm9yZSAxNTgyLAorICogYW5kIGlzIHN0aWxsIGluIHVzZSBieSBzb21lIGNvbW11bml0aWVzKSBsZWF2ZSBvdXQgdGhlCisgKiAteWVhci8xMDAreWVhci80MDAgdGVybXMsIGFuZCBhZGQgMTAuXQorICoKKyAqIFRoaXMgYWxnb3JpdGhtIHdhcyBmaXJzdCBwdWJsaXNoZWQgYnkgR2F1c3MgKEkgdGhpbmspLgorICoKKyAqIFdBUk5JTkc6IHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyZmxvdyBvbiAyMTA2LTAyLTA3IDA2OjI4OjE2IG9uCisgKiBtYWNoaW5lcyB3ZXJlIGxvbmcgaXMgMzItYml0ISAoSG93ZXZlciwgYXMgdGltZV90IGlzIHNpZ25lZCwgd2UKKyAqIHdpbGwgYWxyZWFkeSBnZXQgcHJvYmxlbXMgYXQgb3RoZXIgcGxhY2VzIG9uIDIwMzgtMDEtMTkgMDM6MTQ6MDgpCisgKi8KK3Vuc2lnbmVkIGxvbmcKK21rdGltZSAodW5zaWduZWQgaW50IHllYXIsIHVuc2lnbmVkIGludCBtb24sCisJdW5zaWduZWQgaW50IGRheSwgdW5zaWduZWQgaW50IGhvdXIsCisJdW5zaWduZWQgaW50IG1pbiwgdW5zaWduZWQgaW50IHNlYykKK3sKKwlpZiAoMCA+PSAoaW50KSAobW9uIC09IDIpKSB7CS8qIDEuLjEyIC0+IDExLDEyLDEuLjEwICovCisJCW1vbiArPSAxMjsJCS8qIFB1dHMgRmViIGxhc3Qgc2luY2UgaXQgaGFzIGxlYXAgZGF5ICovCisJCXllYXIgLT0gMTsKKwl9CisKKwlyZXR1cm4gKCgoCisJCSh1bnNpZ25lZCBsb25nKSAoeWVhci80IC0geWVhci8xMDAgKyB5ZWFyLzQwMCArIDM2Nyptb24vMTIgKyBkYXkpICsKKwkJCXllYXIqMzY1IC0gNzE5NDk5CisJICAgICkqMjQgKyBob3VyIC8qIG5vdyBoYXZlIGhvdXJzICovCisJICApKjYwICsgbWluIC8qIG5vdyBoYXZlIG1pbnV0ZXMgKi8KKwkpKjYwICsgc2VjOyAvKiBmaW5hbGx5IHNlY29uZHMgKi8KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZSBiL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ODRiZTQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNi0yMDA5CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk6PSAkKG9iailsaWJzZXJpYWwuYQorCitDT0JKUy15ICs9IG5zMTY1NTAubworQ09CSlMteSArPSBzZXJpYWwubworCitDT0JKUwk6PSAkKHNvcnQgJChDT0JKUy15KSkKK1NSQ1MJOj0gJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorCithbGw6CSQoTElCKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvbnMxNjU1MC5jIGIveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvbnMxNjU1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTVjMTIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9uczE2NTUwLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqICAKKyAqIENPTTEgTlMxNjU1MCBzdXBwb3J0CisgKiBvcmlnaW5hbGx5IGZyb20gbGludXggc291cmNlIChhcmNoL3BwYy9ib290L25zMTY1NTAuYykKKyAqIG1vZGlmaWVkIHRvIHVzZSBDRkdfSVNBX01FTSBhbmQgbmV3IGRlZmluZXMKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBDRkdfUFJJTlRGCisjaWZkZWYgQ0ZHX05TMTY1NTAKKworI2luY2x1ZGUgPG5zMTY1NTAuaD4KKworI2RlZmluZSBMQ1JWQUwgTENSXzhOMQkJCQkJLyogOCBkYXRhLCAxIHN0b3AsIG5vIHBhcml0eSAqLworI2RlZmluZSBNQ1JWQUwgKE1DUl9EVFIgfCBNQ1JfUlRTKQkJCS8qIFJUUy9EVFIgKi8KKyNkZWZpbmUgRkNSVkFMIChGQ1JfRklGT19FTiB8IEZDUl9SWFNSIHwgRkNSX1RYU1IpCS8qIENsZWFyICYgZW5hYmxlIEZJRk9zICovCisKK3ZvaWQgTlMxNjU1MF9pbml0IChOUzE2NTUwX3QgY29tX3BvcnQsIGludCBiYXVkX2Rpdmlzb3IpCit7CisJY29tX3BvcnQtPmllciA9IDB4MDA7CisjaWZkZWYgQ09ORklHX09NQVAKKwljb21fcG9ydC0+bWRyMSA9IDB4NzsgICAvKiBtb2RlIHNlbGVjdCByZXNldCBUTDE2Qzc1MCovCisjZW5kaWYKKwljb21fcG9ydC0+bGNyID0gTENSX0JLU0UgfCBMQ1JWQUw7CisJY29tX3BvcnQtPmRsbCA9IGJhdWRfZGl2aXNvciAmIDB4ZmY7CisJY29tX3BvcnQtPmRsbSA9IChiYXVkX2Rpdmlzb3IgPj4gOCkgJiAweGZmOworCWNvbV9wb3J0LT5sY3IgPSBMQ1JWQUw7CisJY29tX3BvcnQtPm1jciA9IE1DUlZBTDsKKwljb21fcG9ydC0+ZmNyID0gRkNSVkFMOworI2lmIGRlZmluZWQoQ09ORklHX09NQVApCisJY29tX3BvcnQtPm1kcjEgPSAwOwkvKiBzZWxlY3QgdWFydCBtb2RlICovCisjZW5kaWYKK30KKwordm9pZCBOUzE2NTUwX3JlaW5pdCAoTlMxNjU1MF90IGNvbV9wb3J0LCBpbnQgYmF1ZF9kaXZpc29yKQoreworCWNvbV9wb3J0LT5pZXIgPSAweDAwOworCWNvbV9wb3J0LT5sY3IgPSBMQ1JfQktTRTsKKwljb21fcG9ydC0+ZGxsID0gYmF1ZF9kaXZpc29yICYgMHhmZjsKKwljb21fcG9ydC0+ZGxtID0gKGJhdWRfZGl2aXNvciA+PiA4KSAmIDB4ZmY7CisJY29tX3BvcnQtPmxjciA9IExDUlZBTDsKKwljb21fcG9ydC0+bWNyID0gTUNSVkFMOworCWNvbV9wb3J0LT5mY3IgPSBGQ1JWQUw7Cit9CisKK3ZvaWQgTlMxNjU1MF9wdXRjIChOUzE2NTUwX3QgY29tX3BvcnQsIGNoYXIgYykKK3sKKwl3aGlsZSAoKGNvbV9wb3J0LT5sc3IgJiBMU1JfVEhSRSkgPT0gMCk7CisJY29tX3BvcnQtPnRociA9IGM7Cit9CisKK2NoYXIgTlMxNjU1MF9nZXRjIChOUzE2NTUwX3QgY29tX3BvcnQpCit7CisJd2hpbGUgKChjb21fcG9ydC0+bHNyICYgTFNSX0RSKSA9PSAwKTsKKwlyZXR1cm4gKGNvbV9wb3J0LT5yYnIpOworfQorCitpbnQgTlMxNjU1MF90c3RjIChOUzE2NTUwX3QgY29tX3BvcnQpCit7CisJcmV0dXJuICgoY29tX3BvcnQtPmxzciAmIExTUl9EUikgIT0gMCk7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9zZXJpYWwuYyBiL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZWNmMmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9zZXJpYWwuYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogUm9iIFRheWxvciwgRmx5aW5nIFBpZyBTeXN0ZW1zLiByb2J0QGZseWluZ3BpZy5jb20uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ0ZHX1BSSU5URgorI2lmZGVmIENGR19OUzE2NTUwX1NFUklBTAorCisjaW5jbHVkZSA8bnMxNjU1MC5oPgorI2lmZGVmIENGR19OUzg3MzA4CisjaW5jbHVkZSA8bnM4NzMwOC5oPgorI2VuZGlmCisKKyNpZiBDT05GSUdfQ09OU19JTkRFWCA9PSAxCitzdGF0aWMgTlMxNjU1MF90IGNvbnNvbGUgPSAoTlMxNjU1MF90KSBDRkdfTlMxNjU1MF9DT00xOworI2VsaWYgQ09ORklHX0NPTlNfSU5ERVggPT0gMgorc3RhdGljIE5TMTY1NTBfdCBjb25zb2xlID0gKE5TMTY1NTBfdCkgQ0ZHX05TMTY1NTBfQ09NMjsKKyNlbGlmIENPTkZJR19DT05TX0lOREVYID09IDMKK3N0YXRpYyBOUzE2NTUwX3QgY29uc29sZSA9IChOUzE2NTUwX3QpIENGR19OUzE2NTUwX0NPTTM7CisjZWxpZiBDT05GSUdfQ09OU19JTkRFWCA9PSA0CitzdGF0aWMgTlMxNjU1MF90IGNvbnNvbGUgPSAoTlMxNjU1MF90KSBDRkdfTlMxNjU1MF9DT000OworI2Vsc2UKKyNlcnJvciBubyB2YWxpZCBjb25zb2xlIGRlZmluZWQKKyNlbmRpZgorCitzdGF0aWMgaW50IGNhbGNfZGl2aXNvciAodm9pZCkKK3sKKy8vCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworI2lmZGVmIENPTkZJR19PTUFQMTUxMAorCS8qIElmIGNhbid0IGNsZWFubHkgY2xvY2sgMTE1MjAwIHNldCBkaXYgdG8gMSAqLworCWlmICgoQ0ZHX05TMTY1NTBfQ0xLID09IDEyMDAwMDAwKSAmJiAoQ09ORklHX0JBVURSQVRFID09IDExNTIwMCkpIHsKKwkJY29uc29sZS0+b3NjXzEybV9zZWwgPSBPU0NfMTJNX1NFTDsJLyogZW5hYmxlIDYuNSAqIGRpdmlzb3IgKi8KKwkJcmV0dXJuICgxKTsJCQkJLyogcmV0dXJuIDEgZm9yIGJhc2UgZGl2aXNvciAqLworCX0KKwljb25zb2xlLT5vc2NfMTJtX3NlbCA9IDA7CQkJLyogY2xlYXIgaWYgcHJldmlzb3VseSBzZXQgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX09NQVAxNjEwKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQMTcxMCkKKwkvKiBJZiBjYW4ndCBjbGVhbmx5IGNsb2NrIDExNTIwMCBzZXQgZGl2IHRvIDEgKi8KKwlpZiAoKENGR19OUzE2NTUwX0NMSyA9PSA0ODAwMDAwMCkgJiYgKENPTkZJR19CQVVEUkFURSA9PSAxMTUyMDApKSB7CisJCXJldHVybiAoMjYpOwkJLyogcmV0dXJuIDI2IGZvciBiYXNlIGRpdmlzb3IgKi8KKwl9CisjZW5kaWYKKwlyZXR1cm4gKENGR19OUzE2NTUwX0NMSyAvIDE2IC8gQ09ORklHX0JBVURSQVRFKTsKK30KKworaW50IHNlcmlhbF9pbml0ICh2b2lkKQoreworCWludCBjbG9ja19kaXZpc29yID0gY2FsY19kaXZpc29yKCk7CisKKyNpZmRlZiBDRkdfTlM4NzMwOAorCWluaXRpYWxpc2VfbnM4NzMwOCgpOworI2VuZGlmCisKKwlOUzE2NTUwX2luaXQoY29uc29sZSwgY2xvY2tfZGl2aXNvcik7CisKKwlyZXR1cm4gKDApOworfQorCit2b2lkCitzZXJpYWxfcHV0Yyhjb25zdCBjaGFyIGMpCit7CisJaWYgKGMgPT0gJ1xuJykKKwkJTlMxNjU1MF9wdXRjKGNvbnNvbGUsICdccicpOworCisJTlMxNjU1MF9wdXRjKGNvbnNvbGUsIGMpOworfQorCit2b2lkCitzZXJpYWxfcHV0cyAoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpIHsKKwkJc2VyaWFsX3B1dGMgKCpzKyspOworCX0KK30KKworCitpbnQKK3NlcmlhbF9nZXRjKHZvaWQpCit7CisJcmV0dXJuIE5TMTY1NTBfZ2V0Yyhjb25zb2xlKTsKK30KKworaW50CitzZXJpYWxfdHN0Yyh2b2lkKQoreworCXJldHVybiBOUzE2NTUwX3RzdGMoY29uc29sZSk7Cit9CisKK3ZvaWQKK3NlcmlhbF9zZXRicmcgKHZvaWQpCit7CisJaW50IGNsb2NrX2Rpdmlzb3I7CisKKyAgICBjbG9ja19kaXZpc29yID0gY2FsY19kaXZpc29yKCk7CisJTlMxNjU1MF9yZWluaXQoY29uc29sZSwgY2xvY2tfZGl2aXNvcik7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL3VzYi9NYWtlZmlsZSBiL3gtbG9hZGVyL2RyaXZlcnMvdXNiL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OWQxMDEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL3VzYi9NYWtlZmlsZQpAQCAtMCwwICsxLDQ2IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNi0yMDA5CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk6PSAkKG9iailsaWJ1c2IuYQorCitDT0JKUy15ICs9IHVzYi5vCisKK0NPQkpTCTo9ICQoc29ydCAkKENPQkpTLXkpKQorU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChMSUIpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL3VzYi91c2IuYyBiL3gtbG9hZGVyL2RyaXZlcnMvdXNiL3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjQ2N2YKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL3VzYi91c2IuYwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIFVTQiBib290bG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJpY2sgQnJvbnNvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+ICAgICAgICAvKiBnZXQgY2hpcCBhbmQgYm9hcmQgZGVmcyAqLworI2luY2x1ZGUgInVzYi5oIgorCitleHRlcm4gdm9pZCB1ZGVsYXkgKHVuc2lnbmVkIGxvbmcgdXNlY3MpOworCit0eXBlZGVmIGludCBib290X29zX2ZuICh2b2lkKTsKKworLyogc2VuZCBhIHBhY2tldCB2aWEgVVNCICovCitpbnQgdXNiX3NlbmRfcGFja2V0KHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgaW50IHBhY2tldF9zaXplKQorICAgeworICAgaW50IHJldCA9IDA7CisKKyAgIGlmICghKCpwZXJpX3R4Y3NyICYgTVVTQl9UWENTUl9UWFBLVFJEWSkpCisgICAgICAgeworICAgICAgIHVuc2lnbmVkIGludCBjbnRyOworCisgICAgICAgZm9yIChjbnRyID0gMDsgY250ciA8IHBhY2tldF9zaXplOyBjbnRyKyspCisgICAgICAgICAgICpidWxrX2ZpZm8gPSBidWZmZXJbY250cl07CisKKyAgICAgICAqcGVyaV90eGNzciB8PSBNVVNCX1RYQ1NSX1RYUEtUUkRZOworCisgICAgICAgcmV0ID0gcGFja2V0X3NpemU7CisgICAgICAgfQorICAgcmV0dXJuIHJldDsKKyAgIH0KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGludCB1c2JfcmVjdiAodTggKmJ1ZmZlciwgaW50IHNpemUpCit7CisgICBpbnQgY250cjsKKyAgIHUxNiBjb3VudCA9IDA7CisKKyAgIGlmICgqcGVyaV9yeGNzciAmIE1VU0JfUlhDU1JfUlhQS1RSRFkpCisgICAgICAgeworICAgICAgIGNvdW50ID0gKnJ4Y291bnQ7CisgICAgICAgZm9yIChjbnRyID0gMDsgY250ciA8IGNvdW50OyBjbnRyKyspCisgICAgICAgICAgIHsKKyAgICAgICAgICAgKmJ1ZmZlcisrID0gKmJ1bGtfZmlmbzsKKyAgICAgICAgICAgfQorICAgICAgICAgICAvKiBDbGVhciB0aGUgUlhQS1RSRFkgYml0ICovCisgICAgICAgKnBlcmlfcnhjc3IgJj0gfk1VU0JfUlhDU1JfUlhQS1RSRFk7CisgICAgICAgfQorICAgcmV0dXJuIGNvdW50OyAgLyogRklYTUUgKi8KK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdXNiX291dGJ1ZmZlcltSWF9FTkRQT0lOVF9NQVhJTVVNX1BBQ0tFVF9TSVpFXzJfMF07CisKK2ludCB1c2Jfc2VuZF9idWZmZXIodW5zaWduZWQgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgYnVmZmVyX3NpemUpCit7CisgICAgaW50IGJ1ZmZlcl9pbmRleCA9IDAsCisgICAgICAgIHBhY2tldF9zaXplLAorICAgICAgICByZXR2YWwgPSAwOworCisgICAgd2hpbGUgKChidWZmZXJfaW5kZXggPCBidWZmZXJfc2l6ZSkgJiYKKyAgICAgICAgICAgKHJldHZhbCA9PSAwKSkgeworICAgICAgICBwYWNrZXRfc2l6ZSA9IFJYX0VORFBPSU5UX01BWElNVU1fUEFDS0VUX1NJWkVfMl8wOworICAgICAgICBpZiAoKGJ1ZmZlcl9pbmRleCArIHBhY2tldF9zaXplKSA+IGJ1ZmZlcl9zaXplKQorICAgICAgICAgICAgcGFja2V0X3NpemUgPSBidWZmZXJfc2l6ZSAtIGJ1ZmZlcl9pbmRleDsKKworICAgICAgICByZXR2YWwgPSB1c2Jfc2VuZF9wYWNrZXQoJmJ1ZmZlcltidWZmZXJfaW5kZXhdLCBwYWNrZXRfc2l6ZSk7CisgICAgICAgIGlmIChyZXR2YWwgPT0gcGFja2V0X3NpemUpIHsKKyAgICAgICAgICAgIGJ1ZmZlcl9pbmRleCArPSBwYWNrZXRfc2l6ZTsKKyAgICAgICAgICAgIHJldHZhbCA9IDA7CisgICAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIGJ1ZmZlcl9pbmRleDsKK30KKworc3RhdGljIHZvaWQgdXNiX21zZyAodW5zaWduZWQgaW50IGNtZCwgY29uc3QgY2hhciAqbXNnKQorICAgeworICAgdW5zaWduZWQgY2hhciAqcF9jaGFyID0gdXNiX291dGJ1ZmZlcjsKKworICAgKiAoaW50ICopIHBfY2hhciA9IGNtZDsKKyAgIHBfY2hhciArPSBzaXplb2YgKGNtZCk7CisgICBpZiAobXNnKQorICAgICAgIHsKKyAgICAgICB3aGlsZSAoKm1zZykKKyAgICAgICAgICAgKnBfY2hhcisrPSAqbXNnKys7CisgICAgICAgKnBfY2hhcisrPSAwOworICAgICAgIH0KKyAgIHVzYl9zZW5kX3BhY2tldCAodXNiX291dGJ1ZmZlciwgcF9jaGFyIC0gdXNiX291dGJ1ZmZlcik7CisgICB9CisKK3N0YXRpYyB2b2lkIHVzYl9jb2RlICh1bnNpZ25lZCBpbnQgY21kLCB1MzIgY29kZTEsIHUzMiBjb2RlMikKKyAgIHsKKyAgIHVuc2lnbmVkIGludCAqcF9pbnQgPSAodW5zaWduZWQgaW50ICopIHVzYl9vdXRidWZmZXI7CisKKyAgICpwX2ludCsrID0gY21kOworICAgKnBfaW50KysgPSBjb2RlMTsKKyAgICpwX2ludCsrID0gY29kZTI7CisgICB1c2Jfc2VuZF9wYWNrZXQgKHVzYl9vdXRidWZmZXIsICgodW5zaWduZWQgY2hhciAqKSBwX2ludCkgLSB1c2Jfb3V0YnVmZmVyKTsKKyAgIH0KKwordm9pZCBkb191c2IgKHZvaWQpCisgICB7CisgICBib290X29zX2ZuICpib290X2ZuOworICAgaW50IHJlczsKKyAgIHUzMiB1c2JfaW5idWZmZXJbUlhfRU5EUE9JTlRfTUFYSU1VTV9QQUNLRVRfU0laRV8yXzBdOworICAgdTMyIHRvdGFsOworICAgdTggKmFkZHI7CisgICB1MzIgYnl0ZXM7CisgICBpbnQgY250ciA9IDA7CisKKyAgIHVzYl9tc2cgKFVTQkxPQURfQ01EX0ZJTEVfUkVRLCAiZmlsZSByZXEiKTsKKyAgIHdoaWxlKCsrY250ciA8IDIwMDAwMCkgIC8qIHRyeSBmb3IgMSBzZWNvbmQgdGhlbiBiYWlsIG91dCAqLworICAgICAgIHsKKyAgICAgICByZXMgPSB1c2JfcmVjdiAoKHU4ICopIHVzYl9pbmJ1ZmZlciwgc2l6ZW9mICh1c2JfaW5idWZmZXIpKTsKKyAgICAgICBpZiAoKHJlcyA9PSBVU0JMT0FEX0NNRF9SRVNQT05TRV9MRU4pICYmICh1c2JfaW5idWZmZXJbMF0gPT0gVVNCTE9BRF9DTURfRklMRSkpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHRvdGFsID0gdXNiX2luYnVmZmVyWzFdOyAgLyogZ2V0IHNpemUgYW5kIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgIGFkZHIgPSAodTggKikgdXNiX2luYnVmZmVyWzJdOworICAgICAgICAgICAgICAgcHJpbnRmICgiVVNCTE9BRF9DTURfRklMRTogJTh1QiBAIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICBhZGRyKTsKKyAgICAgICAgICAgICAgIHVzYl9jb2RlIChVU0JMT0FEX0NNRF9FQ0hPX1NaLCB0b3RhbCwgMCk7CisKKyAgICAgICAgICAgICAgIGJ5dGVzID0gMDsKKyAgICAgICAgICAgICAgIHdoaWxlIChieXRlcyA8IHRvdGFsKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBieXRlcyArPSB1c2JfcmVjdigmKCh1OCAqKWFkZHIpW2J5dGVzXSwgKHRvdGFsIC0gYnl0ZXMpKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB1c2JfY29kZSAoVVNCTE9BRF9DTURfUkVQT1JUX1NaLCB0b3RhbCwgMCk7ICAvKiB0ZWxsIGhpbSB3ZSBnb3QgdGhpcyBtYW55IGJ5dGVzICovCisgICAgICAgICAgICAgICBwcmludGYgKCJSZWNlaXZlZCBmaWxlIE9LXG4iKTsKKyAgICAgICAgICAgICAgIHVzYl9tc2cgKFVTQkxPQURfQ01EX0ZJTEVfUkVRLCAiZmlsZSByZXEiKTsgIC8qIHNlZSBpZiB0aGV5IGhhdmUgYW5vdGhlciBmaWxlIGZvciB1cyAqLworICAgICAgICAgICAgICAgY250ciA9IDA7CisgICAgICAgICAgIH0KKyAgICAgICBlbHNlIGlmICgocmVzID09IFVTQkxPQURfQ01EX1JFU1BPTlNFX0xFTikgJiYgKHVzYl9pbmJ1ZmZlclswXSA9PSBVU0JMT0FEX0NNRF9KVU1QKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcHJpbnRmICgiVVNCTE9BRF9DTURfSlVNUDogYWRkciA9IDB4JXhcbiIsIHVzYl9pbmJ1ZmZlclsxXSk7CisgICAgICAgICAgICAgICBib290X2ZuID0gKGJvb3Rfb3NfZm4gKikgdXNiX2luYnVmZmVyWzFdOworICAgICAgICAgICAgICAgYm9vdF9mbigpOyAgLyogZ28gdG8gdS1ib290IGFuZCBtYXliZSBrZXJuZWwgKi8KKyAgICAgICAgICAgfQorICAgICAgIGVsc2UgaWYgKHJlcyA+IDApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHByaW50ZiAoIlVucmVjb2duaXplZCAlZEIgY29tbWFuZDogJWMlYyVjJWNcbiIsIHJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKil1c2JfaW5idWZmZXIpWzBdLCAoKGNoYXIqKXVzYl9pbmJ1ZmZlcilbMV0sICgoY2hhciopdXNiX2luYnVmZmVyKVsyXSwgKChjaGFyKil1c2JfaW5idWZmZXIpWzNdKTsKKyAgICAgICAgICAgfQorCisgICAgICAgdWRlbGF5KDEwMDApOyAgLyogZGVsYXkgMSBtcyAtLSBzdXNwZWN0IGNsb2NrcyBhcmVuJ3QgY29uZmlndXJlZCBhcyBleHBlY3RlZCwgcmVzdWx0aW5nIGluIGEgc2lnbmlmaWNhbnRseSBzaG9ydGVyIGRlbGF5ICovCisgICAgICAgfQorICAgICAgIHByaW50ZigiVVNCIGRvbmVcbiIpOworICAgICAgIGhhbmcoKTsKKyAgIH0KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvdXNiL3VzYi5oIGIveC1sb2FkZXIvZHJpdmVycy91c2IvdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2NGVhMwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvdXNiL3VzYi5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBVU0IgYm9vdGxvYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSaWNrIEJyb25zb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfVVNCX0hfCisjZGVmaW5lIF9VU0JfSF8KKworI2RlZmluZSBPTUFQMzRYWF9VU0JfQkFTRSAgICAgKE9NQVAzNFhYX0NPUkVfTDRfSU9fQkFTRSArIDB4QUIwMDApCisKKyNkZWZpbmUgT01BUDM0WFhfVVNCX0VQKG4pICAgICAgICAgKE9NQVAzNFhYX1VTQl9CQVNFICsgMHgxMDAgKyAweDEwKihuKSkKKworI2RlZmluZSBNVVNCX1JYQ1NSICAgICAweDA2CisjZGVmaW5lIE1VU0JfUlhDT1VOVCAgICAgICAweDA4CisjZGVmaW5lIE1VU0JfVFhDU1IgICAgIDB4MDIKKyNkZWZpbmUgTVVTQl9GSUZPU0laRSAgICAgIDB4MEYKKyNkZWZpbmUgT01BUDM0WFhfVVNCX1JYQ1NSKG4pICAgICAgKE9NQVAzNFhYX1VTQl9FUChuKSArIE1VU0JfUlhDU1IpCisjZGVmaW5lIE9NQVAzNFhYX1VTQl9SWENPVU5UKG4pICAgIChPTUFQMzRYWF9VU0JfRVAobikgKyBNVVNCX1JYQ09VTlQpCisjZGVmaW5lIE9NQVAzNFhYX1VTQl9UWENTUihuKSAgICAgIChPTUFQMzRYWF9VU0JfRVAobikgKyBNVVNCX1RYQ1NSKQorI2RlZmluZSBPTUFQMzRYWF9VU0JfRklGT1NJWkUobikgICAoT01BUDM0WFhfVVNCX0VQKG4pICsgTVVTQl9GSUZPU0laRSkKKyNkZWZpbmUgT01BUDM0WFhfVVNCX0ZJRk8obikgICAgICAgKE9NQVAzNFhYX1VTQl9CQVNFICsgMHgyMCArICgobikgKiA0KSkKKworLyogbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQlVMS19FTkRQT0lOVCAxCitzdGF0aWMgdm9sYXRpbGUgdTE2ICpwZXJpX3J4Y3NyID0gKHZvbGF0aWxlIHUxNiAqKSBPTUFQMzRYWF9VU0JfUlhDU1IoQlVMS19FTkRQT0lOVCk7CisjZGVmaW5lIE1VU0JfUlhDU1JfUlhQS1RSRFkgICAgICAgIDB4MDAwMQorc3RhdGljIHZvbGF0aWxlIHUxNiAqcnhjb3VudCAgICA9ICh2b2xhdGlsZSB1MTYgKikgT01BUDM0WFhfVVNCX1JYQ09VTlQoQlVMS19FTkRQT0lOVCk7CitzdGF0aWMgdm9sYXRpbGUgdTE2ICpwZXJpX3R4Y3NyID0gKHZvbGF0aWxlIHUxNiAqKSBPTUFQMzRYWF9VU0JfVFhDU1IoQlVMS19FTkRQT0lOVCk7CisjZGVmaW5lIE1VU0JfVFhDU1JfVFhQS1RSRFkgICAgICAgIDB4MDAwMQorc3RhdGljIHZvbGF0aWxlIHU4ICAqYnVsa19maWZvICA9ICh2b2xhdGlsZSB1OCAgKikgT01BUDM0WFhfVVNCX0ZJRk8oQlVMS19FTkRQT0lOVCk7CisKKy8qIEluIGhpZ2ggc3BlZWQgbW9kZSBwYWNrZXRzIGFyZSA1MTIKKyAgIEluIGZ1bGwgc3BlZWQgbW9kZSBwYWNrZXRzIGFyZSA2NCAqLworI2RlZmluZSBSWF9FTkRQT0lOVF9NQVhJTVVNX1BBQ0tFVF9TSVpFXzJfMCAgKDB4MDIwMCkKKyNkZWZpbmUgUlhfRU5EUE9JTlRfTUFYSU1VTV9QQUNLRVRfU0laRV8xXzEgICgweDAwNDApCisKKyNkZWZpbmUgTUlOKGEsYikgKCAoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworI2RlZmluZSBQQUNLNChhLGIsYyxkKSAgICAgKCgoZCk8PDI0KSB8ICgoYyk8PDE2KSB8ICgoYik8PDgpIHwgKGEpKQorI2RlZmluZSBVU0JMT0FEX0NNRF9GSUxFIFBBQ0s0KCdVJywgJ1MnLCAnQicsICdzJykgIC8qIHNlbmQgZmlsZSBzaXplICovCisjZGVmaW5lIFVTQkxPQURfQ01EX0pVTVAgUEFDSzQoJ1UnLCAnUycsICdCJywgJ2onKSAgLyogZ28gd2hlcmUgSSB0ZWxsIHlvdSAqLworI2RlZmluZSBVU0JMT0FEX0NNRF9GSUxFX1JFUSBQQUNLNCgnVScsICdTJywgJ0InLCAnZicpICAvKiBmaWxlIHJlcXVlc3QgKi8KKyNkZWZpbmUgVVNCTE9BRF9DTURfRUNIT19TWiBQQUNLNCgnVScsICdTJywgJ0InLCAnbicpICAvKiBlY2hvIGZpbGUgc2l6ZSAqLworI2RlZmluZSBVU0JMT0FEX0NNRF9SRVBPUlRfU1ogUEFDSzQoJ1UnLCAnUycsICdCJywgJ28nKSAgLyogcmVwb3J0IGZpbGUgc2l6ZSAqLworI2RlZmluZSBVU0JMT0FEX0NNRF9NRVNTQUdFIFBBQ0s0KCdVJywgJ1MnLCAnQicsICdtJykgIC8qIG1lc3NhZ2UgZm9yIGRlYnVnICovCisjZGVmaW5lIFVTQkxPQURfQ01EX05BTkRfRFVNUCBQQUNLNCgnVScsICdTJywgJ0InLCAnZCcpICAvKiBkdW1wIE5BTkQgKi8KKyNkZWZpbmUgVVNCTE9BRF9DTURfTkFORF9PT0JfRFVNUCBQQUNLNCgnVScsICdTJywgJ0InLCAnYicpICAvKiBkdW1wIE5BTkQgT09CICovCisjZGVmaW5lIFVTQkxPQURfQ01EX05BTkRfRFVNUF9TWiBQQUNLNCgnVScsICdTJywgJ0InLCAncicpICAvKiBkdW1wIHNpemUgKi8KKworI2RlZmluZSBVU0JMT0FEX0NNRF9SRVNQT05TRV9MRU4gMTIKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2ZzL01ha2VmaWxlIGIveC1sb2FkZXIvZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjQxOWI5OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2ZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisjCisKK1NVQkRJUlMJOj0gZmF0CisKKy5kZXBlbmQgYWxsOgorCUBmb3IgZGlyIGluICQoU1VCRElSUykgOyBkbyBcCisJCSQoTUFLRSkgLUMgJCRkaXIgJEAgOyBkb25lCmRpZmYgLS1naXQgYS94LWxvYWRlci9mcy9mYXQvTWFrZWZpbGUgYi94LWxvYWRlci9mcy9mYXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODdhZjczYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2ZzL2ZhdC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ1IEBACisjCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWJmYXQuYQorCitBT0JKUwk9CitDT0JKUwk9IGZhdC5vIGZpbGUubworCitTUkNTCTo9ICQoQU9CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKEFPQkpTKSAkKENPQkpTKSkKKworYWxsOgkkKExJQikgJChBT0JKUykKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZnMvZmF0L2ZhdC5jIGIveC1sb2FkZXIvZnMvZmF0L2ZhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzNjM4ODEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9mcy9mYXQvZmF0LmMKQEAgLTAsMCArMSw5MjggQEAKKy8qCisgKiBmYXQuYworICoKKyAqIFIvTyAoVilGQVQgMTIvMTYvMzIgZmlsZXN5c3RlbSBpbXBsZW1lbnRhdGlvbiBieSBNYXJjdXMgU3VuZGJlcmcKKyAqCisgKiAyMDAyLTA3LTI4IC0gcmpvbmVzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHBwY2Jvb3QgdjEuMS42CisgKiAyMDAzLTAzLTEwIC0ga2hhcnJpc0BuZXh1cy10ZWNoLm5ldCAtIHBvcnRlZCB0byB1Ym9vdAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+CisjaW5jbHVkZSA8ZmF0Lmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaWZkZWYgQ0ZHX0NNRF9GQVQKKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgdG8gbG93ZXJjYXNlLgorICovCitzdGF0aWMgdm9pZAorZG93bmNhc2UoY2hhciAqc3RyKQoreworCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKKwkJVE9MT1dFUigqc3RyKTsKKwkJc3RyKys7CisJfQorfQorCitzdGF0aWMgIGJsb2NrX2Rldl9kZXNjX3QgKmN1cl9kZXYgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFydF9vZmZzZXQgPSAwOworc3RhdGljIGludCBjdXJfcGFydCA9IDE7CisKKyNkZWZpbmUgRE9TX1BBUlRfVEJMX09GRlNFVAkweDFiZQorI2RlZmluZSBET1NfUEFSVF9NQUdJQ19PRkZTRVQJMHgxZmUKKyNkZWZpbmUgRE9TX0ZTX1RZUEVfT0ZGU0VUCTB4NTIKKworaW50IHN0cm5jbXAoY29uc3QgY2hhciAqIGNzLGNvbnN0IGNoYXIgKiBjdCxzaXplX3QgY291bnQpCit7CisgICAgICAgIHJlZ2lzdGVyIHNpZ25lZCBjaGFyIF9fcmVzID0gMDsKKworICAgICAgICB3aGlsZSAoY291bnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKF9fcmVzID0gKmNzIC0gKmN0KyspICE9IDAgfHwgISpjcysrKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBfX3JlczsKK30KKworY2hhciAqIHN0cmNweShjaGFyICogZGVzdCxjb25zdCBjaGFyICpzcmMpCit7CisgICAgICAgIGNoYXIgKnRtcCA9IGRlc3Q7CisKKyAgICAgICAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQorICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgKi87CisgICAgICAgIHJldHVybiB0bXA7Cit9CisKK2ludCBzdHJjbXAoY29uc3QgY2hhciAqIGNzLGNvbnN0IGNoYXIgKiBjdCkKK3sKKyAgICAgICAgcmVnaXN0ZXIgc2lnbmVkIGNoYXIgX19yZXM7CisKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoKF9fcmVzID0gKmNzIC0gKmN0KyspICE9IDAgfHwgISpjcysrKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX19yZXM7Cit9Cit2b2lkICogbWVtY3B5KHZvaWQgKiBkZXN0LGNvbnN0IHZvaWQgKnNyYyxzaXplX3QgY291bnQpCit7CisgICAgICAgIGNoYXIgKnRtcCA9IChjaGFyICopIGRlc3QsICpzID0gKGNoYXIgKikgc3JjOworCisgICAgICAgIHdoaWxlIChjb3VudC0tKQorICAgICAgICAgICAgICAgICp0bXArKyA9ICpzKys7CisKKyAgICAgICAgcmV0dXJuIGRlc3Q7Cit9CisKKworaW50IGRpc2tfcmVhZCAoX191MzIgc3RhcnRibG9jaywgX191MzIgZ2V0c2l6ZSwgX191OCAqIGJ1ZnB0cikKK3sKKwlzdGFydGJsb2NrICs9IHBhcnRfb2Zmc2V0OworCWlmIChjdXJfZGV2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlpZiAoY3VyX2Rldi0+YmxvY2tfcmVhZCkgeworCQlyZXR1cm4gY3VyX2Rldi0+YmxvY2tfcmVhZCAoY3VyX2Rldi0+ZGV2LCBzdGFydGJsb2NrLCBnZXRzaXplLCAodW5zaWduZWQgbG9uZyAqKWJ1ZnB0cik7CisJfQorCXJldHVybiAtMTsKK30KKworCitpbnQKK2ZhdF9yZWdpc3Rlcl9kZXZpY2UoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0X25vKQoreworCXVuc2lnbmVkIGNoYXIgYnVmZmVyW1NFQ1RPUl9TSVpFXTsKKworCWlmICghZGV2X2Rlc2MtPmJsb2NrX3JlYWQpCisJCXJldHVybiAtMTsKKwljdXJfZGV2PWRldl9kZXNjOworCS8qIGNoZWNrIGlmIHdlIGhhdmUgYSBNQlIgKG9uIGZsb3BwaWVzIHdlIGhhdmUgb25seSBhIFBCUikgKi8KKwlpZiAoZGV2X2Rlc2MtPmJsb2NrX3JlYWQgKGRldl9kZXNjLT5kZXYsIDAsIDEsICh1bG9uZyAqKSBidWZmZXIpICE9IDEpIHsKKwkJcHJpbnRmICgiKiogQ2FuJ3QgcmVhZCBmcm9tIGRldmljZSAlZCAqKlxuIiwgZGV2X2Rlc2MtPmRldik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGJ1ZmZlcltET1NfUEFSVF9NQUdJQ19PRkZTRVRdICE9IDB4NTUgfHwKKwkJYnVmZmVyW0RPU19QQVJUX01BR0lDX09GRlNFVCArIDFdICE9IDB4YWEpIHsKKwkJLyogbm8gc2lnbmF0dXJlIGZvdW5kICovCisJCXJldHVybiAtMTsKKwl9CisJaWYoIXN0cm5jbXAoKGNoYXIgKikmYnVmZmVyW0RPU19GU19UWVBFX09GRlNFVF0sIkZBVCIsMykpIHsKKwkJLyogb2ssIHdlIGFzc3VtZSB3ZSBhcmUgb24gYSBQQlIgb25seSAqLworCQljdXJfcGFydCA9IDE7CisJCXBhcnRfb2Zmc2V0PTA7CisJfQorCWVsc2UgeworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkgfHwgXAorICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTU1DKSB8fCBkZWZpbmVkKENPTkZJR19TWVNURU1BQ0UpCisJCWRpc2tfcGFydGl0aW9uX3QgaW5mbzsKKwkJaWYoIWdldF9wYXJ0aXRpb25faW5mbyhkZXZfZGVzYywgcGFydF9ubywgJmluZm8pKSB7CisJCQlwYXJ0X29mZnNldCA9IGluZm8uc3RhcnQ7CisJCQljdXJfcGFydCA9IHBhcnRfbm87CisJCX0KKwkJZWxzZSB7CisJCQlwcmludGYgKCIqKiBQYXJ0aXRpb24gJWQgbm90IHZhbGlkIG9uIGRldmljZSAlZCAqKlxuIixwYXJ0X25vLGRldl9kZXNjLT5kZXYpOworCQkJcmV0dXJuIC0xOworCQl9CisjZWxzZQorCQkvKiBGSVhNRSB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGUgc3RhcnQgYmxvY2sgb2YgdGhlCisJCSAqIHBhcnRpdGlvbiB3aGVyZSB0aGUgRE9TIEZTIHJlc2lkZXMuIFRoaXMgY2FuIGJlIGRvbmUKKwkJICogYnkgdXNpbmcgdGhlIGdldF9wYXJ0aXRpb25faW5mbyByb3V0aW5lLiBGb3IgdGhpcworCQkgKiBwdXJwb3NlIHRoZSBsaWJwYXJ0IG11c3QgYmUgaW5jbHVkZWQuCisJCSAqLworCQlwYXJ0X29mZnNldD02MzsKKwkJLy9wYXJ0X29mZnNldD0wOworCQljdXJfcGFydCA9IDE7CisjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEdldCB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIGEgZGlyZWN0b3J5IGRlbGltaXRlciAoJy8nIG9yICdcJykgaW4gYSBzdHJpbmcuCisgKiBSZXR1cm4gaW5kZXggaW50byBzdHJpbmcgaWYgZm91bmQsIC0xIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorZGlyZGVsaW0oY2hhciAqc3RyKQoreworCWNoYXIgKnN0YXJ0ID0gc3RyOworCisJd2hpbGUgKCpzdHIgIT0gJ1wwJykgeworCQlpZiAoSVNESVJERUxJTSgqc3RyKSkgcmV0dXJuIHN0ciAtIHN0YXJ0OworCQlzdHIrKzsKKwl9CisJcmV0dXJuIC0xOworfQorCisKKy8qCisgKiBNYXRjaCB2b2x1bWVfaW5mbyBmc190eXBlIHN0cmluZ3MuCisgKiBSZXR1cm4gMCBvbiBtYXRjaCwgLTEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50Citjb21wYXJlX3NpZ24oY2hhciAqc3RyMSwgY2hhciAqc3RyMikKK3sKKwljaGFyICplbmQgPSBzdHIxK1NJR05MRU47CisKKwl3aGlsZSAoc3RyMSAhPSBlbmQpIHsKKwkJaWYgKCpzdHIxICE9ICpzdHIyKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJc3RyMSsrOworCQlzdHIyKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEV4dHJhY3QgemVybyB0ZXJtaW5hdGVkIHNob3J0IG5hbWUgZnJvbSBhIGRpcmVjdG9yeSBlbnRyeS4KKyAqLworc3RhdGljIHZvaWQgZ2V0X25hbWUgKGRpcl9lbnRyeSAqZGlyZW50LCBjaGFyICpzX25hbWUpCit7CisJY2hhciAqcHRyOworCisJbWVtY3B5IChzX25hbWUsIGRpcmVudC0+bmFtZSwgOCk7CisJc19uYW1lWzhdID0gJ1wwJzsKKwlwdHIgPSBzX25hbWU7CisJd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnICcpCisJCXB0cisrOworCWlmIChkaXJlbnQtPmV4dFswXSAmJiBkaXJlbnQtPmV4dFswXSAhPSAnICcpIHsKKwkJKnB0ciA9ICcuJzsKKwkJcHRyKys7CisJCW1lbWNweSAocHRyLCBkaXJlbnQtPmV4dCwgMyk7CisJCXB0clszXSA9ICdcMCc7CisJCXdoaWxlICgqcHRyICYmICpwdHIgIT0gJyAnKQorCQkJcHRyKys7CisJfQorCSpwdHIgPSAnXDAnOworCWlmICgqc19uYW1lID09IERFTEVURURfRkxBRykKKwkJKnNfbmFtZSA9ICdcMCc7CisJZWxzZSBpZiAoKnNfbmFtZSA9PSBhUklORykKKwkJKnNfbmFtZSA9ICflJzsKKwlkb3duY2FzZSAoc19uYW1lKTsKK30KKworLyoKKyAqIEdldCB0aGUgZW50cnkgYXQgaW5kZXggJ2VudHJ5JyBpbiBhIEZBVCAoMTIvMTYvMzIpIHRhYmxlLgorICogT24gZmFpbHVyZSAweDAwIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgX191MzIKK2dldF9mYXRlbnQoZnNkYXRhICpteWRhdGEsIF9fdTMyIGVudHJ5KQoreworCV9fdTMyIGJ1Zm51bTsKKwlfX3UzMiBvZmZzZXQ7CisJX191MzIgcmV0ID0gMHgwMDsKKworCXN3aXRjaCAobXlkYXRhLT5mYXRzaXplKSB7CisJY2FzZSAzMjoKKwkJYnVmbnVtID0gZW50cnkgLyBGQVQzMkJVRlNJWkU7CisJCW9mZnNldCA9IGVudHJ5IC0gYnVmbnVtICogRkFUMzJCVUZTSVpFOworCQlicmVhazsKKwljYXNlIDE2OgorCQlidWZudW0gPSBlbnRyeSAvIEZBVDE2QlVGU0laRTsKKwkJb2Zmc2V0ID0gZW50cnkgLSBidWZudW0gKiBGQVQxNkJVRlNJWkU7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCWJ1Zm51bSA9IGVudHJ5IC8gRkFUMTJCVUZTSVpFOworCQlvZmZzZXQgPSBlbnRyeSAtIGJ1Zm51bSAqIEZBVDEyQlVGU0laRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBVbnN1cHBvcnRlZCBGQVQgc2l6ZSAqLworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBSZWFkIGEgbmV3IGJsb2NrIG9mIEZBVCBlbnRyaWVzIGludG8gdGhlIGNhY2hlLiAqLworCWlmIChidWZudW0gIT0gbXlkYXRhLT5mYXRidWZudW0pIHsKKwkJaW50IGdldHNpemUgPSBGQVRCVUZTSVpFL0ZTX0JMT0NLX1NJWkU7CisJCV9fdTggKmJ1ZnB0ciA9IChfX3U4ICopbXlkYXRhLT5mYXRidWY7CisJCV9fdTMyIGZhdGxlbmd0aCA9IG15ZGF0YS0+ZmF0bGVuZ3RoOworCQlfX3UzMiBzdGFydGJsb2NrID0gYnVmbnVtICogRkFUQlVGQkxPQ0tTOworCisJCWZhdGxlbmd0aCAqPSBTRUNUT1JfU0laRTsJLyogV2Ugd2FudCBpdCBpbiBieXRlcyBub3cgKi8KKwkJc3RhcnRibG9jayArPSBteWRhdGEtPmZhdF9zZWN0OwkvKiBPZmZzZXQgZnJvbSBzdGFydCBvZiBkaXNrICovCisKKwkJaWYgKGdldHNpemUgPiBmYXRsZW5ndGgpIGdldHNpemUgPSBmYXRsZW5ndGg7CisJCWlmIChkaXNrX3JlYWQoc3RhcnRibG9jaywgZ2V0c2l6ZSwgYnVmcHRyKSA8IDApIHsKKwkJCUZBVF9EUFJJTlQoIkVycm9yIHJlYWRpbmcgRkFUIGJsb2Nrc1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW15ZGF0YS0+ZmF0YnVmbnVtID0gYnVmbnVtOworCX0KKworCS8qIEdldCB0aGUgYWN0dWFsIGVudHJ5IGZyb20gdGhlIHRhYmxlICovCisJc3dpdGNoIChteWRhdGEtPmZhdHNpemUpIHsKKwljYXNlIDMyOgorCQlyZXQgPSBGQVQyQ1BVMzIoKChfX3UzMiopbXlkYXRhLT5mYXRidWYpW29mZnNldF0pOworCQlicmVhazsKKwljYXNlIDE2OgorCQlyZXQgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZnNldF0pOworCQlicmVhazsKKwljYXNlIDEyOiB7CisJCV9fdTMyIG9mZjE2ID0gKG9mZnNldCozKS80OworCQlfX3UxNiB2YWwxLCB2YWwyOworCisJCXN3aXRjaCAob2Zmc2V0ICYgMHgzKSB7CisJCWNhc2UgMDoKKwkJCXJldCA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2ZmMTZdKTsKKwkJCXJldCAmPSAweGZmZjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl2YWwxID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmYxNl0pOworCQkJdmFsMSAmPSAweGYwMDA7CisJCQl2YWwyID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmYxNisxXSk7CisJCQl2YWwyICY9IDB4MDBmZjsKKwkJCXJldCA9ICh2YWwyIDw8IDQpIHwgKHZhbDEgPj4gMTIpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXZhbDEgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2XSk7CisJCQl2YWwxICY9IDB4ZmYwMDsKKwkJCXZhbDIgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2KzFdKTsKKwkJCXZhbDIgJj0gMHgwMDBmOworCQkJcmV0ID0gKHZhbDIgPDwgOCkgfCAodmFsMSA+PiA4KTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlyZXQgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2XSk7OworCQkJcmV0ID0gKHJldCAmIDB4ZmZmMCkgPj4gNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJYnJlYWs7CisJfQorCUZBVF9EUFJJTlQoInJldDogJWQsIG9mZnNldDogJWRcbiIsIHJldCwgb2Zmc2V0KTsKKworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIFJlYWQgYXQgbW9zdCAnc2l6ZScgYnl0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGNsdXN0ZXIgaW50byAnYnVmZmVyJy4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorZ2V0X2NsdXN0ZXIoZnNkYXRhICpteWRhdGEsIF9fdTMyIGNsdXN0bnVtLCBfX3U4ICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgaWR4ID0gMDsKKwlfX3UzMiBzdGFydHNlY3Q7CisKKwlpZiAoY2x1c3RudW0gPiAwKSB7CisJCXN0YXJ0c2VjdCA9IG15ZGF0YS0+ZGF0YV9iZWdpbiArIGNsdXN0bnVtKm15ZGF0YS0+Y2x1c3Rfc2l6ZTsKKwl9IGVsc2UgeworCQlzdGFydHNlY3QgPSBteWRhdGEtPnJvb3RkaXJfc2VjdDsKKwl9CisKKwlpZiAoZGlza19yZWFkKHN0YXJ0c2VjdCwgc2l6ZS9GU19CTE9DS19TSVpFICwgYnVmZmVyKSA8IDApIHsKKwkJRkFUX0RQUklOVCgiRXJyb3IgcmVhZGluZyBkYXRhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZihzaXplICUgRlNfQkxPQ0tfU0laRSkgeworCQlfX3U4IHRtcGJ1ZltGU19CTE9DS19TSVpFXTsKKwkJaWR4PSBzaXplL0ZTX0JMT0NLX1NJWkU7CisJCWlmIChkaXNrX3JlYWQoc3RhcnRzZWN0ICsgaWR4LCAxLCB0bXBidWYpIDwgMCkgeworCQkJRkFUX0RQUklOVCgiRXJyb3IgcmVhZGluZyBkYXRhXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlidWZmZXIgKz0gaWR4KkZTX0JMT0NLX1NJWkU7CisKKwkJbWVtY3B5KGJ1ZmZlciwgdG1wYnVmLCBzaXplICUgRlNfQkxPQ0tfU0laRSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBSZWFkIGF0IG1vc3QgJ21heHNpemUnIGJ5dGVzIGZyb20gdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoICdkZW50cHRyJworICogaW50byAnYnVmZmVyJy4KKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEgb24gZmF0YWwgZXJyb3JzLgorICovCitzdGF0aWMgbG9uZworZ2V0X2NvbnRlbnRzKGZzZGF0YSAqbXlkYXRhLCBkaXJfZW50cnkgKmRlbnRwdHIsIF9fdTggKmJ1ZmZlciwKKwkgICAgIHVuc2lnbmVkIGxvbmcgbWF4c2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZpbGVzaXplID0gRkFUMkNQVTMyKGRlbnRwdHItPnNpemUpLCBnb3RzaXplID0gMDsKKwl1bnNpZ25lZCBpbnQgYnl0ZXNwZXJjbHVzdCA9IG15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIFNFQ1RPUl9TSVpFOworCV9fdTMyIGN1cmNsdXN0ID0gU1RBUlQoZGVudHB0cik7CisJX191MzIgZW5kY2x1c3QsIG5ld2NsdXN0OworCXVuc2lnbmVkIGxvbmcgYWN0c2l6ZTsKKworCUZBVF9EUFJJTlQoIkZpbGVzaXplOiAlbGQgYnl0ZXNcbiIsIGZpbGVzaXplKTsKKworCWlmIChtYXhzaXplID4gMCAmJiBmaWxlc2l6ZSA+IG1heHNpemUpIGZpbGVzaXplID0gbWF4c2l6ZTsKKworCUZBVF9EUFJJTlQoIlJlYWRpbmc6ICVsZCBieXRlc1xuIiwgZmlsZXNpemUpOworCisJYWN0c2l6ZT1ieXRlc3BlcmNsdXN0OworCWVuZGNsdXN0PWN1cmNsdXN0OworCWRvIHsKKwkJLyogc2VhcmNoIGZvciBjb25zZWN1dGl2ZSBjbHVzdGVycyAqLworCQl3aGlsZShhY3RzaXplIDwgZmlsZXNpemUpIHsKKwkJCW5ld2NsdXN0ID0gZ2V0X2ZhdGVudChteWRhdGEsIGVuZGNsdXN0KTsKKwkJCWlmKChuZXdjbHVzdCAtMSkhPWVuZGNsdXN0KQorCQkJCWdvdG8gZ2V0aXQ7CisJCQlpZiAobmV3Y2x1c3QgPD0gMHgwMDAxIHx8IG5ld2NsdXN0ID49IDB4ZmZmMCkgeworCQkJCUZBVF9EUFJJTlQoImN1cmNsdXN0OiAweCV4XG4iLCBuZXdjbHVzdCk7CisJCQkJRkFUX0RQUklOVCgiSW52YWxpZCBGQVQgZW50cnlcbiIpOworCQkJCXJldHVybiBnb3RzaXplOworCQkJfQorCQkJZW5kY2x1c3Q9bmV3Y2x1c3Q7CisJCQlhY3RzaXplKz0gYnl0ZXNwZXJjbHVzdDsKKwkJfQorCQkvKiBhY3RzaXplID49IGZpbGUgc2l6ZSAqLworCQlhY3RzaXplIC09IGJ5dGVzcGVyY2x1c3Q7CisJCS8qIGdldCByZW1haW5pbmcgY2x1c3RlcnMgKi8KKwkJaWYgKGdldF9jbHVzdGVyKG15ZGF0YSwgY3VyY2x1c3QsIGJ1ZmZlciwgKGludClhY3RzaXplKSAhPSAwKSB7CisJCQlGQVRfRVJST1IoIkVycm9yIHJlYWRpbmcgY2x1c3RlclxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyogZ2V0IHJlbWFpbmluZyBieXRlcyAqLworCQlnb3RzaXplICs9IChpbnQpYWN0c2l6ZTsKKwkJZmlsZXNpemUgLT0gYWN0c2l6ZTsKKwkJYnVmZmVyICs9IGFjdHNpemU7CisJCWFjdHNpemU9IGZpbGVzaXplOworCQlpZiAoZ2V0X2NsdXN0ZXIobXlkYXRhLCBlbmRjbHVzdCwgYnVmZmVyLCAoaW50KWFjdHNpemUpICE9IDApIHsKKwkJCUZBVF9FUlJPUigiRXJyb3IgcmVhZGluZyBjbHVzdGVyXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlnb3RzaXplKz1hY3RzaXplOworCQlyZXR1cm4gZ290c2l6ZTsKK2dldGl0OgorCQlpZiAoZ2V0X2NsdXN0ZXIobXlkYXRhLCBjdXJjbHVzdCwgYnVmZmVyLCAoaW50KWFjdHNpemUpICE9IDApIHsKKwkJCUZBVF9FUlJPUigiRXJyb3IgcmVhZGluZyBjbHVzdGVyXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlnb3RzaXplICs9IChpbnQpYWN0c2l6ZTsKKwkJZmlsZXNpemUgLT0gYWN0c2l6ZTsKKwkJYnVmZmVyICs9IGFjdHNpemU7CisJCWN1cmNsdXN0ID0gZ2V0X2ZhdGVudChteWRhdGEsIGVuZGNsdXN0KTsKKwkJaWYgKGN1cmNsdXN0IDw9IDB4MDAwMSB8fCBjdXJjbHVzdCA+PSAweGZmZjApIHsKKwkJCUZBVF9EUFJJTlQoImN1cmNsdXN0OiAweCV4XG4iLCBjdXJjbHVzdCk7CisJCQlGQVRfRVJST1IoIkludmFsaWQgRkFUIGVudHJ5XG4iKTsKKwkJCXJldHVybiBnb3RzaXplOworCQl9CisJCWFjdHNpemU9Ynl0ZXNwZXJjbHVzdDsKKwkJZW5kY2x1c3Q9Y3VyY2x1c3Q7CisJfSB3aGlsZSAoMSk7Cit9CisKKworI2lmZGVmIENPTkZJR19TVVBQT1JUX1ZGQVQKKyNpZiAwCisvKgorICogRXh0cmFjdCB0aGUgZmlsZSBuYW1lIGluZm9ybWF0aW9uIGZyb20gJ3Nsb3RwdHInIGludG8gJ2xfbmFtZScsCisgKiBzdGFydGluZyBhdCBsX25hbWVbKmlkeF0uCisgKiBSZXR1cm4gMSBpZiB0ZXJtaW5hdG9yICh6ZXJvIGJ5dGUpIGlzIGZvdW5kLCAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorc2xvdDJzdHIoZGlyX3Nsb3QgKnNsb3RwdHIsIGNoYXIgKmxfbmFtZSwgaW50ICppZHgpCit7CisJaW50IGo7CisKKwlmb3IgKGogPSAwOyBqIDw9IDg7IGogKz0gMikgeworCQlsX25hbWVbKmlkeF0gPSBzbG90cHRyLT5uYW1lMF80W2pdOworCQlpZiAobF9uYW1lWyppZHhdID09IDB4MDApIHJldHVybiAxOworCQkoKmlkeCkrKzsKKwl9CisJZm9yIChqID0gMDsgaiA8PSAxMDsgaiArPSAyKSB7CisJCWxfbmFtZVsqaWR4XSA9IHNsb3RwdHItPm5hbWU1XzEwW2pdOworCQlpZiAobF9uYW1lWyppZHhdID09IDB4MDApIHJldHVybiAxOworCQkoKmlkeCkrKzsKKwl9CisJZm9yIChqID0gMDsgaiA8PSAyOyBqICs9IDIpIHsKKwkJbF9uYW1lWyppZHhdID0gc2xvdHB0ci0+bmFtZTExXzEyW2pdOworCQlpZiAobF9uYW1lWyppZHhdID09IDB4MDApIHJldHVybiAxOworCQkoKmlkeCkrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorLyogQ2FsY3VsYXRlIHNob3J0IG5hbWUgY2hlY2tzdW0gKi8KK3N0YXRpYyBfX3U4Citta2Nrc3VtKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgaTsKKwlfX3U4IHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykgeworCQlyZXQgPSAoKChyZXQmMSk8PDcpfCgocmV0JjB4ZmUpPj4xKSkgKyBzdHJbaV07CisJfQorCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisKKy8qCisgKiBHZXQgdGhlIGRpcmVjdG9yeSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggJ2ZpbGVuYW1lJyBmcm9tIHRoZSBkaXJlY3RvcnkKKyAqIHN0YXJ0aW5nIGF0ICdzdGFydHNlY3QnCisgKi8KKworCitzdGF0aWMgZGlyX2VudHJ5ICpnZXRfZGVudGZyb21kaXIgKGZzZGF0YSAqIG15ZGF0YSwgaW50IHN0YXJ0c2VjdCwKKwkJCQkgICBjaGFyICpmaWxlbmFtZSwgZGlyX2VudHJ5ICogcmV0ZGVudCwKKwkJCQkgICBpbnQgZG9scykKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworI2lmIDAKK19fdTggZ2V0X2RlbnRmcm9tZGlyX2Jsb2NrW01BWF9DTFVTVFNJWkVdOworc3RhdGljIGRpcl9lbnRyeSAqZ2V0X2RlbnRmcm9tZGlyIChmc2RhdGEgKiBteWRhdGEsIGludCBzdGFydHNlY3QsCisJCQkJICAgY2hhciAqZmlsZW5hbWUsIGRpcl9lbnRyeSAqIHJldGRlbnQsCisJCQkJICAgaW50IGRvbHMpCit7CisgICAgX191MTYgcHJldmNrc3VtID0gMHhmZmZmOworICAgIF9fdTMyIGN1cmNsdXN0ID0gU1RBUlQgKHJldGRlbnQpOworICAgIGludCBmaWxlcyA9IDAsIGRpcnMgPSAwOworCisgICAgd2hpbGUgKDEpIHsKKwlkaXJfZW50cnkgKmRlbnRwdHI7CisJaW50IGk7CisKKwlpZiAoZ2V0X2NsdXN0ZXIgKG15ZGF0YSwgY3VyY2x1c3QsIGdldF9kZW50ZnJvbWRpcl9ibG9jaywKKwkJIG15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIFNFQ1RPUl9TSVpFKSAhPSAwKSB7CisJICAgIEZBVF9EUFJJTlQgKCJFcnJvcjogcmVhZGluZyBkaXJlY3RvcnkgYmxvY2tcbiIpOworCSAgICByZXR1cm4gTlVMTDsKKwl9CisJZGVudHB0ciA9IChkaXJfZW50cnkgKikgZ2V0X2RlbnRmcm9tZGlyX2Jsb2NrOworCWZvciAoaSA9IDA7IGkgPCBESVJFTlRTUEVSQ0xVU1Q7IGkrKykgeworCSAgICBjaGFyIHNfbmFtZVsxNF0sIGxfbmFtZVsyNTZdOworCisJICAgIGxfbmFtZVswXSA9ICdcMCc7CisJICAgIGlmIChkZW50cHRyLT5uYW1lWzBdID09IERFTEVURURfRkxBRykgeworCQkgICAgZGVudHB0cisrOworCQkgICAgY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKChkZW50cHRyLT5hdHRyICYgQVRUUl9WT0xVTUUpKSB7CisJCSAgICAvKiBWb2x1bWUgbGFiZWwgb3IgVkZBVCBlbnRyeSAqLworCQkgICAgZGVudHB0cisrOworCQkgICAgY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKGRlbnRwdHItPm5hbWVbMF0gPT0gMCkgeworCQlpZiAoZG9scykgeworCQkgICAgcHJpbnRmICgiXG4lZCBmaWxlKHMpLCAlZCBkaXIocylcblxuIiwgZmlsZXMsIGRpcnMpOworCQl9CisJCUZBVF9EUFJJTlQgKCJEZW50bmFtZSA9PSBOVUxMIC0gJWRcbiIsIGkpOworCQlyZXR1cm4gTlVMTDsKKwkgICAgfQorI2lmZGVmIENPTkZJR19TVVBQT1JUX1ZGQVQKKwkgICAgaWYgKGRvbHMgJiYgbWtja3N1bSAoZGVudHB0ci0+bmFtZSkgPT0gcHJldmNrc3VtKSB7CisJCWRlbnRwdHIrKzsKKwkJY29udGludWU7CisJICAgIH0KKyNlbmRpZgorCSAgICBnZXRfbmFtZSAoZGVudHB0ciwgc19uYW1lKTsKKwkgICAgaWYgKGRvbHMpIHsKKwkJaW50IGlzZGlyID0gKGRlbnRwdHItPmF0dHIgJiBBVFRSX0RJUik7CisJCWNoYXIgZGlyYzsKKwkJaW50IGRvaXQgPSAwOworCisJCWlmIChpc2RpcikgeworCQkgICAgZGlycysrOworCQkgICAgZGlyYyA9ICcvJzsKKwkJICAgIGRvaXQgPSAxOworCQl9IGVsc2UgeworCQkgICAgZGlyYyA9ICcgJzsKKwkJICAgIGlmIChzX25hbWVbMF0gIT0gMCkgeworCQkJZmlsZXMrKzsKKwkJCWRvaXQgPSAxOworCQkgICAgfQorCQl9CisJCWlmIChkb2l0KSB7CisJCSAgICBpZiAoZGlyYyA9PSAnICcpIHsKKwkJCXByaW50ZiAoIiAlOGxkICAgJXMlY1xuIiwKKwkJCQkobG9uZykgRkFUMkNQVTMyIChkZW50cHRyLT5zaXplKSwgc19uYW1lLAorCQkJCWRpcmMpOworCQkgICAgfSBlbHNlIHsKKwkJCXByaW50ZiAoIiAgICAgICAgICAgICVzJWNcbiIsIHNfbmFtZSwgZGlyYyk7CisJCSAgICB9CisJCX0KKwkJZGVudHB0cisrOworCQljb250aW51ZTsKKwkgICAgfQorCSAgICBpZiAoc3RyY21wIChmaWxlbmFtZSwgc19uYW1lKSAmJiBzdHJjbXAgKGZpbGVuYW1lLCBsX25hbWUpKSB7CisJCUZBVF9EUFJJTlQgKCJNaXNtYXRjaDogfCVzfCVzfFxuIiwgc19uYW1lLCBsX25hbWUpOworCQlkZW50cHRyKys7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIG1lbWNweSAocmV0ZGVudCwgZGVudHB0ciwgc2l6ZW9mIChkaXJfZW50cnkpKTsKKworCSAgICBGQVRfRFBSSU5UICgiRGVudE5hbWU6ICVzIiwgc19uYW1lKTsKKwkgICAgRkFUX0RQUklOVCAoIiwgc3RhcnQ6IDB4JXgiLCBTVEFSVCAoZGVudHB0cikpOworCSAgICBGQVRfRFBSSU5UICgiLCBzaXplOiAgMHgleCAlc1xuIiwKKwkJCUZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksCisJCQkoZGVudHB0ci0+YXR0ciAmIEFUVFJfRElSKSA/ICIoRElSKSIgOiAiIik7CisKKwkgICAgcmV0dXJuIHJldGRlbnQ7CisJfQorCWN1cmNsdXN0ID0gZ2V0X2ZhdGVudCAobXlkYXRhLCBjdXJjbHVzdCk7CisJaWYgKGN1cmNsdXN0IDw9IDB4MDAwMSB8fCBjdXJjbHVzdCA+PSAweGZmZjApIHsKKwkgICAgRkFUX0RQUklOVCAoImN1cmNsdXN0OiAweCV4XG4iLCBjdXJjbHVzdCk7CisJICAgIEZBVF9FUlJPUiAoIkludmFsaWQgRkFUIGVudHJ5XG4iKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKworLyoKKyAqIFJlYWQgYm9vdCBzZWN0b3IgYW5kIHZvbHVtZSBpbmZvIGZyb20gYSBGQVQgZmlsZXN5c3RlbQorICovCitzdGF0aWMgaW50CityZWFkX2Jvb3RzZWN0YW5kdmkoYm9vdF9zZWN0b3IgKmJzLCB2b2x1bWVfaW5mbyAqdm9saW5mbywgaW50ICpmYXRzaXplKQoreworCV9fdTggYmxvY2tbRlNfQkxPQ0tfU0laRV07CisJdm9sdW1lX2luZm8gKnZpc3RhcnQ7CisKKwlwcmludGYoIlJlYWRpbmcgYm9vdCBzZWN0b3JcbiIpOworCisJaWYgKGRpc2tfcmVhZCgwLCAxLCBibG9jaykgPCAwKSB7CisJCUZBVF9EUFJJTlQoIkVycm9yOiByZWFkaW5nIGJsb2NrXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbWNweShicywgYmxvY2ssIHNpemVvZihib290X3NlY3RvcikpOworCWJzLT5yZXNlcnZlZAk9IEZBVDJDUFUxNihicy0+cmVzZXJ2ZWQpOworCWJzLT5mYXRfbGVuZ3RoCT0gRkFUMkNQVTE2KGJzLT5mYXRfbGVuZ3RoKTsKKwlicy0+c2Vjc190cmFjawk9IEZBVDJDUFUxNihicy0+c2Vjc190cmFjayk7CisJYnMtPmhlYWRzCT0gRkFUMkNQVTE2KGJzLT5oZWFkcyk7CisjaWYgMCAvKiBVTlVTRUQgKi8KKwlicy0+aGlkZGVuCT0gRkFUMkNQVTMyKGJzLT5oaWRkZW4pOworI2VuZGlmCisJYnMtPnRvdGFsX3NlY3QJPSBGQVQyQ1BVMzIoYnMtPnRvdGFsX3NlY3QpOworCisJLyogRkFUMzIgZW50cmllcyAqLworCWlmIChicy0+ZmF0X2xlbmd0aCA9PSAwKSB7CisJCS8qIEFzc3VtZSBGQVQzMiAqLworCQlicy0+ZmF0MzJfbGVuZ3RoID0gRkFUMkNQVTMyKGJzLT5mYXQzMl9sZW5ndGgpOworCQlicy0+ZmxhZ3MJID0gRkFUMkNQVTE2KGJzLT5mbGFncyk7CisJCWJzLT5yb290X2NsdXN0ZXIgPSBGQVQyQ1BVMzIoYnMtPnJvb3RfY2x1c3Rlcik7CisJCWJzLT5pbmZvX3NlY3RvciAgPSBGQVQyQ1BVMTYoYnMtPmluZm9fc2VjdG9yKTsKKwkJYnMtPmJhY2t1cF9ib290ICA9IEZBVDJDUFUxNihicy0+YmFja3VwX2Jvb3QpOworCQl2aXN0YXJ0ID0gKHZvbHVtZV9pbmZvKikgKGJsb2NrICsgc2l6ZW9mKGJvb3Rfc2VjdG9yKSk7CisJCSpmYXRzaXplID0gMzI7CisJfSBlbHNlIHsKKwkJdmlzdGFydCA9ICh2b2x1bWVfaW5mbyopICYoYnMtPmZhdDMyX2xlbmd0aCk7CisJCSpmYXRzaXplID0gMDsKKwl9CisJbWVtY3B5KHZvbGluZm8sIHZpc3RhcnQsIHNpemVvZih2b2x1bWVfaW5mbykpOworCisJLyogVGVybWluYXRlIGZzX3R5cGUgc3RyaW5nLiBXcml0aW5nIHBhc3QgdGhlIGVuZCBvZiB2aXN0YXJ0CisJICAgaXMgb2sgLSBpdCdzIGp1c3QgdGhlIGJ1ZmZlci4gKi8KKwl2aXN0YXJ0LT5mc190eXBlWzddID0gJ1wwJzsKKworCWlmICgqZmF0c2l6ZSA9PSAzMikgeworCQlpZiAoY29tcGFyZV9zaWduKEZBVDMyX1NJR04sIHZpc3RhcnQtPmZzX3R5cGUpID09IDApIHsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNvbXBhcmVfc2lnbihGQVQxMl9TSUdOLCB2aXN0YXJ0LT5mc190eXBlKSA9PSAwKSB7CisJCQkqZmF0c2l6ZSA9IDEyOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGNvbXBhcmVfc2lnbihGQVQxNl9TSUdOLCB2aXN0YXJ0LT5mc190eXBlKSA9PSAwKSB7CisJCQkqZmF0c2l6ZSA9IDE2OworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlGQVRfRFBSSU5UKCJFcnJvcjogYnJva2VuIGZzX3R5cGUgc2lnblxuIik7CisJcmV0dXJuIC0xOworfQorCisjaWYgMAorX191OCBkb19mYXRfcmVhZF9ibG9ja1tNQVhfQ0xVU1RTSVpFXTsgIC8qIEJsb2NrIGJ1ZmZlciAqLworI2VuZGlmCisKK19fdTggKmZuYW1lY29weSA9IChfX3U4ICopMHg4MDUwMDAwMDsKK19fdTggKmRvX2ZhdF9yZWFkX2Jsb2NrID0gKF9fdTggKikweDgwNTAwODgwOworCitib290X3NlY3RvciBiczsKK3ZvbHVtZV9pbmZvIHZvbGluZm87Citmc2RhdGEgZGF0YWJsb2NrOworCitsb25nCitkb19mYXRfcmVhZChjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIG1heHNpemUsCisJICAgICBpbnQgZG9scykKK3sKKyNpZiBDT05GSUdfTklPUyAvKiBOSU9TIENQVSBjYW5ub3QgYWNjZXNzIGJpZyBhdXRvbWF0aWMgYXJyYXlzICovCisgICAgc3RhdGljCisjZW5kaWYKKyAgICBmc2RhdGEgKm15ZGF0YSA9ICZkYXRhYmxvY2s7CisgICAgZGlyX2VudHJ5ICpkZW50cHRyOworICAgIF9fdTE2IHByZXZja3N1bSA9IDB4ZmZmZjsKKyAgICBjaGFyICpzdWJuYW1lID0gIiI7CisgICAgaW50IHJvb3RkaXJfc2l6ZSwgY3Vyc2VjdDsKKyAgICBpbnQgaWR4LCBpc2RpciA9IDA7CisgICAgaW50IGZpbGVzID0gMCwgZGlycyA9IDA7CisgICAgbG9uZyByZXQgPSAwOworICAgIGludCBmaXJzdHRpbWU7CisKKyAgICBpZiAocmVhZF9ib290c2VjdGFuZHZpICgmYnMsICZ2b2xpbmZvLCAmbXlkYXRhLT5mYXRzaXplKSkgeworCXByaW50ZiAoIkVycm9yOiByZWFkaW5nIGJvb3Qgc2VjdG9yXG4iKTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChteWRhdGEtPmZhdHNpemUgPT0gMzIpIHsKKwlteWRhdGEtPmZhdGxlbmd0aCA9IGJzLmZhdDMyX2xlbmd0aDsKKyAgICB9IGVsc2UgeworCW15ZGF0YS0+ZmF0bGVuZ3RoID0gYnMuZmF0X2xlbmd0aDsKKyAgICB9CisgICAgbXlkYXRhLT5mYXRfc2VjdCA9IGJzLnJlc2VydmVkOworICAgIGN1cnNlY3QgPSBteWRhdGEtPnJvb3RkaXJfc2VjdAorCSAgICA9IG15ZGF0YS0+ZmF0X3NlY3QgKyBteWRhdGEtPmZhdGxlbmd0aCAqIGJzLmZhdHM7CisgICAgbXlkYXRhLT5jbHVzdF9zaXplID0gYnMuY2x1c3Rlcl9zaXplOworICAgIGlmIChteWRhdGEtPmZhdHNpemUgPT0gMzIpIHsKKwlyb290ZGlyX3NpemUgPSBteWRhdGEtPmNsdXN0X3NpemU7CisJbXlkYXRhLT5kYXRhX2JlZ2luID0gbXlkYXRhLT5yb290ZGlyX3NlY3QgICAvKiArIHJvb3RkaXJfc2l6ZSAqLworCQktIChteWRhdGEtPmNsdXN0X3NpemUgKiAyKTsKKyAgICB9IGVsc2UgeworCXJvb3RkaXJfc2l6ZSA9ICgoYnMuZGlyX2VudHJpZXNbMV0gKiAoaW50KSAyNTYgKyBicy5kaXJfZW50cmllc1swXSkKKwkJCSogc2l6ZW9mIChkaXJfZW50cnkpKSAvIFNFQ1RPUl9TSVpFOworCW15ZGF0YS0+ZGF0YV9iZWdpbiA9IG15ZGF0YS0+cm9vdGRpcl9zZWN0ICsgcm9vdGRpcl9zaXplCisJCS0gKG15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIDIpOworICAgIH0KKyAgICBteWRhdGEtPmZhdGJ1Zm51bSA9IC0xOworCisgICAgRkFUX0RQUklOVCAoIkZBVCVkLCBmYXRsZW5ndGg6ICVkXG4iLCBteWRhdGEtPmZhdHNpemUsCisJCW15ZGF0YS0+ZmF0bGVuZ3RoKTsKKyAgICBGQVRfRFBSSU5UICgiUm9vdGRpciBiZWdpbnMgYXQgc2VjdG9yOiAlZCwgb2Zmc2V0OiAleCwgc2l6ZTogJWRcbiIKKwkJIkRhdGEgYmVnaW5zIGF0OiAlZFxuIiwKKwkJbXlkYXRhLT5yb290ZGlyX3NlY3QsIG15ZGF0YS0+cm9vdGRpcl9zZWN0ICogU0VDVE9SX1NJWkUsCisJCXJvb3RkaXJfc2l6ZSwgbXlkYXRhLT5kYXRhX2JlZ2luKTsKKyAgICBGQVRfRFBSSU5UICgiQ2x1c3RlciBzaXplOiAlZFxuIiwgbXlkYXRhLT5jbHVzdF9zaXplKTsKKworICAgIC8qICJjd2QiIGlzIGFsd2F5cyB0aGUgcm9vdC4uLiAqLworICAgIHdoaWxlIChJU0RJUkRFTElNICgqZmlsZW5hbWUpKQorCWZpbGVuYW1lKys7CisgICAgLyogTWFrZSBhIGNvcHkgb2YgdGhlIGZpbGVuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGxvd2VyY2FzZSAqLworICAgIHN0cmNweSgoY2hhciAqKWZuYW1lY29weSwgZmlsZW5hbWUpOworICAgIGRvd25jYXNlKChjaGFyICopZm5hbWVjb3B5KTsKKyAgICBpZiAoKmZuYW1lY29weSA9PSAnXDAnKSB7CisJaWYgKCFkb2xzKXsKKwkJcHJpbnRmKCJcbiBub3QgdGhlcmVcbiIpOworCSAgICByZXR1cm4gLTE7CisJfQorCWRvbHMgPSBMU19ST09UOworICAgIH0gZWxzZSBpZigoaWR4ID0gZGlyZGVsaW0oKGNoYXIgKilmbmFtZWNvcHkpKSA+PSAwKSB7CisJaXNkaXIgPSAxOworCWZuYW1lY29weVtpZHhdID0gJ1wwJzsKKwlzdWJuYW1lID0gKGNoYXIgKilmbmFtZWNvcHkgKyBpZHggKyAxOworCS8qIEhhbmRsZSBtdWx0aXBsZSBkZWxpbWl0ZXJzICovCisJd2hpbGUgKElTRElSREVMSU0gKCpzdWJuYW1lKSkKKwkgICAgc3VibmFtZSsrOworICAgIH0gZWxzZSBpZiAoZG9scykgeworCWlzZGlyID0gMTsKKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworCWludCBpOworCisJaWYgKGRpc2tfcmVhZCAoY3Vyc2VjdCwgbXlkYXRhLT5jbHVzdF9zaXplLCBkb19mYXRfcmVhZF9ibG9jaykgPCAwKSB7CisJICAgIHByaW50ZiAoIkVycm9yOiByZWFkaW5nIHJvb3RkaXIgYmxvY2tcbiIpOworCSAgICByZXR1cm4gLTE7CisJfQorCWRlbnRwdHIgPSAoZGlyX2VudHJ5ICopIGRvX2ZhdF9yZWFkX2Jsb2NrOworCWZvciAoaSA9IDA7IGkgPCBESVJFTlRTUEVSQkxPQ0s7IGkrKykgeworCSAgICBjaGFyIHNfbmFtZVsxNF0sIGxfbmFtZVsyNTZdOworCisJICAgIGxfbmFtZVswXSA9ICdcMCc7CisJICAgIGlmICgoZGVudHB0ci0+YXR0ciAmIEFUVFJfVk9MVU1FKSkgeworCQkgICAgLyogVm9sdW1lIGxhYmVsIG9yIFZGQVQgZW50cnkgKi8KKwkJICAgIGRlbnRwdHIrKzsKKwkJICAgIGNvbnRpbnVlOworCSAgICB9IGVsc2UgaWYgKGRlbnRwdHItPm5hbWVbMF0gPT0gMCkgeworCQlGQVRfRFBSSU5UICgiUm9vdERlbnRuYW1lID09IE5VTEwgLSAlZFxuIiwgaSk7CisJCWlmIChkb2xzID09IExTX1JPT1QpIHsKKwkJICAgIHByaW50ZiAoIlxuJWQgZmlsZShzKSwgJWQgZGlyKHMpXG5cbiIsIGZpbGVzLCBkaXJzKTsKKwkJICAgIHJldHVybiAwOworCQl9CisJCXJldHVybiAtMTsKKwkgICAgfQorI2lmZGVmIENPTkZJR19TVVBQT1JUX1ZGQVQKKwkgICAgZWxzZSBpZiAoZG9scyA9PSBMU19ST09UCisJCSAgICAgJiYgbWtja3N1bSAoZGVudHB0ci0+bmFtZSkgPT0gcHJldmNrc3VtKSB7CisJCWRlbnRwdHIrKzsKKwkJY29udGludWU7CisJICAgIH0KKyNlbmRpZgorCSAgICBnZXRfbmFtZSAoZGVudHB0ciwgc19uYW1lKTsKKwkgICAgaWYgKGRvbHMgPT0gTFNfUk9PVCkgeworCQlpbnQgaXNkaXIgPSAoZGVudHB0ci0+YXR0ciAmIEFUVFJfRElSKTsKKwkJY2hhciBkaXJjOworCQlpbnQgZG9pdCA9IDA7CisKKwkJaWYgKGlzZGlyKSB7CisJCSAgICBkaXJjID0gJy8nOworCQkgICAgaWYgKHNfbmFtZVswXSAhPSAwKSB7CisJCQlkaXJzKys7CisJCQlkb2l0ID0gMTsKKwkJICAgIH0KKwkJfSBlbHNlIHsKKwkJICAgIGRpcmMgPSAnICc7CisJCSAgICBpZiAoc19uYW1lWzBdICE9IDApIHsKKwkJCWZpbGVzKys7CisJCQlkb2l0ID0gMTsKKwkJICAgIH0KKwkJfQorCQlpZiAoZG9pdCkgeworCQkgICAgaWYgKGRpcmMgPT0gJyAnKSB7CisJCQlwcmludGYgKCIgJThsZCAgICVzJWNcbiIsCisJCQkJKGxvbmcpIEZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksIHNfbmFtZSwKKwkJCQlkaXJjKTsKKwkJICAgIH0gZWxzZSB7CisJCQlwcmludGYgKCIgICAgICAgICAgICAlcyVjXG4iLCBzX25hbWUsIGRpcmMpOworCQkgICAgfQorCQl9CisJCWRlbnRwdHIrKzsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKHN0cmNtcCgoY2hhciAqKWZuYW1lY29weSwgc19uYW1lKSAmJgorCQlzdHJjbXAoKGNoYXIgKilmbmFtZWNvcHksIGxfbmFtZSkpIHsKKwkJRkFUX0RQUklOVCAoIlJvb3RNaXNtYXRjaDogfCVzfCVzfFxuIiwgc19uYW1lLCBsX25hbWUpOworCQlkZW50cHRyKys7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGlmIChpc2RpciAmJiAhKGRlbnRwdHItPmF0dHIgJiBBVFRSX0RJUikpCisJCXJldHVybiAtMTsKKworCSAgICBGQVRfRFBSSU5UICgiUm9vdE5hbWU6ICVzIiwgc19uYW1lKTsKKwkgICAgRkFUX0RQUklOVCAoIiwgc3RhcnQ6IDB4JXgiLCBTVEFSVCAoZGVudHB0cikpOworCSAgICBGQVRfRFBSSU5UICgiLCBzaXplOiAgMHgleCAlc1xuIiwKKwkJCUZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksIGlzZGlyID8gIihESVIpIiA6ICIiKTsKKworCSAgICBnb3RvIHJvb3RkaXJfZG9uZTsgIC8qIFdlIGdvdCBhIG1hdGNoICovCisJfQorCWN1cnNlY3QrKzsKKyAgICB9CisgIHJvb3RkaXJfZG9uZToKKworICAgIGZpcnN0dGltZSA9IDE7CisgICAgd2hpbGUgKGlzZGlyKSB7CisJaW50IHN0YXJ0c2VjdCA9IG15ZGF0YS0+ZGF0YV9iZWdpbgorCQkrIFNUQVJUIChkZW50cHRyKSAqIG15ZGF0YS0+Y2x1c3Rfc2l6ZTsKKwlkaXJfZW50cnkgZGVudDsKKwljaGFyICpuZXh0bmFtZSA9IE5VTEw7CisKKwlkZW50ID0gKmRlbnRwdHI7CisJZGVudHB0ciA9ICZkZW50OworCWlkeCA9IGRpcmRlbGltIChzdWJuYW1lKTsKKwlpZiAoaWR4ID49IDApIHsKKwkgICAgc3VibmFtZVtpZHhdID0gJ1wwJzsKKwkgICAgbmV4dG5hbWUgPSBzdWJuYW1lICsgaWR4ICsgMTsKKwkgICAgLyogSGFuZGxlIG11bHRpcGxlIGRlbGltaXRlcnMgKi8KKwkgICAgd2hpbGUgKElTRElSREVMSU0gKCpuZXh0bmFtZSkpCisJCW5leHRuYW1lKys7CisJICAgIGlmIChkb2xzICYmICpuZXh0bmFtZSA9PSAnXDAnKQorCQlmaXJzdHRpbWUgPSAwOworCX0gZWxzZSB7CisJICAgIGlmIChkb2xzICYmIGZpcnN0dGltZSkgeworCQlmaXJzdHRpbWUgPSAwOworCSAgICB9IGVsc2UgeworCQlpc2RpciA9IDA7CisJICAgIH0KKwl9CisKKwlpZiAoZ2V0X2RlbnRmcm9tZGlyIChteWRhdGEsIHN0YXJ0c2VjdCwgc3VibmFtZSwgZGVudHB0ciwKKwkJCSAgICAgaXNkaXIgPyAwIDogZG9scykgPT0gTlVMTCkgeworCSAgICBpZiAoZG9scyAmJiAhaXNkaXIpCisJCXJldHVybiAwOworCSAgICByZXR1cm4gLTE7CisJfQorCisJaWYgKGlkeCA+PSAwKSB7CisJICAgIGlmICghKGRlbnRwdHItPmF0dHIgJiBBVFRSX0RJUikpCisJCXJldHVybiAtMTsKKwkgICAgc3VibmFtZSA9IG5leHRuYW1lOworCX0KKyAgICB9CisgICAgcmV0ID0gZ2V0X2NvbnRlbnRzIChteWRhdGEsIGRlbnRwdHIsIGJ1ZmZlciwgbWF4c2l6ZSk7CisgICAgRkFUX0RQUklOVCAoIlNpemU6ICVkLCBnb3Q6ICVsZFxuIiwgRkFUMkNQVTMyIChkZW50cHRyLT5zaXplKSwgcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworaW50CitmaWxlX2ZhdF9kZXRlY3Rmcyh2b2lkKQoreworCWJvb3Rfc2VjdG9yCWJzOworCXZvbHVtZV9pbmZvCXZvbGluZm87CisJaW50CQlmYXRzaXplOworCWNoYXIJdm9sX2xhYmVsWzEyXTsKKworCWlmKGN1cl9kZXY9PU5VTEwpIHsKKwkJcHJpbnRmKCJObyBjdXJyZW50IGRldmljZVxuIik7CisJCXJldHVybiAxOworCX0KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpIHx8IFwKKyAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpIHx8IChDT05GSUdfTU1DKQorCXByaW50ZigiSW50ZXJmYWNlOiAgIik7CisJc3dpdGNoKGN1cl9kZXYtPmlmX3R5cGUpIHsKKwkJY2FzZSBJRl9UWVBFX0lERSA6CXByaW50ZigiSURFIik7IGJyZWFrOworCQljYXNlIElGX1RZUEVfU0NTSSA6CXByaW50ZigiU0NTSSIpOyBicmVhazsKKwkJY2FzZSBJRl9UWVBFX0FUQVBJIDoJcHJpbnRmKCJBVEFQSSIpOyBicmVhazsKKwkJY2FzZSBJRl9UWVBFX1VTQiA6CXByaW50ZigiVVNCIik7IGJyZWFrOworCQljYXNlIElGX1RZUEVfRE9DIDoJcHJpbnRmKCJET0MiKTsgYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9NTUMgOglwcmludGYoIk1NQyIpOyBicmVhazsKKwkJZGVmYXVsdCA6CQlwcmludGYoIlVua25vd24iKTsKKwl9CisJcHJpbnRmKCJcbiAgRGV2aWNlICVkOiAiLGN1cl9kZXYtPmRldik7CisJZGV2X3ByaW50KGN1cl9kZXYpOworI2VuZGlmCisJaWYocmVhZF9ib290c2VjdGFuZHZpKCZicywgJnZvbGluZm8sICZmYXRzaXplKSkgeworCQlwcmludGYoIlxuTm8gdmFsaWQgRkFUIGZzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCW1lbWNweSAodm9sX2xhYmVsLCB2b2xpbmZvLnZvbHVtZV9sYWJlbCwgMTEpOworCXZvbF9sYWJlbFsxMV0gPSAnXDAnOworCXZvbGluZm8uZnNfdHlwZVs1XT0nXDAnOworCXByaW50ZigiUGFydGl0aW9uICVkOiBGaWxlc3lzdGVtOiAlcyBcIiVzXCJcbiIsY3VyX3BhcnQsdm9saW5mby5mc190eXBlLHZvbF9sYWJlbCk7CisJcmV0dXJuIDA7Cit9CisKKworaW50CitmaWxlX2ZhdF9scyhjb25zdCBjaGFyICpkaXIpCit7CisJcmV0dXJuIGRvX2ZhdF9yZWFkKGRpciwgTlVMTCwgMCwgTFNfWUVTKTsKK30KKworCitsb25nCitmaWxlX2ZhdF9yZWFkKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbWF4c2l6ZSkKK3sKKwlsb25nIHJldDsKKwlyZXQgPSBkb19mYXRfcmVhZChmaWxlbmFtZSwgYnVmZmVyLCBtYXhzaXplLCBMU19OTyk7CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GQVQpICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9mcy9mYXQvZmlsZS5jIGIveC1sb2FkZXIvZnMvZmF0L2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41OTk0MjcxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZnMvZmF0L2ZpbGUuYwpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIGZpbGUuYworICoKKyAqIE1pbmkgIlZGUyIgYnkgTWFyY3VzIFN1bmRiZXJnCisgKgorICogMjAwMi0wNy0yOCAtIHJqb25lc0BuZXh1cy10ZWNoLm5ldCAtIHBvcnRlZCB0byBwcGNib290IHYxLjEuNgorICogMjAwMy0wMy0xMCAtIGtoYXJyaXNAbmV4dXMtdGVjaC5uZXQgLSBwb3J0ZWQgdG8gdWJvb3QKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GQVQpCisKKy8qIFN1cHBvcnRlZCBmaWxlc3lzdGVtcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlc3lzdGVtIGZpbGVzeXN0ZW1zW10gPSB7CisJeyBmaWxlX2ZhdF9kZXRlY3RmcywgIGZpbGVfZmF0X2xzLCAgZmlsZV9mYXRfcmVhZCwgICJGQVQiIH0sCit9OworI2RlZmluZSBOVU1fRklMRVNZUwkoc2l6ZW9mKGZpbGVzeXN0ZW1zKS9zaXplb2Yoc3RydWN0IGZpbGVzeXN0ZW0pKQorCisvKiBUaGUgZmlsZXN5c3RlbSB3aGljaCB3YXMgbGFzdCBkZXRlY3RlZCAqLworc3RhdGljIGludCBjdXJyZW50X2ZpbGVzeXN0ZW0gPSBGU1RZUEVfTk9ORTsKKworLyogVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgQ1dEX0xFTgkJNTExCitjaGFyIGZpbGVfY3dkW0NXRF9MRU4rMV0gPSAiLyI7CisKK2NvbnN0IGNoYXIgKgorZmlsZV9nZXRmc25hbWUoaW50IGlkeCkKK3sKKwlpZiAoaWR4IDwgMCB8fCBpZHggPj0gTlVNX0ZJTEVTWVMpIHJldHVybiBOVUxMOworCisJcmV0dXJuIGZpbGVzeXN0ZW1zW2lkeF0ubmFtZTsKK30KKworCitzdGF0aWMgdm9pZAorcGF0aGNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCit7CisJY2hhciAqb3JpZ2Rlc3QgPSBkZXN0OworCisJZG8geworCQlpZiAoZGVzdC1maWxlX2N3ZCA+PSBDV0RfTEVOKSB7CisJCQkqZGVzdCA9ICdcMCc7CisJCQlyZXR1cm47CisJCX0KKwkJKihkZXN0KSA9ICooc3JjKTsKKwkJaWYgKCpzcmMgPT0gJ1wwJykgeworCQkJaWYgKGRlc3QtLSAhPSBvcmlnZGVzdCAmJiBJU0RJUkRFTElNKCpkZXN0KSkgeworCQkJCSpkZXN0ID0gJ1wwJzsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQkrK2Rlc3Q7CisJCWlmIChJU0RJUkRFTElNKCpzcmMpKSB7CisJCQl3aGlsZSAoSVNESVJERUxJTSgqc3JjKSkgc3JjKys7CisJCX0gZWxzZSB7CisJCQlzcmMrKzsKKwkJfQorCX0gd2hpbGUgKDEpOworfQorCisKK2ludAorZmlsZV9jZChjb25zdCBjaGFyICpwYXRoKQoreworCWlmIChJU0RJUkRFTElNKCpwYXRoKSkgeworCQl3aGlsZSAoSVNESVJERUxJTSgqcGF0aCkpIHBhdGgrKzsKKwkJc3RybmNweShmaWxlX2N3ZCsxLCBwYXRoLCBDV0RfTEVOLTEpOworCX0gZWxzZSB7CisJCWNvbnN0IGNoYXIgKm9yaWdwYXRoID0gcGF0aDsKKwkJY2hhciAqdG1wc3RyID0gZmlsZV9jd2Q7CisJCWludCBiYWNrID0gMDsKKworCQl3aGlsZSAoKnRtcHN0ciAhPSAnXDAnKSB0bXBzdHIrKzsKKwkJZG8geworCQkJdG1wc3RyLS07CisJCX0gd2hpbGUgKElTRElSREVMSU0oKnRtcHN0cikpOworCisJCXdoaWxlICgqcGF0aCA9PSAnLicpIHsKKwkJCXBhdGgrKzsKKwkJCXdoaWxlICgqcGF0aCA9PSAnLicpIHsKKwkJCQlwYXRoKys7CisJCQkJYmFjaysrOworCQkJfQorCQkJaWYgKCpwYXRoICE9ICdcMCcgJiYgIUlTRElSREVMSU0oKnBhdGgpKSB7CisJCQkJcGF0aCA9IG9yaWdwYXRoOworCQkJCWJhY2sgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJd2hpbGUgKElTRElSREVMSU0oKnBhdGgpKSBwYXRoKys7CisJCQlvcmlncGF0aCA9IHBhdGg7CisJCX0KKworCQl3aGlsZSAoYmFjay0tKSB7CisJCQkvKiBTdHJpcCBvZmYgcGF0aCBjb21wb25lbnQgKi8KKwkJCXdoaWxlICghSVNESVJERUxJTSgqdG1wc3RyKSkgeworCQkJCXRtcHN0ci0tOworCQkJfQorCQkJaWYgKHRtcHN0ciA9PSBmaWxlX2N3ZCkgeworCQkJCS8qIEluY3JlbWVudGVkIGFnYWluIHJpZ2h0IGFmdGVyIHRoZSBsb29wLiAqLworCQkJCXRtcHN0ci0tOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogU2tpcCBkZWxpbWl0ZXJzICovCisJCQl3aGlsZSAoSVNESVJERUxJTSgqdG1wc3RyKSkgdG1wc3RyLS07CisJCX0KKwkJdG1wc3RyKys7CisJCWlmICgqcGF0aCA9PSAnXDAnKSB7CisJCQlpZiAodG1wc3RyID09IGZpbGVfY3dkKSB7CisJCQkJKnRtcHN0ciA9ICcvJzsKKwkJCQl0bXBzdHIrKzsKKwkJCX0KKwkJCSp0bXBzdHIgPSAnXDAnOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKnRtcHN0ciA9ICcvJzsKKwkJcGF0aGNweSh0bXBzdHIrMSwgcGF0aCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50CitmaWxlX2RldGVjdGZzKHZvaWQpCit7CisJaW50IGk7CisKKwljdXJyZW50X2ZpbGVzeXN0ZW0gPSBGU1RZUEVfTk9ORTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRklMRVNZUzsgaSsrKSB7CisJCWlmIChmaWxlc3lzdGVtc1tpXS5kZXRlY3QoKSA9PSAwKSB7CisJCQlzdHJjcHkoZmlsZV9jd2QsICIvIik7CisJCQljdXJyZW50X2ZpbGVzeXN0ZW0gPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gY3VycmVudF9maWxlc3lzdGVtOworfQorCisKK2ludAorZmlsZV9scyhjb25zdCBjaGFyICpkaXIpCit7CisJY2hhciBmdWxscGF0aFsxMDI0XTsKKwljb25zdCBjaGFyICphcmc7CisKKwlpZiAoY3VycmVudF9maWxlc3lzdGVtID09IEZTVFlQRV9OT05FKSB7CisJCXByaW50ZigiQ2FuJ3QgbGlzdCBmaWxlcyB3aXRob3V0IGEgZmlsZXN5c3RlbSFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKElTRElSREVMSU0oKmRpcikpIHsKKwkJYXJnID0gZGlyOworCX0gZWxzZSB7CisJCXNwcmludGYoZnVsbHBhdGgsICIlcy8lcyIsIGZpbGVfY3dkLCBkaXIpOworCQlhcmcgPSBmdWxscGF0aDsKKwl9CisJcmV0dXJuIGZpbGVzeXN0ZW1zW2N1cnJlbnRfZmlsZXN5c3RlbV0ubHMoYXJnKTsKK30KKworCitsb25nCitmaWxlX3JlYWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBtYXhzaXplKQoreworCWNoYXIgZnVsbHBhdGhbMTAyNF07CisJY29uc3QgY2hhciAqYXJnOworCisJaWYgKGN1cnJlbnRfZmlsZXN5c3RlbSA9PSBGU1RZUEVfTk9ORSkgeworCQlwcmludGYoIkNhbid0IGxvYWQgZmlsZSB3aXRob3V0IGEgZmlsZXN5c3RlbSFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKElTRElSREVMSU0oKmZpbGVuYW1lKSkgeworCQlhcmcgPSBmaWxlbmFtZTsKKwl9IGVsc2UgeworCQlzcHJpbnRmKGZ1bGxwYXRoLCAiJXMvJXMiLCBmaWxlX2N3ZCwgZmlsZW5hbWUpOworCQlhcmcgPSBmdWxscGF0aDsKKwl9CisKKwlyZXR1cm4gZmlsZXN5c3RlbXNbY3VycmVudF9maWxlc3lzdGVtXS5yZWFkKGFyZywgYnVmZmVyLCBtYXhzaXplKTsKK30KKworI2VuZGlmIC8qICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GQVQpICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvYml0cy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2JpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzMyNzNlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2JpdHMuaApAQCAtMCwwICsxLDQ5IEBACisvKiBiaXRzLmgKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGZvdW5kIGluIHRoZSBmaWxlCisgKiBuYW1lZCBDT1BZSU5HIHRoYXQgc2hvdWxkIGhhdmUgYWNjb21wYW5pZWQgdGhpcyBmaWxlLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpZm5kZWYgX19iaXRzX2gKKyNkZWZpbmUgX19iaXRzX2ggMQorCisjZGVmaW5lIEJJVDAgICgxPDwwKQorI2RlZmluZSBCSVQxICAoMTw8MSkKKyNkZWZpbmUgQklUMiAgKDE8PDIpCisjZGVmaW5lIEJJVDMgICgxPDwzKQorI2RlZmluZSBCSVQ0ICAoMTw8NCkKKyNkZWZpbmUgQklUNSAgKDE8PDUpCisjZGVmaW5lIEJJVDYgICgxPDw2KQorI2RlZmluZSBCSVQ3ICAoMTw8NykKKyNkZWZpbmUgQklUOCAgKDE8PDgpCisjZGVmaW5lIEJJVDkgICgxPDw5KQorI2RlZmluZSBCSVQxMCAoMTw8MTApCisjZGVmaW5lIEJJVDExICgxPDwxMSkKKyNkZWZpbmUgQklUMTIgKDE8PDEyKQorI2RlZmluZSBCSVQxMyAoMTw8MTMpCisjZGVmaW5lIEJJVDE0ICgxPDwxNCkKKyNkZWZpbmUgQklUMTUgKDE8PDE1KQorI2RlZmluZSBCSVQxNiAoMTw8MTYpCisjZGVmaW5lIEJJVDE3ICgxPDwxNykKKyNkZWZpbmUgQklUMTggKDE8PDE4KQorI2RlZmluZSBCSVQxOSAoMTw8MTkpCisjZGVmaW5lIEJJVDIwICgxPDwyMCkKKyNkZWZpbmUgQklUMjEgKDE8PDIxKQorI2RlZmluZSBCSVQyMiAoMTw8MjIpCisjZGVmaW5lIEJJVDIzICgxPDwyMykKKyNkZWZpbmUgQklUMjQgKDE8PDI0KQorI2RlZmluZSBCSVQyNSAoMTw8MjUpCisjZGVmaW5lIEJJVDI2ICgxPDwyNikKKyNkZWZpbmUgQklUMjcgKDE8PDI3KQorI2RlZmluZSBCSVQyOCAoMTw8MjgpCisjZGVmaW5lIEJJVDI5ICgxPDwyOSkKKyNkZWZpbmUgQklUMzAgKDE8PDMwKQorI2RlZmluZSBCSVQzMSAoMTw8MzEpCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwMGQyZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIC9QVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICAqLworI2lmbmRlZiBfT01BUDI0WFhfQ0xPQ0tTX0hfCisjZGVmaW5lIF9PTUFQMjRYWF9DTE9DS1NfSF8KKworI2RlZmluZSBDT01NSVRfRElWSURFUlMgIDB4MQorI2RlZmluZSBNT0RFX0JZUEFTU19GQVNUIDB4MgorI2RlZmluZSBBUExMX0xPQ0sgICAgICAgIDB4YworI2RlZmluZSBEUExMX0xPQ0sgICAgICAgIDB4MyAgIC8qIERQTEwgbG9jayAqLworI2RlZmluZSBMREVMQVkgICAgICAgICAgIDEyMDAwMDAwCisKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQMjQyWCkKKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MyNDJ4Lmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR19PTUFQMjQzWCkKKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MyNDN4Lmg+CisjZW5kaWYKKworI2RlZmluZSBTMTJNCQkxMjAwMDAwMAorI2RlZmluZSBTMTNNCQkxMzAwMDAwMAorI2RlZmluZSBTMTlfMk0JCTE5MjAwMDAwCisjZGVmaW5lIFMyNE0JCTI0MDAwMDAwCisjZGVmaW5lIFMyNk0JCTI2MDAwMDAwCisjZGVmaW5lIFMzOF80TQkJMzg0MDAwMDAKKworI2VuZGlmCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2NrczI0MnguaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MyNDJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlMWM0ZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MyNDJ4LmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgL1BVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgICovCisjaWZuZGVmIF9PTUFQMjQyWF9DTE9DS1NfSF8KKyNkZWZpbmUgX09NQVAyNDJYX0NMT0NLU19IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKjsKKzsgUFJDTSBTY2hlbWUgSQorOworOyBFbmFibGUgY2xvY2tzIGFuZCBEUExMIGZvcjoKKzsgIERQTEw9MzMwLCAJRFBMTG91dD02NjAgICAJTT0xLE49NTUgICBDTV9DTEtTRUwxX1BMTFsyMTo4XSAgMTIvMio1NQorOyAgQ29yZT02NjAgIAkoY29yZSBkb21haW4pICAgRFBMTHgyICAgICBDTV9DTEtTRUwyX1BMTFsxOjBdCis7ICBNUFVGPTMzMCAgIAkobXB1IGRvbWFpbikgICAgMiAgICAgICAgICBDTV9DTEtTRUxfTVBVWzQ6MF0KKzsgIERTUEY9MjIwICAgICAoZHNwIGRvbWFpbikgICAgMyAgICAgICAgICBDTV9DTEtTRUxfRFNQWzQ6MF0KKzsgIERTUEk9MTEwICAgICAgICAgICAgICAgICAgICAgNiAgICAgICAgICBDTV9DTEtTRUxfRFNQWzY6NV0KKzsgIERTUF9TICAgICAgICBhY3RpdmF0ZWQJICAgICAgICAgICAgICAgQ01fQ0xLU0VMX0RTUFs3XQorOyAgSVZBRj0xNjUgICAgIChkc3AgZG9tYWluKSAgICA0ICAgICAgICAgIENNX0NMS1NFTF9EU1BbMTI6OF0KKzsgIElWQUY9ODIuNSAgICAgICBhdXRvCis7ICBJVkFJICAgICAgICAgICAgYXV0bworOyAgSVZBX01QVSAgICAgICAgIGF1dG8KKzsgIElWQV9TICAgICAgICAgIGJ5cGFzcyAgICAgICAgICAgICAgICAgICBDTV9DTEtTRUxfRFNQWzEzXQorOyAgR0ZYRj04Mi41ICAgIChnZnggZG9tYWluKQk4ICAgICAgICAgIENNX0NMS1NFTF9GR1hbMjowXQorOyAgU1NJX1NTUkY9MjIwICAgICAgICAgICAgICAgICAzICAgICAgICAgIENNX0NMS1NFTDFfQ09SRVsyNDoyMF0KKzsgIFNTSV9TU1RGPTExMCAgICBhdXRvCis7ICBMMz0xNjVNaHogICAgKHNkcmFtKSAgICAgICAgIDQgICAgICAgICAgQ01fQ0xLU0VMMV9DT1JFWzQ6MF0KKzsgIEw0PTgyLjVNaHogICAgICAgICAgICAgICAgICAgOCAgICAgICAgICAKKzsgIENfTDRfVVNCPTQxLjI1ICAgICAgICAgICAgICAgMTYgICAgICAgICBDTV9DTEtTRUwxX0NPUkVbNjo1XQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJX0RQTExfT1VUX1gyICAgMHgyICAgIC8qIHgyIGNvcmUgb3V0ICovCisjZGVmaW5lIElfTVBVX0RJViAgICAgICAweDIgICAgLyogbXB1ID0gY29yZS8yICovCisjZGVmaW5lIElfRFNQX0RJViAgICAgICAweDNjMyAgLyogZHNwICYgaXZhIGRpdmlkZXIgKi8KKyNkZWZpbmUgSV9HRlhfRElWICAgICAgIDB4MgorI2RlZmluZSBJX0JVU19ESVYgICAgICAgMHgwNDYwMTA0NAorI2lmZGVmIElOUFVUX0NMS18xM01IWgorI2RlZmluZSBJX0RQTExfMzMwICAgICAgMHgwMTE0QUMwMCAgLyogMTNNSHogKi8KKyNlbHNlCisjZGVmaW5lIElfRFBMTF8zMzAgICAgICAweDAxODM3MTAwICAvKiAxMk1IeiAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqOworOyBQUkNNIFNjaGVtZSBJSSAgIDx0ZXN0ZWQ+Cis7Cis7IEVuYWJsZSBjbG9ja3MgYW5kIERQTEwgZm9yOgorOyAgRFBMTD0zMDAsIAlEUExMb3V0PTYwMCAgIAlNPTEsTj01MCAgIENNX0NMS1NFTDFfUExMWzIxOjhdICAxMi8yKjUwCis7ICBDb3JlPTYwMCAgCShjb3JlIGRvbWFpbikgICBEUExMeDIgICAgIENNX0NMS1NFTDJfUExMWzE6MF0KKzsgIE1QVUY9MzAwICAgCShtcHUgZG9tYWluKSAgICAyICAgICAgICAgIENNX0NMS1NFTF9NUFVbNDowXQorOyAgRFNQRj0yMDAgICAgKGRzcCBkb21haW4pICAgIDMgICAgICAgICAgQ01fQ0xLU0VMX0RTUFs0OjBdCis7ICBEU1BJPTEwMCAgICAgICAgICAgICAgICAgICAgNiAgICAgICAgICBDTV9DTEtTRUxfRFNQWzY6NV0KKzsgIERTUF9TICAgICAgICAgIGJ5cGFzcwkgICAgICAgICAgICAgICBDTV9DTEtTRUxfRFNQWzddCis7ICBJVkFGPTIwMCAgICAoZHNwIGRvbWFpbikgICAgMyAgICAgICAgICBDTV9DTEtTRUxfRFNQWzEyOjhdCis7ICBJVkFGPTEwMCAgICAgICAgYXV0bworOyAgSVZBSSAgICAgICAgICAgIGF1dG8KKzsgIElWQV9NUFUgICAgICAgICBhdXRvCis7ICBJVkFfUyAgICAgICAgICBieXBhc3MgICAgICAgICAgICAgICAgICBDTV9DTEtTRUxfRFNQWzEzXQorOyAgR0ZYRj01MCAgICAgIChnZnggZG9tYWluKQkxMiAgICAgICAgIENNX0NMS1NFTF9GR1hbMjowXQorOyAgU1NJX1NTUkY9MjAwICAgICAgICAgICAgICAgICAzICAgICAgICAgQ01fQ0xLU0VMMV9DT1JFWzI0OjIwXQorOyAgU1NJX1NTVEY9MTAwICAgICBhdXRvCis7ICBMMz0xMDBNaHogKHNkcmFtKSAgICAgICAgICAgIDYgICAgICAgICBDTV9DTEtTRUwxX0NPUkVbNDowXQorOyAgTDQ9MTAwTWh6ICAgICAgICAgICAgICAgICAgICA2Cis7ICBDX0w0X1VTQj01MCAgICAgICAgICAgICAgICAgMTIgICAgICAgICBDTV9DTEtTRUwxX0NPUkVbNjo1XQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJSV9EUExMX09VVF9YMiAgIDB4MiAgICAvKiB4MiBjb3JlIG91dCAqLworI2RlZmluZSBJSV9NUFVfRElWICAgICAgIDB4MiAgICAvKiBtcHUgPSBjb3JlLzIgKi8KKyNkZWZpbmUgSUlfRFNQX0RJViAgICAgICAweDM0MyAgLyogZHNwICYgaXZhIGRpdmlkZXIgKi8KKyNkZWZpbmUgSUlfR0ZYX0RJViAgICAgICAweDIKKyNkZWZpbmUgSUlfQlVTX0RJViAgICAgICAweDA0NjAxMDI2CisjaWZkZWYgSU5QVVRfQ0xLXzEzTUhaCisjZGVmaW5lIElJX0RQTExfMzAwICAgICAgMHgwMTEyQ0MwMCAgLyogMTNNSHogKi8KKyNlbHNlCisjZGVmaW5lIElJX0RQTExfMzAwICAgICAgMHgwMTgzMjEwMCAgLyogMTJNSHogKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKjsKKzsgUFJDTSBTY2hlbWUgSUlJICA8dGVzdGVkPgorOworOyBFbmFibGUgY2xvY2tzIGFuZCBEUExMIGZvcjoKKzsgIERQTEw9MjY2LCAJRFBMTG91dD01MzIgICAJTT01KzEsTj0xMzMgQ01fQ0xLU0VMMV9QTExbMjE6OF0gIDEyLzYqMTMzPTI2NgorOyAgQ29yZT01MzIgIAkoY29yZSBkb21haW4pICAgRFBMTHgyICAgICAgQ01fQ0xLU0VMMl9QTExbMTowXQorOyAgTVBVRj0yNjYgICAJKG1wdSBkb21haW4pICAgIC8yICAgICAgICAgIENNX0NMS1NFTF9NUFVbNDowXQorOyAgRFNQRj0xNzcuMyAgICAgKGRzcCBkb21haW4pICAvMyAgICAgICAgICBDTV9DTEtTRUxfRFNQWzQ6MF0KKzsgIERTUEk9ODguNjcgICAgICAgICAgICAgICAgICAgLzYgICAgICAgICAgQ01fQ0xLU0VMX0RTUFs2OjVdCis7ICBEU1BfUyAgICAgICAgIEFDVElWQVRFRAkgICAgICAgICAgICBDTV9DTEtTRUxfRFNQWzddCis7ICBJVkFGPTg4LjY3ICAgIChkc3AgZG9tYWluKSAgIC8zICAgICAgICAgIENNX0NMS1NFTF9EU1BbMTI6OF0KKzsgIElWQUY9ODguNjcgICAgICAgIGF1dG8KKzsgIElWQUkgICAgICAgICAgICBhdXRvCis7ICBJVkFfTVBVICAgICAgICAgYXV0bworOyAgSVZBX1MgICAgICAgICBBQ1RJVkFURUQgICAgICAgICAgICAgICAgICBDTV9DTEtTRUxfRFNQWzEzXQorOyAgR0ZYRj02Ni41ICAgICAgKGdmeCBkb21haW4pCS84ICAgICAgICAgIENNX0NMS1NFTF9GR1hbMjowXToKKzsgIFNTSV9TU1JGPTE3Ny4zICAgICAgICAgICAgICAgLzMgICAgICAgICAgQ01fQ0xLU0VMMV9DT1JFWzI0OjIwXQorOyAgU1NJX1NTVEY9ODguNjcgICAgIGF1dG8KKzsgIEwzPTEzM01oeiAoc2RyYW0pICAgICAgICAgICAgLzQgICAgICAgICAgQ01fQ0xLU0VMMV9DT1JFWzQ6MF0KKzsgIEw0PTY2LjVNaHogICAgICAgICAgICAgICAgICAgLzgKKzsgIENfTDRfVVNCPTMzLjI1ICAgICAgICAgICAgICAgLzE2ICAgICAgICAgQ01fQ0xLU0VMMV9DT1JFWzY6NV0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSUlJX0RQTExfT1VUX1gyICAgMHgyICAgIC8qIHgyIGNvcmUgb3V0ICovCisjZGVmaW5lIElJSV9NUFVfRElWICAgICAgIDB4MiAgICAvKiBtcHUgPSBjb3JlLzIgKi8KKyNkZWZpbmUgSUlJX0RTUF9ESVYgICAgICAgMHgyM0MzIC8qIGRzcCAmIGl2YSBkaXZpZGVyIHN5Y2ggZW5hYmxlZCovCisjZGVmaW5lIElJSV9HRlhfRElWICAgICAgIDB4MgorI2RlZmluZSBJSUlfQlVTX0RJViAgICAgICAweDA4MzAxMDQ0CisjaWZkZWYgSU5QVVRfQ0xLXzEzTUhaCisjZGVmaW5lIElJSV9EUExMXzI2NiAgICAgIDB4MDExMEFDMDAgICAvKiAxM01IeiAqLworI2Vsc2UKKyNkZWZpbmUgSUlJX0RQTExfMjY2ICAgICAgMHgwMTg4NTUwMCAgIC8qIDEyTUh6ICovCisjZW5kaWYKKworLyogc2V0IGRlZmF1bHRzIGZvciBib290IHVwICovCisjaWZkZWYgUFJDTV9DT05GSUdfSQorIyBkZWZpbmUgRFBMTF9PVVQgICAgICAgICBJX0RQTExfT1VUX1gyCisjIGRlZmluZSBNUFVfRElWICAgICAgICAgIElfTVBVX0RJVgorIyBkZWZpbmUgRFNQX0RJViAgICAgICAgICBJX0RTUF9ESVYKKyMgZGVmaW5lIEdGWF9ESVYgICAgICAgICAgSV9HRlhfRElWCisjIGRlZmluZSBCVVNfRElWICAgICAgICAgIElfQlVTX0RJVgorIyBkZWZpbmUgRFBMTF9WQUwgICAgICAgICBJX0RQTExfMjY2CisjZWxpZiBQUkNNX0NPTkZJR19JSQorIyBkZWZpbmUgRFBMTF9PVVQgICAgICAgICBJSV9EUExMX09VVF9YMgorIyBkZWZpbmUgTVBVX0RJViAgICAgICAgICBJSV9NUFVfRElWCisjIGRlZmluZSBEU1BfRElWICAgICAgICAgIElJX0RTUF9ESVYKKyMgZGVmaW5lIEdGWF9ESVYgICAgICAgICAgSUlfR0ZYX0RJVgorIyBkZWZpbmUgQlVTX0RJViAgICAgICAgICBJSV9CVVNfRElWCisjIGRlZmluZSBEUExMX1ZBTCAgICAgICAgIElJX0RQTExfMzAwCisjZWxpZiBQUkNNX0NPTkZJR19JSUkKKyMgZGVmaW5lIERQTExfT1VUICAgICAgICAgSUlJX0RQTExfT1VUX1gyCisjIGRlZmluZSBNUFVfRElWICAgICAgICAgIElJSV9NUFVfRElWCisjIGRlZmluZSBEU1BfRElWICAgICAgICAgIElJSV9EU1BfRElWCisjIGRlZmluZSBHRlhfRElWICAgICAgICAgIElJSV9HRlhfRElWCisjIGRlZmluZSBCVVNfRElWICAgICAgICAgIElJSV9CVVNfRElWCisjIGRlZmluZSBEUExMX1ZBTCAgICAgICAgIElJSV9EUExMXzI2NgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2NrczI0M3guaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MyNDN4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkMmU0NgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MyNDN4LmgKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDUKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgL1BVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgICovCisjaWZuZGVmIF9PTUFQMjQzWF9DTE9DS1NfSF8KKyNkZWZpbmUgX09NQVAyNDNYX0NMT0NLU19IXworCisvKiBjbV9jbGtzZWwgY29yZSBmaWVsZHMgbm90IHJhdGlvIGdvdmVybmVkICovCisjZGVmaW5lIFJYX0NMS1NFTF9EU1MxCQkoMHgxMCA8PCA4KQorI2RlZmluZSBSWF9DTEtTRUxfRFNTMgkJKDB4MCA8PCAxMykKKyNkZWZpbmUgUlhfQ0xLU0VMX1NTSQkJKDB4NSA8PCAyMCkKKworLyogMjQzMCBSYXRpbydzICovCisvKiAyNDMwLVJhdGlvIENvbmZpZyAxICovCisjZGVmaW5lIFIxX0NMS1NFTF9MMwkJKDQgPDwgMCkKKyNkZWZpbmUgUjFfQ0xLU0VMX0w0CQkoMiA8PCA1KQorI2RlZmluZSBSMV9DTEtTRUxfVVNCCQkoNCA8PCAyNSkKKyNkZWZpbmUgUjFfQ01fQ0xLU0VMMV9DT1JFX1ZBTAlSMV9DTEtTRUxfVVNCIHwgUlhfQ0xLU0VMX1NTSSB8IFJYX0NMS1NFTF9EU1MyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSWF9DTEtTRUxfRFNTMSB8IFIxX0NMS1NFTF9MNCB8IFIxX0NMS1NFTF9MMworI2RlZmluZSBSMV9DTEtTRUxfTVBVCQkoMiA8PCAwKQorI2RlZmluZSBSMV9DTV9DTEtTRUxfTVBVX1ZBTAlSMV9DTEtTRUxfTVBVCisjZGVmaW5lIFIxX0NMS1NFTF9EU1AJCSgyIDw8IDApCisjZGVmaW5lIFIxX0NMS1NFTF9EU1BfSUYJKDIgPDwgNSkKKyNkZWZpbmUgUjFfQ01fQ0xLU0VMX0RTUF9WQUwJUjFfQ0xLU0VMX0RTUCB8IFIxX0NMS1NFTF9EU1BfSUYKKyNkZWZpbmUgUjFfQ0xLU0VMX0dGWAkJKDIgPDwgMCkKKyNkZWZpbmUgUjFfQ01fQ0xLU0VMX0dGWF9WQUwJUjFfQ0xLU0VMX0dGWAorI2RlZmluZSBSMV9DTEtTRUxfTURNCQkoNCA8PCAwKQorI2RlZmluZSBSMV9DTV9DTEtTRUxfTURNX1ZBTAlSMV9DTEtTRUxfTURNCisKKy8qIDI0MzAtUmF0aW8gQ29uZmlnIDIgKi8KKyNkZWZpbmUgUjJfQ0xLU0VMX0wzCQkoNiA8PCAwKQorI2RlZmluZSBSMl9DTEtTRUxfTDQJCSgyIDw8IDUpCisjZGVmaW5lIFIyX0NMS1NFTF9VU0IJCSgyIDw8IDI1KQorI2RlZmluZSBSMl9DTV9DTEtTRUwxX0NPUkVfVkFMCVIyX0NMS1NFTF9VU0IgfCBSWF9DTEtTRUxfU1NJIHwgUlhfQ0xLU0VMX0RTUzIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJYX0NMS1NFTF9EU1MxIHwgUjJfQ0xLU0VMX0w0IHwgUjJfQ0xLU0VMX0wzCisjZGVmaW5lIFIyX0NMS1NFTF9NUFUJCSgyIDw8IDApCisjZGVmaW5lIFIyX0NNX0NMS1NFTF9NUFVfVkFMCVIyX0NMS1NFTF9NUFUKKyNkZWZpbmUgUjJfQ0xLU0VMX0RTUAkJKDIgPDwgMCkKKyNkZWZpbmUgUjJfQ0xLU0VMX0RTUF9JRgkoMyA8PCA1KQorI2RlZmluZSBSMl9DTV9DTEtTRUxfRFNQX1ZBTAlSMl9DTEtTRUxfRFNQIHwgUjJfQ0xLU0VMX0RTUF9JRgorI2RlZmluZSBSMl9DTEtTRUxfR0ZYCQkoMiA8PCAwKQorI2RlZmluZSBSMl9DTV9DTEtTRUxfR0ZYX1ZBTCAgICBSMl9DTEtTRUxfR0ZYCisjZGVmaW5lIFIyX0NMS1NFTF9NRE0JCSg2IDw8IDApCisjZGVmaW5lIFIyX0NNX0NMS1NFTF9NRE1fVkFMCVIyX0NMS1NFTF9NRE0KKworLyogMjQzMC1SYXRpbyBCb290ICovCisjZGVmaW5lIFJCX0NMS1NFTF9MMwkJKDEgPDwgMCkKKyNkZWZpbmUgUkJfQ0xLU0VMX0w0CQkoMSA8PCA1KQorI2RlZmluZSBSQl9DTEtTRUxfVVNCCQkoMSA8PCAyNSkKKyNkZWZpbmUgUkJfQ01fQ0xLU0VMMV9DT1JFX1ZBTAlSQl9DTEtTRUxfVVNCIHwgUlhfQ0xLU0VMX1NTSSB8IFJYX0NMS1NFTF9EU1MyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSWF9DTEtTRUxfRFNTMSB8IFJCX0NMS1NFTF9MNCB8IFJCX0NMS1NFTF9MMworI2RlZmluZSBSQl9DTEtTRUxfTVBVCQkoMSA8PCAwKQorI2RlZmluZSBSQl9DTV9DTEtTRUxfTVBVX1ZBTAlSQl9DTEtTRUxfTVBVCisjZGVmaW5lIFJCX0NMS1NFTF9EU1AJCSgxIDw8IDApCisjZGVmaW5lIFJCX0NMS1NFTF9EU1BfSUYJKDEgPDwgNSkKKyNkZWZpbmUgUkJfQ01fQ0xLU0VMX0RTUF9WQUwJUkJfQ0xLU0VMX0RTUCB8IFJCX0NMS1NFTF9EU1BfSUYKKyNkZWZpbmUgUkJfQ0xLU0VMX0dGWAkJKDEgPDwgMCkKKyNkZWZpbmUgUkJfQ01fQ0xLU0VMX0dGWF9WQUwJUkJfQ0xLU0VMX0dGWAorI2RlZmluZSBSQl9DTEtTRUxfTURNCQkoMSA8PCAwKQorI2RlZmluZSBSQl9DTV9DTEtTRUxfTURNX1ZBTAlSQl9DTEtTRUxfTURNCisKKy8qIDI0MzAgVGFyZ2V0IG1vZGVzOiBBbG9uZyB3aXRoIGVhY2ggY29uZmlndXJhdGlvbiB0aGUgQ1BVIGhhcyBzZXZlcmFsIG1vZGVzCisgKiB3aGljaCBnb2VzIGFsb25nIHdpdGggdGhlbS4gTW9kZXMgbWFpbmx5IGFyZSB0aGUgYWRkaXRpb24gb2YgZGVzY3JpdGUgRFBMTAorICogY29tYmluYXRpb25zIHRvIGdvIGFsb25nIHdpdGggYSByYXRpby4KKyAqLworLyogaGFyZHdhcmUgZ292ZXJlbmQgKi8KKyNkZWZpbmUgTVhfNDhNX1NSQwkJKDAgPDwgMykKKyNkZWZpbmUgTVhfNTRNX1NSQwkJKDAgPDwgNSkKKyNkZWZpbmUgTVhfQVBMTFNfQ0xJS0lOXzEyCSgzIDw8IDIzKQorI2RlZmluZSBNWF9BUExMU19DTElLSU5fMTMJKDIgPDwgMjMpCisjZGVmaW5lIE1YX0FQTExTX0NMSUtJTl8xOV8yCSgwIDw8IDIzKQorCisvKiAyNDMwIC0gc3RhbmRhbG9uZSwgMipyZWYqTS8obisxKSwgTS9OIGlzIGZvciBleGFjdG5lc3Mgbm90IHJlbG9jayBzcGVlZCAqLworCisvKiBib290IChib290KSAqLworI2RlZmluZSBNQl9EUExMX01VTFQJCQkJKDEgPDwgMTIpCisjZGVmaW5lIE1CX0RQTExfRElWCQkJCQkoMCA8PCA4KQorI2RlZmluZSBNQl9DTV9DTEtTRUwxX1BMTF8xMl9WQUwgICAgIE1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTUJfRFBMTF9ESVYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNQl9EUExMX01VTFQgfCBNWF9BUExMU19DTElLSU5fMTIKKworI2RlZmluZSBNQl9DTV9DTEtTRUwxX1BMTF8xM19WQUwgICAgTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNQl9EUExMX0RJViBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1CX0RQTExfTVVMVCB8IE1YX0FQTExTX0NMSUtJTl8xMworCisjZGVmaW5lIE1CX0NNX0NMS1NFTDFfUExMXzE5X1ZBTCAgICBNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE1CX0RQTExfRElWIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTUJfRFBMTF9NVUxUIHwgTVhfQVBMTFNfQ0xJS0lOXzE5CisKKy8qICMyICAgKHJhdGlvMSkgRFBMTCA9IDMzMCoyID0gNjYwTUh6LCBMMz0xNjVNSHogKi8KKworI2RlZmluZSBNMl9EUExMX01VTFRfMTIJCSAgICAgICAgKDU1IDw8IDEyKQorI2RlZmluZSBNMl9EUExMX0RJVl8xMgkJICAgICAgICAoMSA8PCA4KQorI2RlZmluZSBNMl9DTV9DTEtTRUwxX1BMTF8xMl9WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNMl9EUExMX0RJVl8xMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE0yX0RQTExfTVVMVF8xMiB8IE1YX0FQTExTX0NMSUtJTl8xMgorLyogVXNlIDY1OC43TUh6IGluc3RlYWQgb2YgNjYwTUh6IGZvciBMUC1SZWZyZXNoIE09NzYgTj0yLCByZWxvY2sgdGltZSBpc3N1ZSAqLworI2RlZmluZSBNMl9EUExMX01VTFRfMTMJCSAgICAgICAgKDMzMCA8PCAxMikKKyNkZWZpbmUgTTJfRFBMTF9ESVZfMTMJCSAgICAgICAgKDEyIDw8IDgpCisjZGVmaW5lIE0yX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE0yX0RQTExfRElWXzEzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTJfRFBMTF9NVUxUXzEzIHwgTVhfQVBMTFNfQ0xJS0lOXzEzCisjZGVmaW5lIE0yX0RQTExfTVVMVF8xOQkJICAgICAgICAoMjc1IDw8IDEyKQorI2RlZmluZSBNMl9EUExMX0RJVl8xOQkJICAgICAgICAoMTUgPDwgOCkKKyNkZWZpbmUgTTJfQ01fQ0xLU0VMMV9QTExfMTlfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTJfRFBMTF9ESVZfMTkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNMl9EUExMX01VTFRfMTkgfCBNWF9BUExMU19DTElLSU5fMTlfMgorCisvKiAjMyAgIChyYXRpbzIpIERQTEwgPSAzMzAqMiA9IDY2ME1IeiwgTDM9MTEwTUh6ICovCisjZGVmaW5lIE0zX0RQTExfTVVMVF8xMgkJICAgICAgICAoNTUgPDwgMTIpCisjZGVmaW5lIE0zX0RQTExfRElWXzEyCQkgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIE0zX0NNX0NMS1NFTDFfUExMXzEyX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE0zX0RQTExfRElWXzEyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTNfRFBMTF9NVUxUXzEyIHwgTVhfQVBMTFNfQ0xJS0lOXzEyCisjZGVmaW5lIE0zX0RQTExfTVVMVF8xMwkJICAgICAgICAoMzMwIDw8IDEyKQorI2RlZmluZSBNM19EUExMX0RJVl8xMwkJICAgICAgICAoMTIgPDwgOCkKKyNkZWZpbmUgTTNfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTNfRFBMTF9ESVZfMTMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNM19EUExMX01VTFRfMTMgfCBNWF9BUExMU19DTElLSU5fMTMKKyNkZWZpbmUgTTNfRFBMTF9NVUxUXzE5CQkgICAgICAgICgyNzUgPDwgMTIpCisjZGVmaW5lIE0zX0RQTExfRElWXzE5CQkgICAgICAgICgxNSA8PCA4KQorI2RlZmluZSBNM19DTV9DTEtTRUwxX1BMTF8xOV9WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNM19EUExMX0RJVl8xOSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE0zX0RQTExfTVVMVF8xOSB8IE1YX0FQTExTX0NMSUtJTl8xOV8yCisKKy8qICM0ICAgKHJhdGlvMiksIERQTEwgPSAzOTkqMiA9IDc5OE1IeiwgTDM9MTMzTUh6Ki8KKyNkZWZpbmUgTTRfRFBMTF9NVUxUXzEyCQkgICAgICAgICgxMzMgPDwgMTIpCisjZGVmaW5lIE00X0RQTExfRElWXzEyCQkgICAgICAgICgzIDw8IDgpCisjZGVmaW5lIE00X0NNX0NMS1NFTDFfUExMXzEyX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE00X0RQTExfRElWXzEyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTRfRFBMTF9NVUxUXzEyIHwgTVhfQVBMTFNfQ0xJS0lOXzEyCisjZGVmaW5lIE00X0RQTExfTVVMVF8xMwkJICAgICAgICAoMzk5IDw8IDEyKQorI2RlZmluZSBNNF9EUExMX0RJVl8xMwkJICAgICAgICAoMTIgPDwgOCkKKyNkZWZpbmUgTTRfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTRfRFBMTF9ESVZfMTMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNNF9EUExMX01VTFRfMTMgfCBNWF9BUExMU19DTElLSU5fMTMKKyNkZWZpbmUgTTRfRFBMTF9NVUxUXzE5CQkgICAgICAgICgxNDUgPDwgMTIpCisjZGVmaW5lIE00X0RQTExfRElWXzE5CQkgICAgICAgICg2IDw8IDgpCisjZGVmaW5lIE00X0NNX0NMS1NFTDFfUExMXzE5X1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE00X0RQTExfRElWXzE5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTRfRFBMTF9NVUxUXzE5IHwgTVhfQVBMTFNfQ0xJS0lOXzE5XzIKKworLyogIzVhICAocmF0aW8xKSBiYXNlcG9ydC10YXJnZXQsIHRhcmdldCBEUExMID0gMjY2KjIgPSA1MzJNSHosIEwzPTEzM01IeiAqLworI2RlZmluZSBNNUFfRFBMTF9NVUxUXzEyCSAgICAgICAgKDEzMyA8PCAxMikKKyNkZWZpbmUgTTVBX0RQTExfRElWXzEyCQkgICAgICAgICg1IDw8IDgpCisjZGVmaW5lIE01QV9DTV9DTEtTRUwxX1BMTF8xMl9WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNNUFfRFBMTF9ESVZfMTIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNNUFfRFBMTF9NVUxUXzEyIHwgTVhfQVBMTFNfQ0xJS0lOXzEyCisjZGVmaW5lIE01QV9EUExMX01VTFRfMTMJICAgICAgICAoMjY2IDw8IDEyKQorI2RlZmluZSBNNUFfRFBMTF9ESVZfMTMJCSAgICAgICAgKDEyIDw8IDgpCisjZGVmaW5lIE01QV9DTV9DTEtTRUwxX1BMTF8xM19WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNNUFfRFBMTF9ESVZfMTMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNNUFfRFBMTF9NVUxUXzEzIHwgTVhfQVBMTFNfQ0xJS0lOXzEzCisjZGVmaW5lIE01QV9EUExMX01VTFRfMTkJICAgICAgICAoMTgwIDw8IDEyKQorI2RlZmluZSBNNUFfRFBMTF9ESVZfMTkJCSAgICAgICAgKDEyIDw8IDgpCisjZGVmaW5lIE01QV9DTV9DTEtTRUwxX1BMTF8xOV9WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNNUFfRFBMTF9ESVZfMTkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNNUFfRFBMTF9NVUxUXzE5IHwgTVhfQVBMTFNfQ0xJS0lOXzE5XzIKKworLyogIzViICAocmF0aW8xKSB0YXJnZXQgRFBMTCA9IDIwMCoyID0gNDAwTUh6LCBMMz0xMDBNSHogKi8KKyNkZWZpbmUgTTVCX0RQTExfTVVMVF8xMgkgICAgICAgICg1MCA8PCAxMikKKyNkZWZpbmUgTTVCX0RQTExfRElWXzEyCQkgICAgICAgICgyIDw8IDgpCisjZGVmaW5lIE01Ql9DTV9DTEtTRUwxX1BMTF8xMl9WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNNUJfRFBMTF9ESVZfMTIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNNUJfRFBMTF9NVUxUXzEyIHwgTVhfQVBMTFNfQ0xJS0lOXzEyCisjZGVmaW5lIE01Ql9EUExMX01VTFRfMTMJICAgICAgICAoMjAwIDw8IDEyKQorI2RlZmluZSBNNUJfRFBMTF9ESVZfMTMJCSAgICAgICAgKDEyIDw8IDgpCisKKyNkZWZpbmUgTTVCX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE01Ql9EUExMX0RJVl8xMyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE01Ql9EUExMX01VTFRfMTMgfCBNWF9BUExMU19DTElLSU5fMTMKKyNkZWZpbmUgTTVCX0RQTExfTVVMVF8xOQkgICAgICAgICgxMjUgPDwgMTIpCisjZGVmaW5lIE01Ql9EUExMX0RJVl8xOQkJICAgICAgICAoMzEgPDwgOCkKKyNkZWZpbmUgTTVCX0NNX0NMS1NFTDFfUExMXzE5X1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE01Ql9EUExMX0RJVl8xOSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE01Ql9EUExMX01VTFRfMTkgfCBNWF9BUExMU19DTElLSU5fMTlfMgorCisvKiAyNDMwIC0gY2hhc3NpcyAoc2VkbmEpICovCisJLyogMTY1IChyYXRpbzEpIHNhbWUgYXMgYWJvdmUgIzIgKi8KKwkvKiAxNTAgKHJhdGlvMSkqLworCS8qIDEzMyAocmF0aW8yKSBzYW1lIGFzIGFib3ZlICM0ICovCisJLyogMTEwIChyYXRpbzIpIHNhbWUgYXMgYWJvdmUgIzMqLworCS8qIDEwNCAocmF0aW8yKSovCisJLyogYm9vdCAoYm9vdCkgKi8KKworLyogaGlnaCBhbmQgbG93IG9wZXJhdGlvbiB2YWx1ZSAqLworI2RlZmluZSBNWF9DTEtTRUwyX1BMTF8yeF9WQUwgICAoMiA8PCAwKQorI2RlZmluZSBNWF9DTEtTRUwyX1BMTF8xeF9WQUwgICAoMSA8PCAwKQorCisvKiBzZXQgZGVmYXVsdHMgZm9yIGJvb3QgdXAgKi8KKyNpZiBkZWZpbmVkKFBSQ01fQ09ORklHXzIpICAgICAvKiBBUk0tMzMwTUh6IElWQTItMzMwTUh6IEwzLTE2NU1IeiAqLworIyBkZWZpbmUgRFBMTF9PVVQJTVhfQ0xLU0VMMl9QTExfMnhfVkFMCisjIGRlZmluZSBNUFVfRElWCVIxX0NMS1NFTF9NUFUKKyMgZGVmaW5lIERTUF9ESVYJUjFfQ01fQ0xLU0VMX0RTUF9WQUwKKyMgZGVmaW5lIEdGWF9ESVYJUjFfQ01fQ0xLU0VMX0dGWF9WQUwKKyMgZGVmaW5lIEJVU19ESVYJUjFfQ01fQ0xLU0VMMV9DT1JFX1ZBTAorIyBkZWZpbmUgRFBMTF9WQUwJTTJfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCisjIGRlZmluZSBNRE1fRElWCVIyX0NNX0NMS1NFTF9NRE1fVkFMCisjZWxpZiBkZWZpbmVkKFBSQ01fQ09ORklHXzMpICAgICAvKiBBUk0tMzMwTUh6IElWQTItMzMwTUh6IEwzLTExME1IeiAqLworIyBkZWZpbmUgRFBMTF9PVVQJTVhfQ0xLU0VMMl9QTExfMnhfVkFMCisjIGRlZmluZSBNUFVfRElWCVIyX0NMS1NFTF9NUFUKKyMgZGVmaW5lIERTUF9ESVYJUjJfQ01fQ0xLU0VMX0RTUF9WQUwKKyMgZGVmaW5lIEdGWF9ESVYJUjJfQ01fQ0xLU0VMX0dGWF9WQUwKKyMgZGVmaW5lIEJVU19ESVYJUjJfQ01fQ0xLU0VMMV9DT1JFX1ZBTAorIyBkZWZpbmUgRFBMTF9WQUwJTTNfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCisjIGRlZmluZSBNRE1fRElWCVIyX0NNX0NMS1NFTF9NRE1fVkFMCisjZWxpZiBkZWZpbmVkKFBSQ01fQ09ORklHXzVBKSAgLyogQVJNLTI2Nk1IeiBJVkEyLTI2Nk1IeiBMMy0xMzNNSHogKi8KKyMgZGVmaW5lIERQTExfT1VUCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTAorIyBkZWZpbmUgTVBVX0RJVglSMV9DTEtTRUxfTVBVCisjIGRlZmluZSBEU1BfRElWCVIxX0NNX0NMS1NFTF9EU1BfVkFMCisjIGRlZmluZSBHRlhfRElWCVIxX0NNX0NMS1NFTF9HRlhfVkFMCisjIGRlZmluZSBCVVNfRElWCVIxX0NNX0NMS1NFTDFfQ09SRV9WQUwKKyMgZGVmaW5lIERQTExfVkFMCU01QV9DTV9DTEtTRUwxX1BMTF8xM19WQUwKKyMgZGVmaW5lIE1ETV9ESVYJUjJfQ01fQ0xLU0VMX01ETV9WQUwKKyNlbGlmIGRlZmluZWQoUFJDTV9DT05GSUdfNUIpICAvKiBBUk0tMjAwTUh6IElWQTItMjAwTUh6IEwzLTEwME1IeiAqLworIyBkZWZpbmUgRFBMTF9PVVQJTVhfQ0xLU0VMMl9QTExfMnhfVkFMCisjIGRlZmluZSBNUFVfRElWCVIxX0NMS1NFTF9NUFUKKyMgZGVmaW5lIERTUF9ESVYJUjFfQ01fQ0xLU0VMX0RTUF9WQUwKKyMgZGVmaW5lIEdGWF9ESVYJUjFfQ01fQ0xLU0VMX0dGWF9WQUwKKyMgZGVmaW5lIEJVU19ESVYJUjFfQ01fQ0xLU0VMMV9DT1JFX1ZBTAorIyBkZWZpbmUgRFBMTF9WQUwJTTVCX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAorIyBkZWZpbmUgTURNX0RJVglSMV9DTV9DTEtTRUxfTURNX1ZBTAorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L21lbS5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L21lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhM2RhNzMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvbWVtLmgKQEAgLTAsMCArMSwzODMgQEAKKworLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA1CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfT01BUDI0WFhfTUVNX0hfCisjZGVmaW5lIF9PTUFQMjRYWF9NRU1fSF8KKworI2RlZmluZSBTRFJDX0NTMF9PU0VUICAgIDB4MAorI2RlZmluZSBTRFJDX0NTMV9PU0VUICAgIDB4MzAgIC8qIG1pcnJvciBDUzEgcmVncyBhcHBlYXIgb2Zmc2V0IDB4MzAgZnJvbSBDUzAgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qIHN0cnVjdCdzIGZvciBob2xkaW5nIGRhdGEgdGFibGVzIGZvciBjdXJyZW50IGJvYXJkcywgdGhleSBhcmUgZ2V0dGluZyB1c2VkCisgICBlYXJseSBpbiBpbml0IHdoZW4gTk8gZ2xvYmFsIGFjY2VzcyBhcmUgdGhlcmUgKi8KK3N0cnVjdCBzZHJjX2RhdGFfcyB7CisJdTMyICAgIHNkcmNfc2hhcmluZzsKKwl1MzIgICAgc2RyY19tZGNmZ18wX2RkcjsKKwl1MzIgICAgc2RyY19tZGNmZ18wX3NkcjsKKwl1MzIgICAgc2RyY19hY3RpbV9jdHJsYV8wOworCXUzMiAgICBzZHJjX2FjdGltX2N0cmxiXzA7CisJdTMyICAgIHNkcmNfcmZyX2N0cmw7CisJdTMyICAgIHNkcmNfbXJfMF9kZHI7CisJdTMyICAgIHNkcmNfbXJfMF9zZHI7CisJdTMyICAgIHNkcmNfZGxsYWJfY3RybDsKK30gLypfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkqLzsKK3R5cGVkZWYgc3RydWN0IHNkcmNfZGF0YV9zIHNkcmNfZGF0YV90OworCit0eXBlZGVmIGVudW0geworCVNUQUNLRUQJCT0gMCwKKwlJUF9ERFIJCT0gMSwKKwlDT01CT19ERFIJPSAyLAorCUlQX1NEUgkgCT0gMywKK30gbWVtX3Q7CisKKyNlbmRpZgorCisvKiBzZXQgdGhlIDI0M3gtU0RSQyBpbmNvbWluZyBhZGRyZXNzIGNvbnZlbnRpb24gKi8KKyNpZiBkZWZpbmVkKFNEUkNfQl9SX0MpCisjZGVmaW5lIEJfQUxMCSgwIDw8IDYpCS8qIGJhbmstcm93LWNvbHVtbiAqLworI2VsaWYgZGVmaW5lZChTRFJDX0IxX1JfQjBfQykKKyNkZWZpbmUgQl9BTEwJKDEgPDwgNikJLyogYmFuazEtcm93LWJhbmswLWNvbHVtbiAqLworI2VsaWYgZGVmaW5lZChTRFJDX1JfQl9DKQorI2RlZmluZSBCX0FMTAkoMiA8PCA2KQkvKiByb3ctYmFuay1jb2x1bW4gKi8KKyNlbmRpZgorCisvKiBTbG93ZXIgZnVsbCBmcmVxdWVuY3kgcmFuZ2UgZGVmYXVsdCB0aW1pbmdzIGZvciB4MzIgb3BlcmF0aW9uKi8KKyNkZWZpbmUgSDRfMjQyMF9TRFJDX1NIQVJJTkcJCTB4MDAwMDAxMDAKKyNkZWZpbmUgSDRfMjQyMF9TRFJDX01EQ0ZHXzBfU0RSCTB4MDBEMDQwMTAgLyogZGlzY3JldGUgc2RyIG1vZHVsZSAqLworI2RlZmluZSBINF8yNDIwX1NEUkNfTVJfMF9TRFIJCTB4MDAwMDAwMzEKKyNkZWZpbmUgSDRfMjQyMF9TRFJDX01EQ0ZHXzBfRERSCTB4MDE3MDIwMTEgLyogZGVzY3JpdGUgZGRyIG1vZHVsZSAqLworI2RlZmluZSBTRFBfMjQzMF9TRFJDX01EQ0ZHXzBfRERSCSgweDAyNTg0MDE5fEJfQUxMKSAvKiBJbmZpbiBkZHIgbW9kdWxlICovCisjZGVmaW5lIEg0XzI0MjBfQ09NQk9fTURDRkdfMF9ERFIJMHgwMDgwMTAxMSAvKiBjb21ibyBtb2R1bGUgKi8KKyNkZWZpbmUgSDRfMjQyMF9TRFJDX01SXzBfRERSCQkweDAwMDAwMDMyCisKKyNkZWZpbmUgSDRfMjQyMl9TRFJDX1NIQVJJTkcJCTB4MDAwMDRiMDAKKyNkZWZpbmUgSDRfMjQyMl9TRFJDX01EQ0ZHX01PTk9fRERSCTB4MDFBMDIwMTEgLyogc3RhY2tlZCBtb25vIGRpZSBkZHIgb24gMjQyMiAqLworI2RlZmluZSBINF8yNDIyX1NEUkNfTURDRkdfMF9ERFIJMHgwMDgwMTAxMSAvKiBzdGFja2VkIGR1YWwgZGllIGRkciBvbiAyNDIyICovCisjZGVmaW5lIEg0XzI0MjJfU0RSQ19NUl8wX0REUgkJMHgwMDAwMDAzMgorCisjZGVmaW5lIEg0XzI0MjNfU0RSQ19TSEFSSU5HCQkweDAwMDA0OTAwIC8qIDI0MjBQT1AgYm9hcmQgY2tlMSBub3QgY29ubmVjdGVkICovCisjZGVmaW5lIEg0XzI0MjNfU0RSQ19NRENGR18wX0REUgkweDAxQTAyMDExIC8qIHN0YWNrZWQgZHVhbCBkaWUgZGRyIG9uIDI0MjMgKi8KKyNkZWZpbmUgSDRfMjQyM19TRFJDX01EQ0ZHXzFfRERSCTB4MDA4MDEwMTEgLyogc3RhY2tlZCBkdWFsIGRpZSBkZHIgb24gMjQyMyAqLworCisvKiBFUzEgd29yayBhcm91bmQgdGltaW5ncyAqLworI2RlZmluZSBINF8yNDJ4X1NEUkNfQUNUSU1fQ1RSTEFfMF9FUzEJMHg5YmVhZDkwOSAgLyogMTY1TWh6IGZvciB1c2Ugd2l0aCAxMDAvMTMzICovCisjZGVmaW5lIEg0XzI0MnhfU0RSQ19BQ1RJTV9DVFJMQl8wX0VTMSAgMHgwMDAwMDAyMAorI2RlZmluZSBINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxCTB4MDAwMDI0MDEgIC8qIHVzZSBvdmVyIHJlZnJlc2ggZm9yIEVTMSAqLworCisvKiBvcHRpbWl6ZWQgdGltaW5ncyBnb29kIGZvciBjdXJyZW50IHNoaXBwaW5nIHBhcnRzICovCisjZGVmaW5lIEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQV8wXzEwME1IeiAgIDB4NUE1OUI0ODUKKyNkZWZpbmUgSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxCXzBfMTAwTUh6ICAgMHgwMDAwMDAwZQorI2RlZmluZSBINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEFfMF8xMzNNSHogICAweDhCQTZFNkM4IC8qIHRlbXAgd2FybiAwIHNldHRpbmdzICovCisjZGVmaW5lIEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQl8wXzEzM01IeiAgIDB4MDAwMDAwMTAgLyogdGVtcCB3YXJuIDAgc2V0dGluZ3MgKi8KKyNkZWZpbmUgSDRfMjQyWF9TRFJDX1JGUl9DVFJMXzEwME1IegkgICAgMHgwMDAyZGEwMQorI2RlZmluZSBINF8yNDJYX1NEUkNfUkZSX0NUUkxfMTMzTUh6CSAgICAweDAwMDNkZTAxIC8qIDcuOHVzLzcuNW5zIC0gNTAgPSAweDNkZSAqLworI2RlZmluZSBTRFBfMjRYWF9TRFJDX1JGUl9DVFJMXzE2NU1IegkgICAgMHgwMDA0ZTIwMSAvKiA3Ljh1cy82bnMgLSA1MCA9IDB4NGUyICovCisjZGVmaW5lIEg0XzI0MlhfU0RSQ19ETExBQl9DVFJMXzEwME1IeiAgICAgIDB4MDAwMDk4MEUgLyogOTBkZWcsIGFsbG93IERQTExvdXQqMSB0byB3b3JrIChjb21ibykqLworI2RlZmluZSBINF8yNDJYX1NEUkNfRExMQUJfQ1RSTF8xMzNNSHogICAgICAweDAwMDA2OTBFIC8qIDkwZGVnLCBmb3IgRVMyICovCisjZGVmaW5lIFNEUF8yNFhYX1NEUkNfRExMQUJfQ1RSTF8xNjVNSHogICAgIDB4MDAwMDE3MEMgLyogNzJkZWcsIGNvZGUgd2lsbCByZWNhbGMgZGxsIGxvYWQgKi8KKworLyogSW5maW5lb24gcGFydCBvZiAyNDMwU0RQICgxMzNNSHogb3B0aW1pemVkKSB+IDcuNW5zCisgKglUREFMID0gVHdyL1RjayArIFRycC90Y2sgPSAxNS83LjUgKyAyMi41LzcuNSA9IDIgKyAzID0gNQorICoJVERQTCA9IDE1LzcuNQk9IDIKKyAqCVRSUkQgPSAxNS8yLjUJPSAyCisgKglUUkNEID0gMjIuNS83LjUJPSAzCisgKglUUlAgPSAyMi41LzcuNQk9IDMKKyAqCVRSQVMgPSA0NS83LjUJPSA2CisgKglUUkMgPSA2NS83LjUJPSA4LjYtPjkKKyAqCVRSRkMgPSA3NS83LjUJPSAxMAorICogICBBQ1RJTUIKKyAqCVRDS0UgPSAyCTxuZXcgaW4gMjQzMD4KKyAqCVhTUiA9IDEyMC83LjUgPSAxNgorICovCisjZGVmaW5lIFREQUxfMTMzICAgNQorI2RlZmluZSBURFBMXzEzMyAgIDIKKyNkZWZpbmUgVFJSRF8xMzMgICAyCisjZGVmaW5lIFRSQ0RfMTMzICAgMworI2RlZmluZSBUUlBfMTMzICAgIDMKKyNkZWZpbmUgVFJBU18xMzMgICA2CisjZGVmaW5lIFRSQ18xMzMgICAgOQorI2RlZmluZSBUUkZDXzEzMyAgMTAKKyNkZWZpbmUgVl9BQ1RJTUFfMTMzICgoVFJGQ18xMzMgPDwgMjcpIHwgKFRSQ18xMzMgPDwgMjIpIHwgKFRSQVNfMTMzIDw8IDE4KSB8KFRSUF8xMzMgPDwgMTUpIHwgXAorCQkoVFJDRF8xMzMgPDwgMTIpIHwoVFJSRF8xMzMgPDwgOSkgfChURFBMXzEzMyA8PCA2KSB8IChUREFMXzEzMykpCisKKyNkZWZpbmUgVENLRV8xMzMgICAyCisjZGVmaW5lIFhTUl8xMzMgICAxNgorI2RlZmluZSBWX0FDVElNQl8xMzMgKChUQ0tFXzEzMyA8PCAxMikgfCAoWFNSXzEzMyA8PCAwKSkKKworLyogSW5maW5lb24gcGFydCBvZiAyNDMwU0RQICgxNjVNSHogb3B0aW1pemVkKSA2LjA2bnMKKyAqICAgQUNUSU1BCisgKglUREFMID0gVHdyL1RjayArIFRycC90Y2sgPSAxNS82ICsgMTgvNiA9IDIuNSArIDMgPSA1LjUgLT4gNgorICoJVERQTCAoVHdyKSA9IDE1LzYJPSAyLjUgLT4gMworICoJVFJSRCA9IDEyLzYJPSAyCisgKglUUkNEID0gMTgvNgk9IDMKKyAqCVRSUCA9IDE4LzYJPSAzCisgKglUUkFTID0gNDIvNgk9IDcKKyAqCVRSQyA9IDYwLzYJPSAxMAorICoJVFJGQyA9IDcyLzYJPSAxMgorICogICBBQ1RJTUIKKyAqCVRDS0UgPSAyCTxuZXcgaW4gMjQzMD4KKyAqCVhTUiA9IDEyMC82ID0gMjAKKyAqLworI2RlZmluZSBUREFMXzE2NSAgIDYKKyNkZWZpbmUgVERQTF8xNjUgICAzCisjZGVmaW5lIFRSUkRfMTY1ICAgMgorI2RlZmluZSBUUkNEXzE2NSAgIDMKKyNkZWZpbmUgVFJQXzE2NSAgICAzCisjZGVmaW5lIFRSQVNfMTY1ICAgNworI2RlZmluZSBUUkNfMTY1ICAgMTAKKyNkZWZpbmUgVFJGQ18xNjUgIDEyCisjZGVmaW5lIFZfQUNUSU1BXzE2NSAoKFRSRkNfMTY1IDw8IDI3KSB8IChUUkNfMTY1IDw8IDIyKSB8IChUUkFTXzE2NSA8PCAxOCkgfChUUlBfMTY1IDw8IDE1KSB8IFwKKwkJKFRSQ0RfMTY1IDw8IDEyKSB8KFRSUkRfMTY1IDw8IDkpIHwoVERQTF8xNjUgPDwgNikgfCAoVERBTF8xNjUpKQorCisjZGVmaW5lIFRDS0VfMTY1ICAgMgorI2RlZmluZSBYU1JfMTY1ICAgMjAKKyNkZWZpbmUgVl9BQ1RJTUJfMTY1ICgoVENLRV8xNjUgPDwgMTIpIHwgKFhTUl8xNjUgPDwgMCkpCisKKyNpZiBkZWZpbmVkKFBSQ01fQ09ORklHX0lJKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHXzVCKQorIyBkZWZpbmUgSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxBXzAgIEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQV8wXzEwME1IegorIyBkZWZpbmUgU0RQXzI0MzBfU0RSQ19BQ1RJTV9DVFJMQV8wIFZfQUNUSU1BXzEzMworIyBkZWZpbmUgSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxCXzAgIEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQl8wXzEwME1IegorIyBkZWZpbmUgSDRfMjQyMF9TRFJDX1JGUl9DVFJMICAgICAgIEg0XzI0MlhfU0RSQ19SRlJfQ1RSTF8xMDBNSHoKKyMgZGVmaW5lIEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICAgICBINF8yNDJYX1NEUkNfRExMQUJfQ1RSTF8xMDBNSHoKKyMgZGVmaW5lIFNEUF8yNDMwX1NEUkNfRExMQUJfQ1RSTCAgICAweDAwMDA3MzBFCisjIGRlZmluZSBINF8yNDIyX1NEUkNfQUNUSU1fQ1RSTEFfMCAgSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxBXzBfMTAwTUh6CisjIGRlZmluZSBINF8yNDIyX1NEUkNfQUNUSU1fQ1RSTEJfMCAgSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxCXzBfMTAwTUh6CisjIGRlZmluZSBINF8yNDIyX1NEUkNfUkZSX0NUUkwgICAgICAgSDRfMjQyWF9TRFJDX1JGUl9DVFJMXzEwME1IegorIyBkZWZpbmUgSDRfMjQyMl9TRFJDX0RMTEFCX0NUUkwgICAgIEg0XzI0MlhfU0RSQ19ETExBQl9DVFJMXzEwME1IegorI2VsaWYgZGVmaW5lZChQUkNNX0NPTkZJR19JSUkpIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfNUEpIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfMykKKyMgZGVmaW5lIEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQV8wICBINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEFfMF8xMzNNSHoKKyMgZGVmaW5lIFNEUF8yNDMwX1NEUkNfQUNUSU1fQ1RSTEFfMCBWX0FDVElNQV8xMzMKKyMgZGVmaW5lIEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wICBINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEJfMF8xMzNNSHoKKyMgZGVmaW5lIEg0XzI0MjBfU0RSQ19SRlJfQ1RSTCAgICAgICBINF8yNDJYX1NEUkNfUkZSX0NUUkxfMTMzTUh6CisjIGRlZmluZSBINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAgICAgSDRfMjQyWF9TRFJDX0RMTEFCX0NUUkxfMTMzTUh6CisjIGRlZmluZSBTRFBfMjQzMF9TRFJDX0RMTEFCX0NUUkwgICAgMHgwMDAwNzMwRQorIyBkZWZpbmUgSDRfMjQyMl9TRFJDX0FDVElNX0NUUkxBXzAgIEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQV8wXzEzM01IegorIyBkZWZpbmUgSDRfMjQyMl9TRFJDX0FDVElNX0NUUkxCXzAgIEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQl8wXzEzM01IegorIyBkZWZpbmUgSDRfMjQyMl9TRFJDX1JGUl9DVFJMICAgICAgIEg0XzI0MlhfU0RSQ19SRlJfQ1RSTF8xMzNNSHoKKyMgZGVmaW5lIEg0XzI0MjJfU0RSQ19ETExBQl9DVFJMICAgICBINF8yNDJYX1NEUkNfRExMQUJfQ1RSTF8xMzNNSHoKKyNlbGlmIGRlZmluZWQoUFJDTV9DT05GSUdfSSkgfHwgZGVmaW5lZChQUkNNX0NPTkZJR18yKQorIyBkZWZpbmUgSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxBXzAgIFZfQUNUSU1BXzE2NSAKKyMgZGVmaW5lIFNEUF8yNDMwX1NEUkNfQUNUSU1fQ1RSTEFfMCBWX0FDVElNQV8xNjUKKyMgZGVmaW5lIEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wICBWX0FDVElNQl8xNjUgCisjIGRlZmluZSBINF8yNDIwX1NEUkNfUkZSX0NUUkwgICAgICAgU0RQXzI0WFhfU0RSQ19SRlJfQ1RSTF8xNjVNSHoKKyMgZGVmaW5lIEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICAgICBTRFBfMjRYWF9TRFJDX0RMTEFCX0NUUkxfMTY1TUh6CisjIGRlZmluZSBTRFBfMjQzMF9TRFJDX0RMTEFCX0NUUkwgICAgU0RQXzI0WFhfU0RSQ19ETExBQl9DVFJMXzE2NU1IegorIyBkZWZpbmUgSDRfMjQyMl9TRFJDX0FDVElNX0NUUkxBXzAgIFZfQUNUSU1BXzE2NSAKKyMgZGVmaW5lIEg0XzI0MjJfU0RSQ19BQ1RJTV9DVFJMQl8wICBWX0FDVElNQl8xNjUgCisjIGRlZmluZSBINF8yNDIyX1NEUkNfUkZSX0NUUkwgICAgICAgU0RQXzI0WFhfU0RSQ19SRlJfQ1RSTF8xNjVNSHoKKyMgZGVmaW5lIEg0XzI0MjJfU0RSQ19ETExBQl9DVFJMICAgICBTRFBfMjRYWF9TRFJDX0RMTEFCX0NUUkxfMTY1TUh6CisjZW5kaWYKKworLyoKKyAqIEdQTUMgc2V0dGluZ3MgLQorICogRGVmaW5pdGlvbnMgaXMgYXMgcGVyIHRoZSBmb2xsb3dpbmcgZm9ybWF0CisgKiAjIGRlZmluZSA8UEFSVD5fR1BNQ19DT05GSUc8eD4gPHZhbHVlPgorICogV2hlcmU6CisgKiBQQVJUIGlzIHRoZSBwYXJ0IG5hbWUgZS5nLiBTVE5PUiAtIEludGVsIFN0cmF0YSBGbGFzaAorICogeCBpcyBHUE1DIGNvbmZpZyByZWdpc3RlcnMgZnJvbSAxIHRvIDYgKHRoZXJlIHdpbGwgYmUgNiBtYWNyb3MpCisgKiBWYWx1ZSBpcyBjb3JyZXNwb25kaW5nIHZhbHVlCisgKgorICogRm9yIGV2ZXJ5IHZhbGlkIFBSQ00gY29uZmlndXJhdGlvbiB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgZGVmaW5pdGlvbiBvZiB0aGUgc2FtZS4KKyAqIGlmIHZhbHVlcyBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIGJvYXJkLCB0aGlzIGRlZmluaXRpb24gd2lsbCBiZSBwcmVzZW50IGluIHRoaXMgZmlsZQorICogaWYgdmFsdWVzIGFyZSBkZXBlbmRlbnQgb24gdGhlIGJvYXJkLCB0aGVuIHRoaXMgc2hvdWxkIGdvIGludG8gY29ycmVzcG9uZGluZyBtZW0tYm9hcmROYW1lLmggZmlsZQorICoKKyAqIEN1cnJlbnRseSB2YWxpZCBwYXJ0IE5hbWVzIGFyZSAoUEFSVCk6CisgKiBTVE5PUiAtIEludGVsIFN0cmF0YSBGbGFzaAorICogU01OQU5EIC0gU2Ftc3VuZyBOQU5ECisgKiBNUERCIC0gSDQgTVBEQiBib2FyZAorICogU0JOT1IgLSBTaWJsZXkgTk9SCisgKiBPTk5BTkQgLSBTYW1zdW5nIE9uZSBOQU5ECisgKgorICogaW5jbHVkZS9jb25maWdzL2ZpbGUuaCBjb250YWlucyB0aGUgZm9sbG93aW5nIGRlZm4gLSBmb3IgYWxsIENTIHdlIGFyZSBpbnRlcmVzdGVkCisgKiAjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1N4IFBBUlQKKyAqICNkZWZpbmUgT01BUDI0WFhfR1BNQ19DU3hfU0laRSBTaXplCisgKiAjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1N4X01BUCBNYXAKKyAqIFdoZXJlOgorICogeCAtIENTIG51bWJlcgorICogUEFSVCAtIFBhcnQgTmFtZSBhcyBkZWZpbmVkIGFib3ZlCisgKiBTSVpFIC0gaG93IGJpZyBpcyB0aGUgbWFwcGluZyB0byBiZQorICogICBHUE1DX1NJWkVfMTI4TSAtIDB4OAorICogICBHUE1DX1NJWkVfNjRNICAtIDB4QworICogICBHUE1DX1NJWkVfMzJNICAtIDB4RQorICogICBHUE1DX1NJWkVfMTZNICAtIDB4RgorICogTUFQICAtIE1hcCB0aGlzIENTIHRvIHdoaWNoIGFkZHJlc3MoR1BNQyBhZGRyZXNzIHNwYWNlKS0gQWJzb2x1dGUgYWRkcmVzcworICogICA+PjI0IGJlZm9yZSBiZWluZyB1c2VkLgorICovCisKKyNkZWZpbmUgR1BNQ19TSVpFXzI1Nk0gIDB4MAorI2RlZmluZSBHUE1DX1NJWkVfMTI4TSAgMHg4CisjZGVmaW5lIEdQTUNfU0laRV82NE0gICAweEMKKyNkZWZpbmUgR1BNQ19TSVpFXzMyTSAgIDB4RQorI2RlZmluZSBHUE1DX1NJWkVfMTZNICAgMHhGCisKKyNpZiBkZWZpbmVkKFBSQ01fQ09ORklHX0lJKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHXzVCKSAvKiBMMyBhdCAxMDBNSHogKi8KKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzEgMHgwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUcyIDB4MDAxNDE0MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzMgMHgwMDE0MTQwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNCAweDBGMDEwRjAxCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc1IDB4MDEwQzE0MTQKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzYgMHgwMDAwMEE4MAorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUcxICAweDMKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMiAgMHgwMDBmMGYwMQorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUczICAweDAwMDUwNTAyCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzQgIDB4MEMwNjBDMDYKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNSAgMHgwMTEzMUYxRgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc2ICAweDAgIC8qIDA/IE5vdCBkZWZpbmVkIHNvIGZhci4uLiB0aGlzIHZhbHVlIGlzIHJlc2V0IHZhbCBhcyBwZXIgZ3BtYyBkb2MgKi8KKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUcxICAgMHgwMDAxMTAwMAorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzIgICAweDAwMUYxRjAwCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMyAgIDB4MDAwODA4MDIKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc0ICAgMHgxQzA5MUMwOQorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzUgICAweDAzMUExRjFGCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNiAgIDB4MDAwMDAzQzIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQUkNNX0NPTkZJR19JSUkpIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfNUEpIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfMykgLyogTDMgYXQgMTMzTUh6ICovCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDE4MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzIgMHgwMDE0MTQwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMyAweDAwMTQxNDAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc0IDB4MEYwMTBGMDEKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzUgMHgwMTBDMTQxNAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNiAweDAwMDAwQTgwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc3IDB4MDAwMDBDNDQKKworIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUcxICAweDMKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMiAgMHgwMDE1MTUwMQorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUczICAweDAwMDYwNjAyCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzQgIDB4MTAwODEwMDgKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNSAgMHgwMTEzMUYxRgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc2ICAweDAwMDAwNGM0CisKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUcxICAweDAwMDExMDAwCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMiAgMHgwMDFmMWYwMQorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzMgIDB4MDAwODA4MDMKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc0ICAweDFDMDkxQzA5CisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNSAgMHgwNDFmMUYxRgorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzYgIDB4MDAwMDA0QzQKKworIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHMSAgMHgzCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUcyICAweDAwMTUxNTAxCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUczICAweDAwMDYwNjAyCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUc0ICAweDEwMDgxMDA4CisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUc1ICAweDAxMTMxRjFGCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUc2ICAweDAwMDAwMDAwCisKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDEyMDAKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUcyIDB4MDAwYzBjMDEKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUczIDB4MDAwMzAzMDEKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUc0IDB4MGMwNDBjMDQKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUc1IDB4MDEwQzEwMTAKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUc2IDB4MDAwMDAwMDAKKworIyBkZWZpbmUgUENNQ0lBX0dQTUNfQ09ORklHMSAweDAxRTkxMjAwCisjIGRlZmluZSBQQ01DSUFfR1BNQ19DT05GSUcyIDB4MDAxRTFFMDEKKyMgZGVmaW5lIFBDTUNJQV9HUE1DX0NPTkZJRzMgMHgwMDAyMDIwMworIyBkZWZpbmUgUENNQ0lBX0dQTUNfQ09ORklHNCAweDFEMDQxRDA0CisjIGRlZmluZSBQQ01DSUFfR1BNQ19DT05GSUc1IDB4MDMxRDFGMUYKKyMgZGVmaW5lIFBDTUNJQV9HUE1DX0NPTkZJRzYgMHgwMDAwMDRDNAorI2VuZGlmIC8qIGVuZGlmIENGR19QUkNNX0lJSSAqLworCisjaWYgZGVmaW5lZCAoUFJDTV9DT05GSUdfSSkgfHwgZGVmaW5lZChQUkNNX0NPTkZJR18yKSAvKiBMMyBhdCAxNjVNSHogKi8KKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMTgwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMiAweDAwMTQxNDAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUczIDB4MDAxNDE0MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzQgMHgwRjAxMEYwMQorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNSAweDAxMEMxNDE0CisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc2IDB4MDAwMDBBODAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzcgMHgwMDAwMEM0NAorCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzEgIDB4MworIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUcyICAweDAwMTUxNTAxCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzMgIDB4MDAwNjA2MDIKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNCAgMHgxMTA5MTEwOQorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc1ICAweDAxMTQxRjFGCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzYgIDB4MDAwMDA0YzQKKworIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzEgIDB4MDAwMTEwMDAKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUcyICAweDAwMWYxZjAxCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMyAgMHgwMDA4MDgwMworIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzQgIDB4MWMwYjFjMGEKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc1ICAweDA0MWYxRjFGCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNiAgMHgwMDAwMDRDNAorCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUcxICAweDMKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzIgIDB4MDAxNTE1MDEKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzMgIDB4MDAwNjA2MDIKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzQgIDB4MTEwOTExMDkKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzUgIDB4MDExNDFGMUYKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzYgIDB4MDAwMDAwMDAKKworIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMTIwMAorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzIgMHgwMDBGMEYwMQorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzMgMHgwMDAzMDMwMQorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzQgMHgwRjA0MEYwNAorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzUgMHgwMTBGMTAxMAorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzYgMHgwMDAwMDAwMAorCisjIGRlZmluZSBQQ01DSUFfR1BNQ19DT05GSUcxIDB4MDFFOTEyMDAKKyMgZGVmaW5lIFBDTUNJQV9HUE1DX0NPTkZJRzIgMHgwMDFFMUUwMQorIyBkZWZpbmUgUENNQ0lBX0dQTUNfQ09ORklHMyAweDAwMDIwMjAzCisjIGRlZmluZSBQQ01DSUFfR1BNQ19DT05GSUc0IDB4MUQwNDFEMDQKKyMgZGVmaW5lIFBDTUNJQV9HUE1DX0NPTkZJRzUgMHgwMzFEMUYxRgorIyBkZWZpbmUgUENNQ0lBX0dQTUNfQ09ORklHNiAweDAwMDAwNEM0CisKKyNlbmRpZgorCisjaWYgMAorLyogQm9hcmQgU3BlY2lmaWMgU2V0dGluZ3MgZm9yIGVhY2ggb2YgdGhlIGNvbmZpZ3VyYXRpb25zIGZvciBjaGlwcworICogd2hvc2UgdmFsdWVzIGNoYW5nZSBhcyBwZXIgcGxhdGZvcm0uIC0gTm9uZSBjdXJyZW50bHkKKyAqLworI2lmIENPTkZJR19PTUFQMjRYWEg0CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLWg0Lmg+CisjZW5kaWYKKworI2lmIENPTkZJR18yNDMwU0RQCisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLXNkcDI0MzAuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogaWYgMCAqLworCisvKiBtYXggbnVtYmVyIG9mIEdQTUMgQ2hpcCBTZWxlY3RzICovCisjZGVmaW5lIEdQTUNfTUFYX0NTICAgIDgKKy8qIG1heCBudW1iZXIgb2YgR1BNQyByZWdzICovCisjZGVmaW5lIEdQTUNfTUFYX1JFRyAgIDcKKworI2RlZmluZSBQUk9DX05PUiAgICAgICAxCisjZGVmaW5lIFBST0NfTkFORCAgICAgIDIKKyNkZWZpbmUgUElTTU9fU0lCTEVZMCAgMworI2RlZmluZSBQSVNNT19TSUJMRVkxICA0CisjZGVmaW5lIFBJU01PX09ORU5BTkQgIDUKKyNkZWZpbmUgREJHX01QREIgICAgICAgNgorI2RlZmluZSBQSVNNT19QQ01DSUEgICA3CisKKy8qIG1ha2UgaXQgcmVhZGFibGUgZm9yIHRoZSBncG1jX2luaXQgKi8KKyNkZWZpbmUgUFJPQ19OT1JfQkFTRSAgIAlGTEFTSF9CQVNFCisjZGVmaW5lIFBST0NfTkFORF9CQVNFICAJTkFORF9CQVNFCisjZGVmaW5lIFBJU01PX1NJQjBfQkFTRSAJU0lCTEVZX01BUDEKKyNkZWZpbmUgUElTTU9fU0lCMV9CQVNFIAlTSUJMRVlfTUFQMgorI2RlZmluZSBQSVNNT19PTkVOX0JBU0UgCU9ORU5BTkRfTUFQCisjZGVmaW5lIERCR19NUERCX0JBU0UgICAJREVCVUdfQkFTRQorI2RlZmluZSBQSVNNT19QQ01DSUFfQkFTRSAgCVBDTUNJQV9CQVNFCisKKyNlbmRpZiAvKiBlbmRpZiBfT01BUDI0WFhfTUVNX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvb21hcDI0MjAuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9vbWFwMjQyMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZTY3OWYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvb21hcDI0MjAuaApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfT01BUDI0MjBfU1lTX0hfCisjZGVmaW5lIF9PTUFQMjQyMF9TWVNfSF8KKworI2luY2x1ZGUgPGFzbS9hcmNoL3NpemVzLmg+CisKKy8qCisgKiAyNDIwIHNwZWNpZmljIFNlY3Rpb24KKyAqLworCisvKiBDT05UUk9MICovCisjZGVmaW5lIE9NQVAyNDIwX0NUUkxfQkFTRSAgICAoMHg0ODAwMDAwMCkKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVMgICAgICAgIChPTUFQMjQyMF9DVFJMX0JBU0UgKyAweDJGOCkKKworLyogVEFQIGluZm9ybWF0aW9uICovCisjZGVmaW5lIE9NQVAyNDIwX1RBUF9CQVNFICAgICAoMHg0ODAxNDAwMCkKKyNkZWZpbmUgVEFQX0lEQ09ERV9SRUcgICAgICAgIChPTUFQMjQyMF9UQVBfQkFTRSsweDIwNCkKKworLyogR1BNQyAqLworI2RlZmluZSBPTUFQMjQyMF9HUE1DX0JBU0UgICAgKDB4NjgwMEEwMDApCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4MTApCisjZGVmaW5lIEdQTUNfU1lTU1RBVFVTCSAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHgxNCkKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEUgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHgxQykKKyNkZWZpbmUgR1BNQ19USU1FT1VUX0NPTlRST0wgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg0MCkKKyNkZWZpbmUgR1BNQ19DT05GSUcgICAgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg1MCkKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzAgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg2MCkKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzAgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg2NCkKKyNkZWZpbmUgR1BNQ19DT05GSUczXzAgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg2OCkKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzAgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg2QykKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzAgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg3MCkKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzAgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg3NCkKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzAJICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDc4KQorI2RlZmluZSBHUE1DX0NPTkZJRzFfMSAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDkwKQorI2RlZmluZSBHUE1DX0NPTkZJRzJfMSAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDk0KQorI2RlZmluZSBHUE1DX0NPTkZJRzNfMSAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDk4KQorI2RlZmluZSBHUE1DX0NPTkZJRzRfMSAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDlDKQorI2RlZmluZSBHUE1DX0NPTkZJRzVfMSAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweEEwKQorI2RlZmluZSBHUE1DX0NPTkZJRzZfMSAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweEE0KQorI2RlZmluZSBHUE1DX0NPTkZJRzdfMQkgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4QTgpCisKKy8qIFNNUyAqLworI2RlZmluZSBPTUFQMjQyMF9TTVNfQkFTRSAweDY4MDA4MDAwCisjZGVmaW5lIFNNU19TWVNDT05GSUcgICAgIChPTUFQMjQyMF9TTVNfQkFTRSsweDEwKQorCisvKiBTRFJDICovCisjZGVmaW5lIE9NQVAyNDIwX1NEUkNfQkFTRSAweDY4MDA5MDAwCisjZGVmaW5lIFNEUkNfU1lTQ09ORklHICAgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4MTApCisjZGVmaW5lIFNEUkNfU1RBVFVTICAgICAgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4MTQpCisjZGVmaW5lIFNEUkNfU0hBUklORyAgICAgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4NDQpCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMICAgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4NjApCisjZGVmaW5lIFNEUkNfRExMQV9TVEFUVVMgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4NjQpCisjZGVmaW5lIFNEUkNfRExMQl9DVFJMICAgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4NjgpCisjZGVmaW5lIFNEUkNfUE9XRVIgICAgICAgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4NzApCisjZGVmaW5lIFNEUkNfTUNGR18wICAgICAgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4ODApCisjZGVmaW5lIFNEUkNfTVJfMCAgICAgICAgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4ODQpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfMCAoT01BUDI0MjBfU0RSQ19CQVNFKzB4OUMpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfMCAoT01BUDI0MjBfU0RSQ19CQVNFKzB4QTApCisjZGVmaW5lIFNEUkNfTUNGR18xICAgICAgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4QjApCisjZGVmaW5lIFNEUkNfTVJfMQkgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4QjQpCisjZGVmaW5lIFNEUkNfRU1SMl8xCSAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHhCQykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV8xIChPTUFQMjQyMF9TRFJDX0JBU0UrMHhDNCkKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl8xIChPTUFQMjQyMF9TRFJDX0JBU0UrMHhDOCkKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTCAgICAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHhBNCkKKyNkZWZpbmUgU0RSQ19NQU5VQUxfMCAgICAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHhBOCkKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTDEJICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweEQ0KQorI2RlZmluZSBTRFJDX01BTlVBTF8xCSAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHhEOCkKKworI2RlZmluZSBPTUFQMjQyMF9TRFJDX0NTMCAgMHg4MDAwMDAwMAorI2RlZmluZSBPTUFQMjQyMF9TRFJDX0NTMSAgMHhBMDAwMDAwMAorCisjZGVmaW5lIExPQURETEwgICAgICAgICAgICBCSVQyCisjZGVmaW5lIENNRF9OT1AgICAgICAgICAgICAweDAKKyNkZWZpbmUgQ01EX1BSRUNIQVJHRSAgICAgIDB4MQorI2RlZmluZSBDTURfQVVUT1JFRlJFU0ggICAgMHgyCisjZGVmaW5lIENNRF9FTlRSX1BXUkRPV04gICAweDMKKyNkZWZpbmUgQ01EX0VYSVRfUFdSRE9XTiAgIDB4NAorI2RlZmluZSBDTURfRU5UUl9TUkZSU0ggICAgMHg1CisjZGVmaW5lIENNRF9DS0VfSElHSCAgICAgICAweDYKKyNkZWZpbmUgQ01EX0NLRV9MT1cgICAgICAgIDB4NworI2RlZmluZSBTT0ZUUkVTRVQgICAgICAgICAgQklUMQorI2RlZmluZSBTTUFSVF9JRExFICAgICAgICAgKDB4MiA8PCAzKQorI2RlZmluZSBSRUZfT05fSURMRSAgICAgICAgKDB4MSA8PCA2KQorCisKKy8qIFVBUlQgKi8KKyNkZWZpbmUgT01BUDI0MjBfVUFSVDEJICAgICAgMHg0ODA2QTAwMAorI2RlZmluZSBPTUFQMjQyMF9VQVJUMgkgICAgICAweDQ4MDZDMDAwCisjZGVmaW5lIE9NQVAyNDIwX1VBUlQzICAgICAgICAweDQ4MDZFMDAwCisKKy8qIEdlbmVyYWwgUHVycG9zZSBUaW1lcnMgKi8KKyNkZWZpbmUgT01BUDI0MjBfR1BUMSAgICAgICAgIDB4NDgwMjgwMDAKKyNkZWZpbmUgT01BUDI0MjBfR1BUMiAgICAgICAgIDB4NDgwMkEwMDAKKyNkZWZpbmUgT01BUDI0MjBfR1BUMyAgICAgICAgIDB4NDgwNzgwMDAKKyNkZWZpbmUgT01BUDI0MjBfR1BUNCAgICAgICAgIDB4NDgwN0EwMDAKKyNkZWZpbmUgT01BUDI0MjBfR1BUNSAgICAgICAgIDB4NDgwN0MwMDAKKyNkZWZpbmUgT01BUDI0MjBfR1BUNiAgICAgICAgIDB4NDgwN0UwMDAKKyNkZWZpbmUgT01BUDI0MjBfR1BUNyAgICAgICAgIDB4NDgwODAwMDAKKyNkZWZpbmUgT01BUDI0MjBfR1BUOCAgICAgICAgIDB4NDgwODIwMDAKKyNkZWZpbmUgT01BUDI0MjBfR1BUOSAgICAgICAgIDB4NDgwODQwMDAKKyNkZWZpbmUgT01BUDI0MjBfR1BUMTAgICAgICAgIDB4NDgwODYwMDAKKyNkZWZpbmUgT01BUDI0MjBfR1BUMTEgICAgICAgIDB4NDgwODgwMDAKKyNkZWZpbmUgT01BUDI0MjBfR1BUMTIgICAgICAgIDB4NDgwOEEwMDAKKworLyogdGltZXIgcmVncyBvZmZzZXRzICgzMiBiaXQgcmVncykgKi8KKyNkZWZpbmUgVElEUiAgICAgICAweDAgICAgICAvKiByICovCisjZGVmaW5lIFRJT0NQX0NGRyAgMHgxMCAgICAgLyogcncgKi8KKyNkZWZpbmUgVElTVEFUICAgICAweDE0ICAgICAvKiByICovCisjZGVmaW5lIFRJU1IgICAgICAgMHgxOCAgICAgLyogcncgKi8KKyNkZWZpbmUgVElFUiAgICAgICAweDFDICAgICAvKiBydyAqLworI2RlZmluZSBUV0VSICAgICAgIDB4MjAgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRDTFIgICAgICAgMHgyNCAgICAgLyogcncgKi8KKyNkZWZpbmUgVENSUiAgICAgICAweDI4ICAgICAvKiBydyAqLworI2RlZmluZSBUTERSICAgICAgIDB4MkMgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRUR1IgICAgICAgMHgzMCAgICAgLyogcncgKi8KKyNkZWZpbmUgVFdQUyAgICAgICAweDM0ICAgICAvKiByICovCisjZGVmaW5lIFRNQVIgICAgICAgMHgzOCAgICAgLyogcncgKi8KKyNkZWZpbmUgVENBUjEgICAgICAweDNjICAgICAvKiByICovCisjZGVmaW5lIFRTSUNSICAgICAgMHg0MCAgICAgLyogcncgKi8KKyNkZWZpbmUgVENBUjIgICAgICAweDQ0ICAgICAvKiByICovCisKKy8qIFdhdGNoRG9nIFRpbWVycyAoMSBzZWN1cmUsIDMgR1ApICovCisjZGVmaW5lIFdEMV9CQVNFICAgICAgICAgICAgICAweDQ4MDIwMDAwCisjZGVmaW5lIFdEMl9CQVNFICAgICAgICAgICAgICAweDQ4MDIyMDAwCisjZGVmaW5lIFdEM19CQVNFICAgICAgICAgICAgICAweDQ4MDI0MDAwCisjZGVmaW5lIFdENF9CQVNFICAgICAgICAgICAgICAweDQ4MDI2MDAwCisjZGVmaW5lIFdXUFMgICAgICAgMHgzNCAgICAgLyogciAqLworI2RlZmluZSBXU1BSICAgICAgIDB4NDggICAgIC8qIHJ3ICovCisjZGVmaW5lIFdEX1VOTE9DSzEgMHhBQUFBCisjZGVmaW5lIFdEX1VOTE9DSzIgMHg1NTU1CisKKy8qIFBSQ00gKi8KKyNkZWZpbmUgT01BUDI0MjBfQ01fQkFTRSAweDQ4MDA4MDAwCisjZGVmaW5lIFBSQ01fQ0xLQ0ZHX0NUUkwgKE9NQVAyNDIwX0NNX0JBU0UrMHgwODApCisjZGVmaW5lIENNX0NMS1NFTF9NUFUgICAgKE9NQVAyNDIwX0NNX0JBU0UrMHgxNDApCisjZGVmaW5lIENNX0ZDTEtFTjFfQ09SRSAgKE9NQVAyNDIwX0NNX0JBU0UrMHgyMDApCisjZGVmaW5lIENNX0ZDTEtFTjJfQ09SRSAgKE9NQVAyNDIwX0NNX0JBU0UrMHgyMDQpCisjZGVmaW5lIENNX0lDTEtFTjFfQ09SRSAgKE9NQVAyNDIwX0NNX0JBU0UrMHgyMTApCisjZGVmaW5lIENNX0lDTEtFTjJfQ09SRSAgKE9NQVAyNDIwX0NNX0JBU0UrMHgyMTQpCisjZGVmaW5lIENNX0NMS1NFTDFfQ09SRSAgKE9NQVAyNDIwX0NNX0JBU0UrMHgyNDApCisjZGVmaW5lIENNX0NMS1NFTF9XS1VQICAgKE9NQVAyNDIwX0NNX0JBU0UrMHg0NDApCisjZGVmaW5lIENNX0NMS1NFTDJfQ09SRSAgKE9NQVAyNDIwX0NNX0JBU0UrMHgyNDQpCisjZGVmaW5lIENNX0NMS1NFTF9HRlggICAgKE9NQVAyNDIwX0NNX0JBU0UrMHgzNDApCisjZGVmaW5lIFBNX1JTVENUUkxfV0tVUCAgKE9NQVAyNDIwX0NNX0JBU0UrMHg0NTApCisjZGVmaW5lIENNX0NMS0VOX1BMTCAgICAgKE9NQVAyNDIwX0NNX0JBU0UrMHg1MDApCisjZGVmaW5lIENNX0lETEVTVF9DS0dFTiAgKE9NQVAyNDIwX0NNX0JBU0UrMHg1MjApCisjZGVmaW5lIENNX0NMS1NFTDFfUExMICAgKE9NQVAyNDIwX0NNX0JBU0UrMHg1NDApCisjZGVmaW5lIENNX0NMS1NFTDJfUExMICAgKE9NQVAyNDIwX0NNX0JBU0UrMHg1NDQpCisjZGVmaW5lIENNX0NMS1NFTF9EU1AgICAgKE9NQVAyNDIwX0NNX0JBU0UrMHg4NDApCisKKy8qCisgKiBINCBzcGVjaWZpYyBTZWN0aW9uCisgKi8KKworLyoKKyAqICBUaGUgMjQyMCdzIGNoaXAgc2VsZWN0cyBhcmUgcHJvZ3JhbW1hYmxlLiAgVGhlIG1hc2sgUk9NCisgKiAgZG9lcyBjb25maWd1cmUgQ1MwIHRvIDB4MDgwMDAwMDAgYmVmb3JlIGRpc3BhdGNoLiAgU28sIGlmCisgKiAgeW91IHdhbnQgeW91ciBjb2RlIHRvIGxpdmUgYmVsb3cgdGhhdCBhZGRyZXNzLCB5b3UgaGF2ZSB0bworICogIGJlIHByZXBhcmVkIHRvIGp1bXAgdGhvdWdoIGhvb3BzLCB0byByZXNldCB0aGUgYmFzZSBhZGRyZXNzLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfT01BUDI0MjBINCkKKy8qIEdQTUMgKi8KKyNpZmRlZiBDT05GSUdfVklSVElPX0EgICAgICAgIC8qIFByZSB2ZXJzaW9uIEIgKi8KKyMgZGVmaW5lIEg0X0NTMF9CQVNFICAgICAgICAgICAweDA4MDAwMDAwICAvKiBmbGFzaCAoNjQgTWVnIGFsaWduZWQpICovCisjIGRlZmluZSBINF9DUzFfQkFTRSAgICAgICAgICAgMHgwNDAwMDAwMCAgLyogZGVidWcgYm9hcmQgKi8KKyMgZGVmaW5lIEg0X0NTMl9CQVNFICAgICAgICAgICAweDBBMDAwMDAwICAvKiB3aWZpIGJvYXJkICovCisjZWxzZQorIyBkZWZpbmUgSDRfQ1MwX0JBU0UgICAgICAgICAgIDB4MDQwMDAwMDAgIC8qIGZsYXNoICg2NCBNZWcgYWxpZ25lZCkgKi8KKyMgZGVmaW5lIEg0X0NTMV9CQVNFICAgICAgICAgICAweDA4MDAwMDAwICAvKiBkZWJ1ZyBib2FyZCAqLworIyBkZWZpbmUgSDRfQ1MyX0JBU0UgICAgICAgICAgIDB4MEEwMDAwMDAgIC8qIHdpZmkgYm9hcmQgKi8KKyNlbmRpZgorCisvKiBiYXNlIGFkZHJlc3MgZm9yIGluZGlyZWN0IHZlY3RvcnMgKGludGVybmFsIGJvb3QgbW9kZSkgKi8KKyNkZWZpbmUgU1JBTV9PRkZTRVQwICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgU1JBTV9PRkZTRVQxICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgU1JBTV9PRkZTRVQyICAgICAgICAgIDB4MDAwMEY4MDAKKyNkZWZpbmUgU1JBTV9WRUNUX0NPREUgICAgICAgKFNSQU1fT0ZGU0VUMHxTUkFNX09GRlNFVDF8U1JBTV9PRkZTRVQyKQorCisjZGVmaW5lIExPV19MRVZFTF9TUkFNX1NUQUNLICAweDQwMjBGRkZDCisKKyNkZWZpbmUgUEVSSUZFUkFMX1BPUlRfQkFTRSAgIDB4NDgwRkUwMDMKKworLyogRlBHQSBvbiBEZWJ1ZyBib2FyZC4qLworI2RlZmluZSBFVEhfQ09OVFJPTF9SRUcgICAgICAgKEg0X0NTMV9CQVNFKzB4MzBiKQorI2RlZmluZSBMQU5fUkVTRVRfUkVHSVNURVIgICAgKEg0X0NTMV9CQVNFKzB4MWMpCisjZW5kaWYgIC8qIGVuZGlmIENPTkZJR18yNDIwSDQgKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9vbWFwMjQzMC5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L29tYXAyNDMwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyODhhYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9vbWFwMjQzMC5oCkBAIC0wLDAgKzEsMjQ2IEBACisvKiAKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA1CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfT01BUDI0MzBfU1lTX0hfCisjZGVmaW5lIF9PTUFQMjQzMF9TWVNfSF8KKworI2luY2x1ZGUgPGFzbS9hcmNoL3NpemVzLmg+CisKKy8qIGRldmljZSB0eXBlICovCisjZGVmaW5lIERFVklDRV9NQVNLICAgICAgICAgIChCSVQ4fEJJVDl8QklUMTApCisjZGVmaW5lIFRTVF9ERVZJQ0UgICAgICAgICAgIDB4MAorI2RlZmluZSBFTVVfREVWSUNFICAgICAgICAgICAweDEKKyNkZWZpbmUgSFNfREVWSUNFICAgICAgICAgICAgMHgyCisjZGVmaW5lIEdQX0RFVklDRSAgICAgICAgICAgIDB4MworCisvKgorICogMjQzMCBzcGVjaWZpYyBTZWN0aW9uCisgKi8KKyNkZWZpbmUgT01BUDI0M1hfQ09SRV9MNF9JT19CQVNFICAgICAgICAweDQ4MDAwMDAwCisjZGVmaW5lIE9NQVAyNDNYX1dBS0VVUF9MNF9JT19CQVNFICAgICAgMHg0OTAwMDAwMAorI2RlZmluZSBPTUFQMjRYWF9MNF9JT19CQVNFICAgICBPTUFQMjQzWF9DT1JFX0w0X0lPX0JBU0UKKworCisvKiBDT05UUk9MICovCisjZGVmaW5lIE9NQVAyNFhYX0NUUkxfQkFTRSAgICAoT01BUDI0M1hfV0FLRVVQX0w0X0lPX0JBU0UrMHgyMDAwKQorI2RlZmluZSBDT05UUk9MX1NUQVRVUyAgICAgICAgKE9NQVAyNFhYX0NUUkxfQkFTRSArIDB4MkY4KQorCisvKiBUQVAgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgT01BUDI0WFhfVEFQX0JBU0UgICAgIChPTUFQMjQzWF9XQUtFVVBfTDRfSU9fQkFTRSsweEEwMDApCisjZGVmaW5lIFRBUF9JRENPREVfUkVHICAgICAgICAoT01BUDI0WFhfVEFQX0JBU0UrMHgyMDQpCisKKy8qIAorCUdQTUMgOiBJbiAyNDMwIE5PUiBhbmQgTkFORCBjYW4gY29leGlzdC4KKwlEdXJpbmcgTkFORCBib290aW5nICwgTkFORCBpcyBhdCBDUzAgYW5kIE5PUiBhdCBDUzEKKwlhbmQgRGVidWcgRlBHQSBpcyBHUE1DX0NTNSAKKyovCisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQkFTRSAgICAoMHg2RTAwMDAwMCkKKworI2RlZmluZSBHUE1DX1NZU0NPTkZJRyAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDEwKQorI2RlZmluZSBHUE1DX1NZU1NUQVRVUwkgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4MTQpCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4MUMpCisjZGVmaW5lIEdQTUNfVElNRU9VVF9DT05UUk9MICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4NDApCisjZGVmaW5lIEdQTUNfQ09ORklHICAgICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4NTApCisjZGVmaW5lIEdQTUNfQ09ORklHMV8wICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4NjApCisjZGVmaW5lIEdQTUNfQ09ORklHMl8wICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4NjQpCisjZGVmaW5lIEdQTUNfQ09ORklHM18wICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4NjgpCisjZGVmaW5lIEdQTUNfQ09ORklHNF8wICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4NkMpCisjZGVmaW5lIEdQTUNfQ09ORklHNV8wICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4NzApCisjZGVmaW5lIEdQTUNfQ09ORklHNl8wICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4NzQpCisjZGVmaW5lIEdQTUNfQ09ORklHN18wCSAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg3OCkKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzEgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg5MCkKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzEgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg5NCkKKyNkZWZpbmUgR1BNQ19DT05GSUczXzEgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg5OCkKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzEgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg5QykKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzEgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHhBMCkKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzEgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHhBNCkKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzEJICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweEE4KQorI2RlZmluZSBHUE1DX0NPTkZJRzFfNSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDE1MCkKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzUgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHgxNTQpCisjZGVmaW5lIEdQTUNfQ09ORklHM181ICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4MTU4KQorI2RlZmluZSBHUE1DX0NPTkZJRzRfNSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDE1QykKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzUgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHgxNjApCisjZGVmaW5lIEdQTUNfQ09ORklHNl81ICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4MTY0KQorI2RlZmluZSBHUE1DX0NPTkZJRzdfNSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDE2OCkKKworCisvKiBTTVMgKi8KKyNkZWZpbmUgT01BUDI0WFhfU01TX0JBU0UgMHg2QzAwMDAwMAorI2RlZmluZSBTTVNfU1lTQ09ORklHICAgICAoT01BUDI0WFhfU01TX0JBU0UrMHgxMCkKKworLyogU0RSQyAqLworI2RlZmluZSBPTUFQMjRYWF9TRFJDX0JBU0UgMHg2RDAwMDAwMAorI2RlZmluZSBPTUFQMjRYWF9TRFJDX0NTMCAgMHg4MDAwMDAwMAorI2RlZmluZSBPTUFQMjRYWF9TRFJDX0NTMSAgMHhBMDAwMDAwMAorI2RlZmluZSBTRFJDX1NZU0NPTkZJRyAgICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweDEwKQorI2RlZmluZSBTRFJDX1NUQVRVUyAgICAgICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweDE0KQorI2RlZmluZSBTRFJDX1NIQVJJTkcgICAgICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweDQ0KQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTCAgICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweDYwKQorI2RlZmluZSBTRFJDX0RMTEFfU1RBVFVTICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweDY0KQorI2RlZmluZSBTRFJDX0RMTEJfQ1RSTCAgICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweDY4KQorI2RlZmluZSBTRFJDX1BPV0VSICAgICAgICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweDcwKQorI2RlZmluZSBTRFJDX01DRkdfMCAgICAgICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweDgwKQorI2RlZmluZSBTRFJDX01SXzAgICAgICAgICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweDg0KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBXzAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweDlDKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCXzAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweEEwKQorI2RlZmluZSBTRFJDX01DRkdfMSAgICAgICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweEIwKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBXzEgKE9NQVAyNFhYX1NEUkNfQkFTRSsweEM0KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCXzEgKE9NQVAyNFhYX1NEUkNfQkFTRSsweEM4KQorI2RlZmluZSBTRFJDX1JGUl9DVFJMICAgICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweEE0KQorI2RlZmluZSBTRFJDX01BTlVBTF8wICAgICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweEE4KQorI2RlZmluZSBTRFJDX1JGUl9DVFJMMQkgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4RDQpCisKKyNkZWZpbmUgTE9BRERMTCAgICAgICAgICAgIEJJVDIKKyNkZWZpbmUgQ01EX05PUCAgICAgICAgICAgIDB4MAorI2RlZmluZSBDTURfUFJFQ0hBUkdFICAgICAgMHgxCisjZGVmaW5lIENNRF9BVVRPUkVGUkVTSCAgICAweDIKKyNkZWZpbmUgQ01EX0VOVFJfUFdSRE9XTiAgIDB4MworI2RlZmluZSBDTURfRVhJVF9QV1JET1dOICAgMHg0CisjZGVmaW5lIENNRF9FTlRSX1NSRlJTSCAgICAweDUKKyNkZWZpbmUgQ01EX0NLRV9ISUdIICAgICAgIDB4NgorI2RlZmluZSBDTURfQ0tFX0xPVyAgICAgICAgMHg3CisjZGVmaW5lIFNPRlRSRVNFVCAgICAgICAgICBCSVQxCisjZGVmaW5lIFNNQVJUX0lETEUgICAgICAgICAoMHgyIDw8IDMpCisjZGVmaW5lIFJFRl9PTl9JRExFICAgICAgICAoMHgxIDw8IDYpCisKKworLyogVUFSVCAqLworI2RlZmluZSBPTUFQMjQzMF9VQVJUMQkgICAgICAweDQ4MDZBMDAwCisjZGVmaW5lIE9NQVAyNDMwX1VBUlQyCSAgICAgIDB4NDgwNkMwMDAKKyNkZWZpbmUgT01BUDI0MzBfVUFSVDMgICAgICAgIDB4NDgwNkUwMDAKKworLyogR2VuZXJhbCBQdXJwb3NlIFRpbWVycyAqLworI2RlZmluZSBPTUFQMjRYWF9HUFQxICAgICAgICAgKE9NQVAyNDNYX1dBS0VVUF9MNF9JT19CQVNFKzB4MTgwMDApCisjZGVmaW5lIE9NQVAyNFhYX0dQVDIgICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDJBMDAwKQorI2RlZmluZSBPTUFQMjRYWF9HUFQzICAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHg3ODAwMCkKKyNkZWZpbmUgT01BUDI0WFhfR1BUNCAgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4N0EwMDApCisjZGVmaW5lIE9NQVAyNFhYX0dQVDUgICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDdDMDAwKQorI2RlZmluZSBPTUFQMjRYWF9HUFQ2ICAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHg3RTAwMCkKKyNkZWZpbmUgT01BUDI0WFhfR1BUNyAgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4ODAwMDApCisjZGVmaW5lIE9NQVAyNFhYX0dQVDggICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDgyMDAwKQorI2RlZmluZSBPTUFQMjRYWF9HUFQ5ICAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHg4NDAwMCkKKyNkZWZpbmUgT01BUDI0WFhfR1BUMTAgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4ODYwMDApCisjZGVmaW5lIE9NQVAyNFhYX0dQVDExICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDg4MDAwKQorI2RlZmluZSBPTUFQMjRYWF9HUFQxMiAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHg4QTAwMAorCisvKiB0aW1lciByZWdzIG9mZnNldHMgKDMyIGJpdCByZWdzKSAqLworI2RlZmluZSBUSURSICAgICAgIDB4MCAgICAgIC8qIHIgKi8KKyNkZWZpbmUgVElPQ1BfQ0ZHICAweDEwICAgICAvKiBydyAqLworI2RlZmluZSBUSVNUQVQgICAgIDB4MTQgICAgIC8qIHIgKi8KKyNkZWZpbmUgVElTUiAgICAgICAweDE4ICAgICAvKiBydyAqLworI2RlZmluZSBUSUVSICAgICAgIDB4MUMgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRXRVIgICAgICAgMHgyMCAgICAgLyogcncgKi8KKyNkZWZpbmUgVENMUiAgICAgICAweDI0ICAgICAvKiBydyAqLworI2RlZmluZSBUQ1JSICAgICAgIDB4MjggICAgIC8qIHJ3ICovCisjZGVmaW5lIFRMRFIgICAgICAgMHgyQyAgICAgLyogcncgKi8KKyNkZWZpbmUgVFRHUiAgICAgICAweDMwICAgICAvKiBydyAqLworI2RlZmluZSBUV1BTICAgICAgIDB4MzQgICAgIC8qIHIgKi8KKyNkZWZpbmUgVE1BUiAgICAgICAweDM4ICAgICAvKiBydyAqLworI2RlZmluZSBUQ0FSMSAgICAgIDB4M2MgICAgIC8qIHIgKi8KKyNkZWZpbmUgVFNJQ1IgICAgICAweDQwICAgICAvKiBydyAqLworI2RlZmluZSBUQ0FSMiAgICAgIDB4NDQgICAgIC8qIHIgKi8KKworLyogV2F0Y2hEb2cgVGltZXJzICgxIHNlY3VyZSwgMyBHUCkgKi8KKyNkZWZpbmUgV0QxX0JBU0UgICAgICAgICAgICAgIChPTUFQMjQzWF9XQUtFVVBfTDRfSU9fQkFTRSsweDE0MDAwKQorI2RlZmluZSBXRDJfQkFTRSAgICAgICAgICAgICAgKE9NQVAyNDNYX1dBS0VVUF9MNF9JT19CQVNFKzB4MTYwMDApCisjZGVmaW5lIFdEM19CQVNFICAgICAgICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDI0MDAwKSAvKiBub3QgcHJlc2VudCAqLworI2RlZmluZSBXRDRfQkFTRSAgICAgICAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHgyNjAwMCkKKworLyogMzJLVElNRVIgKi8KKyNkZWZpbmUgU1lOQ18zMktUSU1FUl9CQVNFICAgIChPTUFQMjQzWF9XQUtFVVBfTDRfSU9fQkFTRSsweDIwMDAwKQorI2RlZmluZSBTMzJLX0NSICAgICAgICAgICAgICAgKFNZTkNfMzJLVElNRVJfQkFTRSsweDEwKQorCisjZGVmaW5lIFdXUFMgICAgICAgMHgzNCAgICAgLyogciAqLworI2RlZmluZSBXU1BSICAgICAgIDB4NDggICAgIC8qIHJ3ICovCisjZGVmaW5lIFdEX1VOTE9DSzEgMHhBQUFBCisjZGVmaW5lIFdEX1VOTE9DSzIgMHg1NTU1CisKKy8qIFBSQ00gKi8KKyNkZWZpbmUgT01BUDI0WFhfQ01fQkFTRSAoT01BUDI0M1hfV0FLRVVQX0w0X0lPX0JBU0UrMHgwNjAwMCkKKworI2RlZmluZSBQUkNNX0NMS1NSQ19DVFJMIChPTUFQMjRYWF9DTV9CQVNFKzB4MDYwKQorI2RlZmluZSBQUkNNX0NMS09VVF9DVFJMIChPTUFQMjRYWF9DTV9CQVNFKzB4MDcwKQorI2RlZmluZSBQUkNNX0NMS0VNVUxfQ1RSTCAoT01BUDI0WFhfQ01fQkFTRSsweDA3OCkKKyNkZWZpbmUgUFJDTV9DTEtDRkdfQ1RSTCAoT01BUDI0WFhfQ01fQkFTRSsweDA4MCkKKyNkZWZpbmUgUFJDTV9DTEtDRkdfU1RBVFVTIChPTUFQMjRYWF9DTV9CQVNFKzB4MDg0KQorI2RlZmluZSBDTV9DTEtTRUxfTVBVICAgIChPTUFQMjRYWF9DTV9CQVNFKzB4MTQwKQorI2RlZmluZSBDTV9GQ0xLRU4xX0NPUkUgIChPTUFQMjRYWF9DTV9CQVNFKzB4MjAwKQorI2RlZmluZSBDTV9GQ0xLRU4yX0NPUkUgIChPTUFQMjRYWF9DTV9CQVNFKzB4MjA0KQorI2RlZmluZSBDTV9JQ0xLRU4xX0NPUkUgIChPTUFQMjRYWF9DTV9CQVNFKzB4MjEwKQorI2RlZmluZSBDTV9JQ0xLRU4yX0NPUkUgIChPTUFQMjRYWF9DTV9CQVNFKzB4MjE0KQorI2RlZmluZSBDTV9DTEtTRUwxX0NPUkUgIChPTUFQMjRYWF9DTV9CQVNFKzB4MjQwKQorI2RlZmluZSBDTV9DTEtTRUxfV0tVUCAgIChPTUFQMjRYWF9DTV9CQVNFKzB4NDQwKQorI2RlZmluZSBDTV9DTEtTRUwyX0NPUkUgIChPTUFQMjRYWF9DTV9CQVNFKzB4MjQ0KQorI2RlZmluZSBDTV9GQ0xLRU5fR0ZYICAgIChPTUFQMjRYWF9DTV9CQVNFKzB4MzAwKQorI2RlZmluZSBDTV9JQ0xLRU5fR0ZYICAgIChPTUFQMjRYWF9DTV9CQVNFKzB4MzEwKQorI2RlZmluZSBDTV9DTEtTRUxfR0ZYICAgIChPTUFQMjRYWF9DTV9CQVNFKzB4MzQwKQorI2RlZmluZSBSTV9SU1RDVFJMX0dGWCAgICAoT01BUDI0WFhfQ01fQkFTRSsweDM1MCkKKyNkZWZpbmUgQ01fRkNMS0VOX1dLVVAgICAgKE9NQVAyNFhYX0NNX0JBU0UrMHg0MDApCisjZGVmaW5lIENNX0lDTEtFTl9XS1VQICAgIChPTUFQMjRYWF9DTV9CQVNFKzB4NDEwKQorI2RlZmluZSBQTV9SU1RDVFJMX1dLVVAgIChPTUFQMjRYWF9DTV9CQVNFKzB4NDUwKQorI2RlZmluZSBDTV9DTEtFTl9QTEwgICAgIChPTUFQMjRYWF9DTV9CQVNFKzB4NTAwKQorI2RlZmluZSBDTV9JRExFU1RfQ0tHRU4gIChPTUFQMjRYWF9DTV9CQVNFKzB4NTIwKQorI2RlZmluZSBDTV9DTEtTRUwxX1BMTCAgIChPTUFQMjRYWF9DTV9CQVNFKzB4NTQwKQorI2RlZmluZSBDTV9DTEtTRUwyX1BMTCAgIChPTUFQMjRYWF9DTV9CQVNFKzB4NTQ0KQorI2RlZmluZSBDTV9DTEtTRUxfRFNQICAgIChPTUFQMjRYWF9DTV9CQVNFKzB4ODQwKQorI2RlZmluZSBDTV9DTEtTRUxfTURNICAgIChPTUFQMjRYWF9DTV9CQVNFKzB4QzQwKQorCisvKiBTTVgtQVBFICovCisjZGVmaW5lIFNNWF9BUEVfQkFTRSAweDY4MDAwMDAwCisjZGVmaW5lIFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNICAoU01YX0FQRV9CQVNFICsgMHgxMDAwMCkKKyNkZWZpbmUgUE1fR1BNQ19CQVNFX0FERFJfQVJNICAgIChTTVhfQVBFX0JBU0UgKyAweDEyNDAwKQorI2RlZmluZSBQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0gKFNNWF9BUEVfQkFTRSArIDB4MTI4MDApCisjZGVmaW5lIFBNX09DTV9ST01fQkFTRV9BRERSX0FSTSAoU01YX0FQRV9CQVNFICsgMHgxMkMwMCkKKworLyogSVZBMiAqLworI2RlZmluZSBQTV9JVkEyX0JBU0VfQUREUl9BUk0gICAgKFNNWF9BUEVfQkFTRSArIDB4MTQwMDApCisKKy8qCisgKiAgVGhlIDI0MzAncyBjaGlwIHNlbGVjdHMgYXJlIHByb2dyYW1tYWJsZS4gIFRoZSBtYXNrIFJPTQorICogIGRvZXMgY29uZmlndXJlIENTMCB0byAweDA4MDAwMDAwIGJlZm9yZSBkaXNwYXRjaC4gIFNvLCBpZgorICogIHlvdSB3YW50IHlvdXIgY29kZSB0byBsaXZlIGJlbG93IHRoYXQgYWRkcmVzcywgeW91IGhhdmUgdG8KKyAqICBiZSBwcmVwYXJlZCB0byBqdW1wIHRob3VnaCBob29wcywgdG8gcmVzZXQgdGhlIGJhc2UgYWRkcmVzcy4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX09NQVAyNDNYKQorCisvKiBHUE1DICovCisvKiBUaGlzIGlzIGJlaW5nIHVzZWQgYnkgdGhlIG1hY3JvcyBpbiBtZW0uaC4gUEhZU19GTEFTSF8xIGlzIGRlZmluZWQgdG8gSDRfQ1MwX0JBU0UgKi8KKyMgZGVmaW5lIEg0X0NTMV9CQVNFICAgICAgICAgICAweDA5MDAwMDAwICAvKiBmbGFzaCAoNjQgTWVnIGFsaWduZWQpICovCisjZGVmaW5lIENGR19GTEFTSF9CQVNFIEg0X0NTMV9CQVNFCisjZGVmaW5lIERFQlVHX0JBU0UJMHgwODAwMDAwMAorCisvKiBiYXNlIGFkZHJlc3MgZm9yIGluZGlyZWN0IHZlY3RvcnMgKGludGVybmFsIGJvb3QgbW9kZSkgKi8KKyNkZWZpbmUgU1JBTV9PRkZTRVQwICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgU1JBTV9PRkZTRVQxICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgU1JBTV9PRkZTRVQyICAgICAgICAgIDB4MDAwMEY4MDAKKyNkZWZpbmUgU1JBTV9WRUNUX0NPREUgICAgICAgKFNSQU1fT0ZGU0VUMHxTUkFNX09GRlNFVDF8U1JBTV9PRkZTRVQyKQorCisjZGVmaW5lIExPV19MRVZFTF9TUkFNX1NUQUNLICAweDQwMjBGRkZDCisKKyNkZWZpbmUgUEVSSUZFUkFMX1BPUlRfQkFTRSAgIDB4NDgwRkUwMDMKKworI2VuZGlmICAvKiBlbmRpZiBDT05GSUdfMjQzMFNEUCAqLworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L3NpemVzLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvc2l6ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGRkZDhlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L3NpemVzLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CSBVU0EKKyAqLworLyogIFNpemUgZGVmaW50aW9ucworICogIENvcHlyaWdodCAoQykgQVJNIExpbWl0ZWQgMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworCisjaWZuZGVmIF9fc2l6ZXNfaAorI2RlZmluZSBfX3NpemVzX2gJCQkxCisKKy8qIGhhbmR5IHNpemVzICovCisjZGVmaW5lIFNaXzFLCQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1pfNEsJCQkJMHgwMDAwMTAwMAorI2RlZmluZSBTWl84SwkJCQkweDAwMDAyMDAwCisjZGVmaW5lIFNaXzE2SwkJCQkweDAwMDA0MDAwCisjZGVmaW5lIFNaXzMySwkJCQkweDAwMDA4MDAwCisjZGVmaW5lIFNaXzY0SwkJCQkweDAwMDEwMDAwCisjZGVmaW5lIFNaXzEyOEsJCQkJMHgwMDAyMDAwMAorI2RlZmluZSBTWl8yNTZLCQkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgU1pfNTEySwkJCQkweDAwMDgwMDAwCisKKyNkZWZpbmUgU1pfMU0JCQkJMHgwMDEwMDAwMAorI2RlZmluZSBTWl8yTQkJCQkweDAwMjAwMDAwCisjZGVmaW5lIFNaXzRNCQkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgU1pfOE0JCQkJMHgwMDgwMDAwMAorI2RlZmluZSBTWl8xNk0JCQkJMHgwMTAwMDAwMAorI2RlZmluZSBTWl8zMU0JCQkJMHgwMUYwMDAwMAorI2RlZmluZSBTWl8zMk0JCQkJMHgwMjAwMDAwMAorI2RlZmluZSBTWl82NE0JCQkJMHgwNDAwMDAwMAorI2RlZmluZSBTWl8xMjhNCQkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgU1pfMjU2TQkJCQkweDEwMDAwMDAwCisjZGVmaW5lIFNaXzUxMk0JCQkJMHgyMDAwMDAwMAorCisjZGVmaW5lIFNaXzFHCQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgU1pfMkcJCQkJMHg4MDAwMDAwMAorCisjZW5kaWYJLyogX19zaXplc19oICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9zeXNfaW5mby5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L3N5c19pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhMDljZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9zeXNfaW5mby5oCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUgKEMpIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX09NQVAyNFhYX1NZU19JTkZPX0hfCisjZGVmaW5lIF9PTUFQMjRYWF9TWVNfSU5GT19IXworCisjaWYgMAordHlwZWRlZiBzdHJ1Y3QgIGg0X3N5c3RlbV9kYXRhIHsKKwkvKiBiYXNlIGJvYXJkIGluZm8gKi8KKwl1MzIgYmFzZV9iX3JldjsJCS8qIHJldiBmcm9tIGJhc2UgYm9hcmQgaTJjICovCisJLyogY3B1IGJvYXJkIGluZm8gKi8KKwl1MzIgY3B1X2JfcmV2OwkJLyogcmV2IGZyb20gY3B1IGJvYXJkIGkyYyAqLworCXUzMiBjcHVfYl9tdXg7CQkvKiBtdXggdHlwZSBvbiBkYXVnaHRlciBib2FyZCAqLworCXUzMiBjcHVfYl9kZHJfdHlwZTsJLyogbWVtIHR5cGUgKi8KKwl1MzIgY3B1X2JfZGRyX3NwZWVkOwkvKiBkZHIgc3BlZWQgcmF0aW5nICovCisJdTMyIGNwdV9iX3N3aXRjaGVzOwkvKiBib290IGN0cmwgc3dpdGNoIHNldHRpbmdzICovCisJLyogY3B1IGluZm8gKi8KKwl1MzIgY3B1X3R5cGU7CQkvKiB0eXBlIG9mIGNwdTsgMjQyMCwgMjQyMiwgMjQzMCwuLi4qLworCXUzMiBjcHVfcmV2OwkJLyogcmV2IG9mIGdpdmVuIGNwdTsgRVMxLCBFUzIsLi4uKi8KK30gaDRfc3lzX2RhdGE7CisKKyNlbmRpZgorCisjZGVmaW5lIFhEUl9QT1AgICAgICAgICAgIDUgICAgICAvKiBwYWNrYWdlIG9uIHBhY2thZ2UgcGFydCAqLworI2RlZmluZSBTRFJfRElTQ1JFVEUgICAgICA0ICAgICAgLyogMTI4TSBtZW1vcnkgU0RSIG1vZHVsZSovCisjZGVmaW5lIEREUl9TVEFDS0VEICAgICAgIDMgICAgICAvKiBzdGFja2VkIHBhcnQgb24gMjQyMiAqLworI2RlZmluZSBERFJfQ09NQk8gICAgICAgICAyICAgICAgLyogY29tYm8gcGFydCBvbiBjcHUgZGF1Z2h0ZXIgY2FyZCAobWVuYWxhZXVzKSAqLworI2RlZmluZSBERFJfRElTQ1JFVEUgICAgICAxICAgICAgLyogMngxNiBwYXJ0cyBvbiBkYXVnaHRlciBjYXJkICovCisKKyNkZWZpbmUgRERSXzEwMCAgICAgICAgICAgMTAwICAgIC8qIHR5cGUgZm91bmQgb24gbW9zdCBtZW0gZC1ib2FyZHMgKi8KKyNkZWZpbmUgRERSXzExMSAgICAgICAgICAgMTExICAgIC8qIHNvbWUgY29tYm8gcGFydHMgKi8KKyNkZWZpbmUgRERSXzEzMyAgICAgICAgICAgMTMzICAgIC8qIG1vc3QgY29tYm8sIHNvbWUgbWVtIGQtYm9hcmRzICovCisjZGVmaW5lIEREUl8xNjUgICAgICAgICAgIDE2NSAgICAvKiBmdXR1cmUgcGFydHMgKi8KKworI2RlZmluZSBDUFVfMjQyMCAgICAgICAgICAweDI0MjAKKyNkZWZpbmUgQ1BVXzI0MjIgICAgICAgICAgMHgyNDIyIC8qIDI0MjAgKyA2NE0gc3RhY2tlZCAqLworI2RlZmluZSBDUFVfMjQyMyAgICAgICAgICAweDI0MjMgLyogMjQyMCArIDk2TSBzdGFja2VkICovCisjZGVmaW5lIENQVV8yNDMwICAgICAgICAgIDB4MjQzMAorCisvKiAyNDJ4IHJlYWwgaGFyZHdhcmU6CisgKiAgRVMxICAgICA9IHJldiAwCisgKiAgRVMyICAgICA9IHJldiAxCisgKiAgRVMyLjA1ICA9IHJldiAyCisgKiAgRVMyLjEgICA9IHJldiAzCisgKiAgRVMyLjEuMSA9IHJldiA0CisgKi8KKworLyogMjQyeCBjb2RlIGRlZmluZXM6CisgKiBFUzEgICAgID0gMCsxID0gMQorICogRVMyICAgICA9IDErMSA9IDIKKyAqIEVTMi4wNSAgPSAyKzEgPSAzCisgKiBFUzIuMSAgID0gMysxID0gNAorICogRXMyLjEuMSA9IDQrMSA9IDUKKyAqLworI2RlZmluZSBDUFVfMjQyMl9FUzEgICAgICAxCisjZGVmaW5lIENQVV8yNDIyX0VTMiAgICAgIDIKKyNkZWZpbmUgQ1BVXzI0MjJfRVMyXzA1ICAgMworI2RlZmluZSBDUFVfMjQyMl9FUzJfMSAgICA0CisjZGVmaW5lIENQVV8yNDIyX0VTMl8xXzEgIDUKKworI2RlZmluZSBDUFVfMjQyMF9FUzEgICAgICAxCisjZGVmaW5lIENQVV8yNDIwX0VTMiAgICAgIDIKKyNkZWZpbmUgQ1BVXzI0MjBfRVMyXzA1ICAgMworI2RlZmluZSBDUFVfMjQyMF9FUzJfMSAgICA0CisjZGVmaW5lIENQVV8yNDIwX0VTMl8xXzEgIDUKKworI2RlZmluZSBDUFVfMjQyWF9FUzEgICAgICAxCisjZGVmaW5lIENQVV8yNDJYX0VTMiAgICAgIDIKKyNkZWZpbmUgQ1BVXzI0MlhfRVMyXzA1ICAgMworI2RlZmluZSBDUFVfMjQyWF9FUzJfMSAgICA0CisjZGVmaW5lIENQVV8yNDJYX0VTMl8xXzEgIDUKKworI2RlZmluZSBDUFVfMjQyMF8yNDIyX0VTMSAxCisjZGVmaW5lIENQVV8yNDIwXzI0MjJfRVMyXzEgNAorCisvKiAyNDN4IHJlYWwgaGFyZHdhcmU6CisgKiAgRVMxICAgICA9IHJldiAwCisgKiAgRVMyICAgICA9IHJldiAxCisgKgorICogMjQzeCBjb2RlIGRlZmluZXM6CisgKiBFUzEgICAgID0gMCsxID0gMQorICogRVMyICAgICA9IDErMSA9IDIKKyAqLworI2RlZmluZSBDUFVfMjQzMF9FUzEgICAgIDEKKyNkZWZpbmUgQ1BVXzI0MzBfRVMyICAgICAyCisKKyNpZmRlZiBWUE9NMjQzMAorIyBkZWZpbmUgQ1BVXzI0MzBfVklSVElPICAgMworI2Vsc2UKKyMgZGVmaW5lIENQVV8yNDMwX1ZJUlRJTyAgIDEKKyNlbmRpZgorI2RlZmluZSBDUFVfMjQzMF9aRUJVICAgICAweEQKKworI2RlZmluZSBDUFVfMjQyMF9DSElQSUQgICAweDBCNUQ5MDAwCisjZGVmaW5lIENQVV8yNDMwX0NISVBJRCAgIDB4MEI2OEEwMDAKKyNkZWZpbmUgQ1BVXzI0WFhfSURfTUFTSyAgMHgwRkZGRjAwMAorI2RlZmluZSBDUFVfMjQyWF9SRVZfTUFTSyAweEYwMDAwMDAwCisjZGVmaW5lIENQVV8yNDJYX1BJRF9NQVNLIDB4MDAwRjAwMDAKKworI2RlZmluZSBCT0FSRF9INF9NRU5FTEFVUyAgICAgMQorI2RlZmluZSBCT0FSRF9INF9TRFAgICAgICAgICAgMgorI2RlZmluZSBCT0FSRF9INF9NRU5FTEFVU19IUlAgMworI2RlZmluZSBCT0FSRF9TRFBfMjQzMCAgICAgICAgNAorCisjZGVmaW5lIEdQTUNfTVVYRUQgICAgICAgIDEKKyNkZWZpbmUgR1BNQ19OT05NVVhFRCAgICAgMAorCisjZGVmaW5lIFRZUEVfTkFORCAgICAgICAgIDB4ODAwICAgLyogYml0IHBvcyBmb3IgbmFuZCBpbiBncG1jIHJlZyAqLworI2RlZmluZSBUWVBFX05PUiAgICAgICAgICAweDAwMAorI2RlZmluZSBUWVBFX09ORU5BTkQgICAgICAweDgwMAorCisjZGVmaW5lIFdJRFRIXzhCSVQgICAgICAgIDB4MDAwMAorI2RlZmluZSBXSURUSF8xNkJJVCAgICAgICAweDEwMDAgIC8qIGJpdCBwb3MgZm9yIDE2IGJpdCBpbiBncG1jICovCisKKyNkZWZpbmUgSTJDX01FTkVMQVVTIDB4NzIJLyogaTJjIGlkIGZvciBjb21wYW5pb24gY2hpcCAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtOTI2ZWpzL3NpemVzLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTkyNmVqcy9zaXplcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMGI5OWIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTkyNmVqcy9zaXplcy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQTAgMjExMS0xMzA3CisgKiBVU0EKKyAqLworLyogRE8gTk9UIEVESVQhISAtIHRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorICoJCSAgIGZyb20gLnMgZmlsZSBieSBhd2sgLWYgczJoLmF3aworICovCisvKiAgU2l6ZSBkZWZpbnRpb25zCisgKiAgQ29weXJpZ2h0IChDKSBBUk0gTGltaXRlZCAxOTk4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpZm5kZWYgX19zaXplc19oCisjZGVmaW5lIF9fc2l6ZXNfaAkJCTEKKworLyogaGFuZHkgc2l6ZXMgKi8KKyNkZWZpbmUgU1pfMUsJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1pfNEsJCTB4MDAwMDEwMDAKKyNkZWZpbmUgU1pfOEsJCTB4MDAwMDIwMDAKKyNkZWZpbmUgU1pfMTZLCQkweDAwMDA0MDAwCisjZGVmaW5lIFNaXzY0SwkJMHgwMDAxMDAwMAorI2RlZmluZSBTWl8xMjhLCTB4MDAwMjAwMDAKKyNkZWZpbmUgU1pfMjU2SwkweDAwMDQwMDAwCisjZGVmaW5lIFNaXzUxMksJMHgwMDA4MDAwMAorCisjZGVmaW5lIFNaXzFNCQkweDAwMTAwMDAwCisjZGVmaW5lIFNaXzJNCQkweDAwMjAwMDAwCisjZGVmaW5lIFNaXzRNCQkweDAwNDAwMDAwCisjZGVmaW5lIFNaXzhNCQkweDAwODAwMDAwCisjZGVmaW5lIFNaXzE2TQkJMHgwMTAwMDAwMAorI2RlZmluZSBTWl8zMk0JCTB4MDIwMDAwMDAKKyNkZWZpbmUgU1pfNjRNCQkweDA0MDAwMDAwCisjZGVmaW5lIFNaXzEyOE0JMHgwODAwMDAwMAorI2RlZmluZSBTWl8yNTZNCTB4MTAwMDAwMDAKKyNkZWZpbmUgU1pfNTEyTQkweDIwMDAwMDAwCisKKyNkZWZpbmUgU1pfMUcJCTB4NDAwMDAwMDAKKyNkZWZpbmUgU1pfMkcJCTB4ODAwMDAwMDAKKworI2VuZGlmCS8qIF9fc2l6ZXNfaCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9iaXRzLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2JpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDQ2OGJlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9iaXRzLmgKQEAgLTAsMCArMSw1NyBAQAorLyogYml0cy5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIE5lc3QgTGFicywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGZvdW5kIGluIHRoZSBmaWxlCisgKiBuYW1lZCBDT1BZSU5HIHRoYXQgc2hvdWxkIGhhdmUgYWNjb21wYW5pZWQgdGhpcyBmaWxlLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpZm5kZWYgX19iaXRzX2gKKyNkZWZpbmUgX19iaXRzX2ggMQorCisjZGVmaW5lIEFSTV9SRUdfTUFTSyhiaXRzKQkJCQkJCSgoMSA8PCAoYml0cykpIC0gMSkKKyNkZWZpbmUgQVJNX1JFR19WQUwoYml0LCBtYXNrKQkJCQkJKChtYXNrKSA8PCAoYml0KSkKKyNkZWZpbmUgQVJNX1JFR19WQUxfRU5DT0RFKHNoaWZ0LCBtYXNrLCB2YWx1ZSkJKCgodmFsdWUpIDw8IChzaGlmdCkpICYgKG1hc2spKQorI2RlZmluZSBBUk1fUkVHX1ZBTF9ERUNPREUoc2hpZnQsIG1hc2ssIHZhbHVlKQkoKCh2YWx1ZSkgJiAobWFzaykpID4+IChzaGlmdCkpCisKKworI2RlZmluZSBCSVQwICBBUk1fUkVHX1ZBTCggMCwgMSkKKyNkZWZpbmUgQklUMSAgQVJNX1JFR19WQUwoIDEsIDEpCisjZGVmaW5lIEJJVDIgIEFSTV9SRUdfVkFMKCAyLCAxKQorI2RlZmluZSBCSVQzICBBUk1fUkVHX1ZBTCggMywgMSkKKyNkZWZpbmUgQklUNCAgQVJNX1JFR19WQUwoIDQsIDEpCisjZGVmaW5lIEJJVDUgIEFSTV9SRUdfVkFMKCA1LCAxKQorI2RlZmluZSBCSVQ2ICBBUk1fUkVHX1ZBTCggNiwgMSkKKyNkZWZpbmUgQklUNyAgQVJNX1JFR19WQUwoIDcsIDEpCisjZGVmaW5lIEJJVDggIEFSTV9SRUdfVkFMKCA4LCAxKQorI2RlZmluZSBCSVQ5ICBBUk1fUkVHX1ZBTCggOSwgMSkKKyNkZWZpbmUgQklUMTAgQVJNX1JFR19WQUwoMTAsIDEpCisjZGVmaW5lIEJJVDExIEFSTV9SRUdfVkFMKDExLCAxKQorI2RlZmluZSBCSVQxMiBBUk1fUkVHX1ZBTCgxMiwgMSkKKyNkZWZpbmUgQklUMTMgQVJNX1JFR19WQUwoMTMsIDEpCisjZGVmaW5lIEJJVDE0IEFSTV9SRUdfVkFMKDE0LCAxKQorI2RlZmluZSBCSVQxNSBBUk1fUkVHX1ZBTCgxNSwgMSkKKyNkZWZpbmUgQklUMTYgQVJNX1JFR19WQUwoMTYsIDEpCisjZGVmaW5lIEJJVDE3IEFSTV9SRUdfVkFMKDE3LCAxKQorI2RlZmluZSBCSVQxOCBBUk1fUkVHX1ZBTCgxOCwgMSkKKyNkZWZpbmUgQklUMTkgQVJNX1JFR19WQUwoMTksIDEpCisjZGVmaW5lIEJJVDIwIEFSTV9SRUdfVkFMKDIwLCAxKQorI2RlZmluZSBCSVQyMSBBUk1fUkVHX1ZBTCgyMSwgMSkKKyNkZWZpbmUgQklUMjIgQVJNX1JFR19WQUwoMjIsIDEpCisjZGVmaW5lIEJJVDIzIEFSTV9SRUdfVkFMKDIzLCAxKQorI2RlZmluZSBCSVQyNCBBUk1fUkVHX1ZBTCgyNCwgMSkKKyNkZWZpbmUgQklUMjUgQVJNX1JFR19WQUwoMjUsIDEpCisjZGVmaW5lIEJJVDI2IEFSTV9SRUdfVkFMKDI2LCAxKQorI2RlZmluZSBCSVQyNyBBUk1fUkVHX1ZBTCgyNywgMSkKKyNkZWZpbmUgQklUMjggQVJNX1JFR19WQUwoMjgsIDEpCisjZGVmaW5lIEJJVDI5IEFSTV9SRUdfVkFMKDI5LCAxKQorI2RlZmluZSBCSVQzMCBBUk1fUkVHX1ZBTCgzMCwgMSkKKyNkZWZpbmUgQklUMzEgQVJNX1JFR19WQUwoMzEsIDEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jbG9ja3MuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY2xvY2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkMjFkMwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY2xvY2tzLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAvUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAgKi8KKyNpZm5kZWYgX09NQVAzNFhYX0NMT0NLU19IXworI2RlZmluZSBfT01BUDM0WFhfQ0xPQ0tTX0hfCisKKyNkZWZpbmUgTERFTEFZICAgICAgMTIwMDAwMDAKKworI2RlZmluZSBTMTJNCQkxMjAwMDAwMAorI2RlZmluZSBTMTNNCQkxMzAwMDAwMAorI2RlZmluZSBTMTZfOE0JCTE2ODAwMDAwCisjZGVmaW5lIFMxOV8yTQkJMTkyMDAwMDAKKyNkZWZpbmUgUzI0TQkJMjQwMDAwMDAKKyNkZWZpbmUgUzI2TQkJMjYwMDAwMDAKKyNkZWZpbmUgUzM4XzRNCQkzODQwMDAwMAorCisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzMzQzeC5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY2xvY2tzMzQzeC5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jbG9ja3MzNDN4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzZWRkMQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY2xvY2tzMzQzeC5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIC9QVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICAqLworI2lmbmRlZiBfT01BUDM0M1hfQ0xPQ0tTX0hfCisjZGVmaW5lIF9PTUFQMzQzWF9DTE9DS1NfSF8KKworI2RlZmluZSBQTExfU1RPUCAgICAgICAgMSAgICAgICAgIC8qIFBFUiAmIElWQSAqLworI2RlZmluZSBQTExfTE9XX1BPV0VSX0JZUEFTUyAgIDUgIC8qIE1QVSwgSVZBICYgQ09SRSAqLworI2RlZmluZSBQTExfRkFTVF9SRUxPQ0tfQllQQVNTIDYgIC8qIENPUkUgKi8KKyNkZWZpbmUgUExMX0xPQ0sgICAgICAgIDcgICAgICAgICAvKiBNUFUsIElWQSwgQ09SRSAmIFBFUiAqLworCisvKiBUaGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb25zIGFyZSBPUFAgYW5kIFN5c0NsayB2YWx1ZSBpbmRlcGVuZGFudAorICogYW5kIGhlbmNlIGFyZSBkZWZpbmVkIGhlcmUuIEFsbCB0aGUgb3RoZXIgRFBMTCByZWxhdGVkIHZhbHVlcyBhcmUKKyAqIHRhYnVsYXRlZCBpbiBsb3dsZXZlbF9pbml0LlMuCisgKi8KKworLyogQ09SRSBEUExMICovCisjICBkZWZpbmUgQ09SRV9NM1gyICAgICAgMiAgICAgICAgLyogMzMyTUh6IDogQ01fQ0xLU0VMMV9FTVUgKi8KKyMgIGRlZmluZSBDT1JFX1NTSV9ESVYgICAzICAgICAgICAvKiAyMjFNSHogOiBDTV9DTEtTRUxfQ09SRSAqLworIyAgZGVmaW5lIENPUkVfRlVTQl9ESVYgIDIgICAgICAgIC8qIDQxLjVNSHo6ICovCisjICBkZWZpbmUgQ09SRV9MNF9ESVYgICAgMiAgICAgICAgLyogIDgzTUh6IDogTDQgKi8KKyMgIGRlZmluZSBDT1JFX0wzX0RJViAgICAyICAgICAgICAvKiAxNjZNSHogOiBMMyB7RERSfSAqLworIyAgZGVmaW5lIEdGWF9ESVZfMzRYICAgIDMgICAgICAgIC8qICA5Nk1IeiA6IENNX0NMS1NFTF9HRlggKi8KKyMgIGRlZmluZSBHRlhfRElWXzM2WCAgICA1ICAgICAgICAvKiAgMjAwTUh6IDogQ01fQ0xLU0VMX0dGWCAqLworLyogS2VlcCBkZWZhdWx0IHRvIDk2TWh6ICovCisjICBkZWZpbmUgR0ZYX0RJViAgICAgICAgMyAgICAgICAgLyogIDk2TUh6IDogQ01fQ0xLU0VMX0dGWCAqLworIyAgZGVmaW5lIFdLVVBfUlNNICAgICAgIDIgICAgICAgIC8qIDQxLjVNSHo6IENNX0NMS1NFTF9XS1VQICovCisKKy8qIFBFUiBEUExMICovCisjIGRlZmluZSBQRVJfTTZYMiAgICAgICAzICAgICAgICAgLyogMjg4TUh6OiBDTV9DTEtTRUwxX0VNVSAqLworIyBkZWZpbmUgUEVSX001WDIgICAgICAgNCAgICAgICAgIC8qIDIxNk1IejogQ01fQ0xLU0VMX0NBTSAqLworIyBkZWZpbmUgUEVSX000WDIgICAgICAgOSAgICAgICAgIC8qIDk2TUh6IDogQ01fQ0xLU0VMX0RTUy1kc3MxICovCisjIGRlZmluZSBQRVJfTTNYMiAgICAgICAxNiAgICAgICAgLyogNTRNSHogOiBDTV9DTEtTRUxfRFNTLXR2ICovCisKKyMgIGRlZmluZSBDTFNFTDFfRU1VX1ZBTCAoKENPUkVfTTNYMiA8PCAxNikgfCAoUEVSX002WDIgPDwgMjQpIHwgKDB4MGE1MCkpCisKKyNpZmRlZiBQUkNNX0NMS19DRkcyXzMzMk1IWgorIyBkZWZpbmUgTV8xMgkJMHhBNgorIyBkZWZpbmUgTl8xMgkJMHgwNQorIyBkZWZpbmUgRlNFTF8xMgkweDA3CisjIGRlZmluZSBNMl8xMgkJMHgwMSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMTJfRVMxCTB4MEUKKyMgZGVmaW5lIEZTTF8xMl9FUzEgMHgwMworIyBkZWZpbmUgTTJfMTJfRVMxICAweDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzEzICAgICAgIDB4MTRDCisjIGRlZmluZSBOXzEzICAgICAgIDB4MEMKKyMgZGVmaW5lIEZTRUxfMTMJMHgwMworIyBkZWZpbmUgTTJfMTMJCTB4MDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzEzX0VTMQkweDFCMgorIyBkZWZpbmUgTl8xM19FUzEJMHgxMAorIyBkZWZpbmUgRlNMXzEzX0VTMSAweDAzCisjIGRlZmluZSBNMl8xM19FUzEJMHgwMSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMTlwMiAgICAgMHgxOUYKKyMgZGVmaW5lIE5fMTlwMiAgICAgMHgxNworIyBkZWZpbmUgRlNFTF8xOXAyICAweDAzCisjIGRlZmluZSBNMl8xOXAyICAgIDB4MDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzE5cDJfRVMxCTB4MTlGCisjIGRlZmluZSBOXzE5cDJfRVMxCTB4MTcKKyMgZGVmaW5lIEZTTF8xOXAyX0VTMSAweDAzCisjIGRlZmluZSBNMl8xOXAyX0VTMSAweDAxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8yNiAgICAgICAweEE2CisjIGRlZmluZSBOXzI2ICAgICAgIDB4MEMKKyMgZGVmaW5lIEZTRUxfMjYgICAgMHgwNworIyBkZWZpbmUgTTJfMjYgICAgICAweDAxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8yNl9FUzEJMHgxQjIKKyMgZGVmaW5lIE5fMjZfRVMxCTB4MjEKKyMgZGVmaW5lIEZTTF8yNl9FUzEJMHgwMworIyBkZWZpbmUgTTJfMjZfRVMxCTB4MDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzM4cDQgICAgIDB4MTlGCisjIGRlZmluZSBOXzM4cDQgICAgIDB4MkYKKyMgZGVmaW5lIEZTRUxfMzhwNCAgMHgwMworIyBkZWZpbmUgTTJfMzhwNCAgICAweDAxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8zOHA0X0VTMQkweDE5RgorIyBkZWZpbmUgTl8zOHA0X0VTMQkweDJGCisjIGRlZmluZSBGU0xfMzhwNF9FUzEgMHgwMworIyBkZWZpbmUgTTJfMzhwNF9FUzEgMHgwMSAvKiBNMyBvZiAyICovCisKKyNlbGlmIGRlZmluZWQoUFJDTV9DTEtfQ0ZHMl8yNjZNSFopCisjIGRlZmluZSBNXzEyCQkweDg1CisjIGRlZmluZSBOXzEyICAgICAgIDB4MDUKKyMgZGVmaW5lIEZTRUxfMTIgICAgMHgwNworIyBkZWZpbmUgTTJfMTIgICAgICAweDAyIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8xMl9FUzEJMHg4NSAgLyogMHgxMEEgKi8KKyMgZGVmaW5lIE5fMTJfRVMxCTB4MDUgIC8qIDB4MDUgKi8KKyMgZGVmaW5lIEZTTF8xMl9FUzEgMHgwNyAgLyogMHg3ICovCisjIGRlZmluZSBNMl8xMl9FUzEgIDB4MiAgIC8qIDB4MiB3aXRoIGFuIE0zIG9mIDQqLworCisjIGRlZmluZSBNXzEzICAgICAgIDB4MTBBCisjIGRlZmluZSBOXzEzICAgICAgIDB4MEMKKyMgZGVmaW5lIEZTRUxfMTMgICAgMHgzCisjIGRlZmluZSBNMl8xMyAgICAgIDB4MSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMTNfRVMxCTB4MTBBIC8qIDB4MjE0ICovCisjIGRlZmluZSBOXzEzX0VTMQkweDBDICAvKiAweEMgKi8KKyMgZGVmaW5lIEZTTF8xM19FUzEgMHgzICAgLyogMHgzICovCisjIGRlZmluZSBNMl8xM19FUzEJMHgxICAgLyogMHgyIHdpdGggYW4gTTMgb2YgNCovCisKKyMgZGVmaW5lIE1fMTlwMiAgICAgMHgxMTUKKyMgZGVmaW5lIE5fMTlwMiAgICAgMHgxMworIyBkZWZpbmUgRlNFTF8xOXAyICAweDAzCisjIGRlZmluZSBNMl8xOXAyICAgIDB4MDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzE5cDJfRVMxCTB4MTE1ICAvKiAweDI5OSAqLworIyBkZWZpbmUgTl8xOXAyX0VTMQkweDEzICAgLyogMHgxNyAqLworIyBkZWZpbmUgRlNMXzE5cDJfRVMxIDB4MDMgLyogMHgwMyAqLworIyBkZWZpbmUgTTJfMTlwMl9FUzEgMHgwMSAgLyogMHgyIHdpdGggTTMgb2YgNCAqLworCisjIGRlZmluZSBNXzI2CQkweDg1CisjIGRlZmluZSBOXzI2CQkweDBDCisjIGRlZmluZSBGU0VMXzI2CTB4MDcKKyMgZGVmaW5lIE0yXzI2CQkweDAxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8yNl9FUzEJMHg4NSAgLyogMHgxMEEgKi8KKyMgZGVmaW5lIE5fMjZfRVMxCTB4MEMgIC8qIDB4QyAqLworIyBkZWZpbmUgRlNMXzI2X0VTMSAweDA3ICAvKiAweDcgKi8KKyMgZGVmaW5lIE0yXzI2X0VTMQkweDAxICAvKiAweDIgd2l0aCBhbiBNMyBvZiA0ICovCisKKyMgZGVmaW5lIE1fMzhwNCAgICAgMHgxMUMKKyMgZGVmaW5lIE5fMzhwNCAgICAgMHgyOAorIyBkZWZpbmUgRlNFTF8zOHA0ICAweDAzCisjIGRlZmluZSBNMl8zOHA0ICAgIDB4MDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzM4cDRfRVMxCTB4MTFDICAvKiAweDI5OSAqLworIyBkZWZpbmUgTl8zOHA0X0VTMQkweDI4ICAgLyogMHgyZiAqLworIyBkZWZpbmUgRlNMXzM4cDRfRVMxIDB4MDMgLyogMHgzICovCisjIGRlZmluZSBNMl8zOHA0X0VTMSAweDAxICAvKiAweDIgd2l0aCBhbiBNMyBvZiA0Ki8KKworCSMgZW5kaWYKKworI2VuZGlmICAvKiBlbmRpZiBfT01BUDM0M1hfQ0xPQ0tTX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2NwdS5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE3ODMxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jcHUuaApAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9PTUFQMzRYWF9DUFVfSAorI2RlZmluZSAgX09NQVAzNFhYX0NQVV9ICisjaWYgZGVmaW5lZCAoQ09ORklHX0FNMzUxN0VWTSkgfHwgZGVmaW5lZCAoQ09ORklHX0FNMzUxN1RFQikKKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMy5oPgorI2VsaWYgZGVmaW5lZCAoQ09ORklHX09NQVAzNDMwKQorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAzNDMwLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwbWMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9wcmNtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc2RyYy5oPgorCisvKiBSZWdpc3RlciBvZmZzZXRzIG9mIGNvbW1vbiBtb2R1bGVzICovCisvKiBDb250cm9sICovCisjZGVmaW5lIENPTlRST0xfU1RBVFVTCQkoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHgyRjApCisjZGVmaW5lIE9NQVAzNFhYX01DUgkJKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4OEMpCisjZGVmaW5lIENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMJKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NDRDKQorI2RlZmluZSBDT05UUk9MX1NDQUxBQkxFX09NQVBfT0NQCShPTUFQMzRYWF9DVFJMX0JBU0UgKyAweDUzNCkKKworCisvKiBUYXAgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgVEFQX0lEQ09ERV9SRUcJCShPTUFQMzRYWF9UQVBfQkFTRSsweDIwNCkKKyNkZWZpbmUgUFJPRFVDVElPTl9JRAkJKE9NQVAzNFhYX1RBUF9CQVNFKzB4MjA4KQorCisvKiBPTUFQIDM0WFgvMzVYWC8zNnh4LzM3eHggQ29udHJvbCBJRCAqLworI2RlZmluZSBPTUFQMzRYWF9DT05UUk9MX0lECQkoT01BUDM0WFhfV0FLRVVQX0w0X0lPX0JBU0UgKyAweGEyMDQpCisKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9NQVNLCQkJQVJNX1JFR19WQUwoOCwgMHg3KQorI2RlZmluZSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0VOQ09ERSh2KQkJKCgodikgPDwgOCkgJiBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX01BU0spCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfREVDT0RFKHYpCQkoKCh2KSAmIENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfTUFTSykgPj4gOCkKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9UU1QJCQkJMHgwCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfRU1VCQkJCTB4MQorI2RlZmluZSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0hTCQkJCTB4MgorI2RlZmluZSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0dQCQkJCTB4MworCisvKgorICogTGVnYWN5IG1uZW1vbmljcworICovCisjZGVmaW5lIERFVklDRV9NQVNLCQkJCQkJCQkJQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9NQVNLCisjZGVmaW5lIFRTVF9ERVZJQ0UJCQkJCQkJCQlDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX1RTVAorI2RlZmluZSBFTVVfREVWSUNFCQkJCQkJCQkJQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9FTVUKKyNkZWZpbmUgSFNfREVWSUNFCQkJCQkJCQkJQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9IUworI2RlZmluZSBHUF9ERVZJQ0UJCQkJCQkJCQlDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0dQCisKKyNkZWZpbmUJQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9NQVNLCQkJCUFSTV9SRUdfVkFMKDAsIDB4M0YpCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfRU5DT0RFKHYpCQkoKCh2KSA8PCAwKSAmIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfTUFTSykKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9ERUNPREUodikJCSgoKHYpICYgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9NQVNLKSA+PiAwKQorCisjZGVmaW5lCUNPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9NQVNLCQlBUk1fUkVHX1ZBTCg1LCAweDEpCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9FTkNPREUodikJKCgodikgPDwgMCkgJiBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfTUFTSykKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX0RFQ09ERSh2KQkoKCh2KSAmIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9NQVNLKSA+PiAwKQorI2RlZmluZSBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfTUVNT1JZCQkJMHgwCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9QRVJJUEhFUkFMCQkweDEKKworI2RlZmluZQlDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX01BU0sJCUFSTV9SRUdfVkFMKDAsIDB4MUYpCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfT1JERVJfRU5DT0RFKHYpCSgoKHYpIDw8IDApICYgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9PUkRFUl9NQVNLKQorI2RlZmluZSBDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX0RFQ09ERSh2KQkoKCh2KSAmIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfT1JERVJfTUFTSykgPj4gMCkKKworLyoKKyAqIExlZ2FjeSBtbmVvbW5pYworICoKKyAqIFdlIGFyZSBub3QgY29uY2VybmVkIHdpdGggQklUNSBhcyBpdCBvbmx5IGRldGVybWluZXMgdGhlIHByaXJvdGl5CisgKiBiZXR3ZWVuIG1lbW9yeSBvciBwZXJwaGVyYWwgYm9vdGluZworICovCisjZGVmaW5lIFNZU0JPT1RfTUFTSwkJCQkJCQlDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX01BU0sKKworLyogR1BNQyBDUzMvY3M0L2NzNiBub3QgYXZhbGlhYmxlICovCisKKyNkZWZpbmUgR1BNQ19CQVNFCQkJCQkJKE9NQVAzNFhYX0dQTUNfQkFTRSkKKworI2RlZmluZSBHUE1DX1JFVklTSU9OCQkJCQkoR1BNQ19CQVNFICsgMHgwMDAwKQorI2RlZmluZSBHUE1DX1NZU0NPTkZJRyAJCQkJCShHUE1DX0JBU0UgKyAweDAwMTApCisjZGVmaW5lIEdQTUNfU1lTU1RBVFVTIAkJCQkJKEdQTUNfQkFTRSArIDB4MDAxNCkKKyNkZWZpbmUgR1BNQ19JUlFTVEFUVVMgCQkJCQkoR1BNQ19CQVNFICsgMHgwMDE4KQorI2RlZmluZSBHUE1DX0lSUUVOQUJMRSAJCQkJCShHUE1DX0JBU0UgKyAweDAwMUMpCisjZGVmaW5lIEdQTUNfVElNRU9VVF9DT05UUk9MIAkJCShHUE1DX0JBU0UgKyAweDAwNDApCisjZGVmaW5lIEdQTUNfRVJSX0FERFJFU1MJCQkJKEdQTUNfQkFTRSArIDB4MDA0NCkKKyNkZWZpbmUgR1BNQ19FUlJfVFlQRSAJCQkJCShHUE1DX0JBU0UgKyAweDAwNDgpCisjZGVmaW5lIEdQTUNfQ09ORklHIAkJCQkJKEdQTUNfQkFTRSArIDB4MDA1MCkKKyNkZWZpbmUgR1BNQ19TVEFUVVMgCQkJCQkoR1BNQ19CQVNFICsgMHgwMDU0KQorCisjZGVmaW5lIEdQTUNfQ09ORklHX0JBU0UJCQkJKEdQTUNfQkFTRSArIDB4MDA2MCkKKyNkZWZpbmUgR1BNQ19DT05GSUdfU0laRQkJCQkweDAwMzAKKyNkZWZpbmUgR1BNQ19DT05GSUdYX0JBU0UocmVnKQkJCShHUE1DX0NPTkZJR19CQVNFICsgKCgocmVnKSAtIDEpICogNCkpCisjZGVmaW5lIEdQTUNfQ09ORklHWChyZWcsIGNzKQkJCShHUE1DX0NPTkZJR1hfQkFTRShyZWcpICsgKChjcykgKiBHUE1DX0NPTkZJR19TSVpFKSkKKworI2RlZmluZSBHUE1DX0NPTkZJRzEoY3MpCQkJCUdQTUNfQ09ORklHWCgxLCBjcykKKyNkZWZpbmUgR1BNQ19DT05GSUcyKGNzKQkJCQlHUE1DX0NPTkZJR1goMiwgY3MpCisjZGVmaW5lIEdQTUNfQ09ORklHMyhjcykJCQkJR1BNQ19DT05GSUdYKDMsIGNzKQorI2RlZmluZSBHUE1DX0NPTkZJRzQoY3MpCQkJCUdQTUNfQ09ORklHWCg0LCBjcykKKyNkZWZpbmUgR1BNQ19DT05GSUc1KGNzKQkJCQlHUE1DX0NPTkZJR1goNSwgY3MpCisjZGVmaW5lIEdQTUNfQ09ORklHNihjcykJCQkJR1BNQ19DT05GSUdYKDYsIGNzKQorI2RlZmluZSBHUE1DX0NPTkZJRzcoY3MpCQkJCUdQTUNfQ09ORklHWCg3LCBjcykKKworI2RlZmluZSBHUE1DX0NPTkZJRzFfMAkJCQkJR1BNQ19DT05GSUcxKDApCisjZGVmaW5lIEdQTUNfQ09ORklHMl8wCQkJCQlHUE1DX0NPTkZJRzIoMCkKKyNkZWZpbmUgR1BNQ19DT05GSUczXzAJCQkJCUdQTUNfQ09ORklHMygwKQorI2RlZmluZSBHUE1DX0NPTkZJRzRfMAkJCQkJR1BNQ19DT05GSUc0KDApCisjZGVmaW5lIEdQTUNfQ09ORklHNV8wCQkJCQlHUE1DX0NPTkZJRzUoMCkKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzAJCQkJCUdQTUNfQ09ORklHNigwKQorI2RlZmluZSBHUE1DX0NPTkZJRzdfMAkJCQkJR1BNQ19DT05GSUc3KDApCisKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzEJCQkJCUdQTUNfQ09ORklHMSgxKQorI2RlZmluZSBHUE1DX0NPTkZJRzJfMQkJCQkJR1BNQ19DT05GSUcyKDEpCisjZGVmaW5lIEdQTUNfQ09ORklHM18xCQkJCQlHUE1DX0NPTkZJRzMoMSkKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzEJCQkJCUdQTUNfQ09ORklHNCgxKQorI2RlZmluZSBHUE1DX0NPTkZJRzVfMQkJCQkJR1BNQ19DT05GSUc1KDEpCisjZGVmaW5lIEdQTUNfQ09ORklHNl8xCQkJCQlHUE1DX0NPTkZJRzYoMSkKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzEJCQkJCUdQTUNfQ09ORklHNygxKQorCisjZGVmaW5lIEdQTUNfQ09ORklHMV8yCQkJCQlHUE1DX0NPTkZJRzEoMikKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzIJCQkJCUdQTUNfQ09ORklHMigyKQorI2RlZmluZSBHUE1DX0NPTkZJRzNfMgkJCQkJR1BNQ19DT05GSUczKDIpCisjZGVmaW5lIEdQTUNfQ09ORklHNV8yCQkJCQlHUE1DX0NPTkZJRzUoMikKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzIJCQkJCUdQTUNfQ09ORklHNCgyKQorI2RlZmluZSBHUE1DX0NPTkZJRzZfMgkJCQkJR1BNQ19DT05GSUc2KDIpCisjZGVmaW5lIEdQTUNfQ09ORklHN18yCQkJCQlHUE1DX0NPTkZJRzcoMikKKworI2RlZmluZSBHUE1DX0NPTkZJRzFfMwkJCQkJR1BNQ19DT05GSUcxKDMpCisjZGVmaW5lIEdQTUNfQ09ORklHMl8zCQkJCQlHUE1DX0NPTkZJRzIoMykKKyNkZWZpbmUgR1BNQ19DT05GSUczXzMJCQkJCUdQTUNfQ09ORklHMygzKQorI2RlZmluZSBHUE1DX0NPTkZJRzRfMwkJCQkJR1BNQ19DT05GSUc0KDMpCisjZGVmaW5lIEdQTUNfQ09ORklHNV8zCQkJCQlHUE1DX0NPTkZJRzUoMykKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzMJCQkJCUdQTUNfQ09ORklHNigzKQorI2RlZmluZSBHUE1DX0NPTkZJRzdfMwkJCQkJR1BNQ19DT05GSUc3KDMpCisKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzQJCQkJCUdQTUNfQ09ORklHMSg0KQorI2RlZmluZSBHUE1DX0NPTkZJRzJfNAkJCQkJR1BNQ19DT05GSUcyKDQpCisjZGVmaW5lIEdQTUNfQ09ORklHM180CQkJCQlHUE1DX0NPTkZJRzMoNCkKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzQJCQkJCUdQTUNfQ09ORklHNCg0KQorI2RlZmluZSBHUE1DX0NPTkZJRzVfNAkJCQkJR1BNQ19DT05GSUc1KDQpCisjZGVmaW5lIEdQTUNfQ09ORklHNl80CQkJCQlHUE1DX0NPTkZJRzYoNCkKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzQJCQkJCUdQTUNfQ09ORklHNyg0KQorCisjZGVmaW5lIEdQTUNfQ09ORklHMV81CQkJCQlHUE1DX0NPTkZJRzEoNSkKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzUJCQkJCUdQTUNfQ09ORklHMig1KQorI2RlZmluZSBHUE1DX0NPTkZJRzNfNQkJCQkJR1BNQ19DT05GSUczKDUpCisjZGVmaW5lIEdQTUNfQ09ORklHNF81CQkJCQlHUE1DX0NPTkZJRzQoNSkKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzUJCQkJCUdQTUNfQ09ORklHNSg1KQorI2RlZmluZSBHUE1DX0NPTkZJRzZfNQkJCQkJR1BNQ19DT05GSUc2KDUpCisjZGVmaW5lIEdQTUNfQ09ORklHN181CQkJCQlHUE1DX0NPTkZJRzcoNSkKKworI2RlZmluZSBHUE1DX0NPTkZJRzFfNgkJCQkJR1BNQ19DT05GSUcxKDYpCisjZGVmaW5lIEdQTUNfQ09ORklHMl82CQkJCQlHUE1DX0NPTkZJRzIoNikKKyNkZWZpbmUgR1BNQ19DT05GSUczXzYJCQkJCUdQTUNfQ09ORklHMyg2KQorI2RlZmluZSBHUE1DX0NPTkZJRzRfNgkJCQkJR1BNQ19DT05GSUc0KDYpCisjZGVmaW5lIEdQTUNfQ09ORklHNV82CQkJCQlHUE1DX0NPTkZJRzUoNikKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzYJCQkJCUdQTUNfQ09ORklHNig2KQorI2RlZmluZSBHUE1DX0NPTkZJRzdfNgkJCQkJR1BNQ19DT05GSUc3KDYpCisKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzcJCQkJCUdQTUNfQ09ORklHMSg3KQorI2RlZmluZSBHUE1DX0NPTkZJRzJfNwkJCQkJR1BNQ19DT05GSUcyKDcpCisjZGVmaW5lIEdQTUNfQ09ORklHM183CQkJCQlHUE1DX0NPTkZJRzMoNykKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzcJCQkJCUdQTUNfQ09ORklHNCg3KQorI2RlZmluZSBHUE1DX0NPTkZJRzVfNwkJCQkJR1BNQ19DT05GSUc1KDcpCisjZGVmaW5lIEdQTUNfQ09ORklHNl83CQkJCQlHUE1DX0NPTkZJRzYoNykKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzcJCQkJCUdQTUNfQ09ORklHNyg3KQorCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EKGkpCQkJKEdQTUNfQkFTRSArIDB4MDA3QyArICgoaSkgKiAweDAwMzApKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8wCQkJCUdQTUNfTkFORF9DT01NQU5EKDApCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzEJCQkJR1BNQ19OQU5EX0NPTU1BTkQoMSkKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMgkJCQlHUE1DX05BTkRfQ09NTUFORCgyKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8zCQkJCUdQTUNfTkFORF9DT01NQU5EKDMpCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzQJCQkJR1BNQ19OQU5EX0NPTU1BTkQoNCkKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfNQkJCQlHUE1DX05BTkRfQ09NTUFORCg1KQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF82CQkJCUdQTUNfTkFORF9DT01NQU5EKDYpCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzcJCQkJR1BNQ19OQU5EX0NPTU1BTkQoNykKKworI2RlZmluZSBHUE1DX05BTkRfQUREUkVTUyhpKQkJCShHUE1DX0JBU0UgKyAweDAwODAgKyAoKGkpICogMHgwMDMwKSkKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMAkJCQlHUE1DX05BTkRfQUREUkVTUygwKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18xCQkJCUdQTUNfTkFORF9BRERSRVNTKDEpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzIJCQkJR1BNQ19OQU5EX0FERFJFU1MoMikKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMwkJCQlHUE1DX05BTkRfQUREUkVTUygzKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU180CQkJCUdQTUNfTkFORF9BRERSRVNTKDQpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzUJCQkJR1BNQ19OQU5EX0FERFJFU1MoNSkKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfNgkJCQlHUE1DX05BTkRfQUREUkVTUyg2KQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU183CQkJCUdQTUNfTkFORF9BRERSRVNTKDcpCisKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEEoaSkJCQkJKEdQTUNfQkFTRSArIDB4MDA4NCArICgoaSkgKiAweDAwMzApKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8wCQkJCUdQTUNfTkFORF9EQVRBKDApCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzEJCQkJR1BNQ19OQU5EX0RBVEEoMSkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfMgkJCQlHUE1DX05BTkRfREFUQSgyKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8zCQkJCUdQTUNfTkFORF9EQVRBKDMpCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzQJCQkJR1BNQ19OQU5EX0RBVEEoNCkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfNQkJCQlHUE1DX05BTkRfREFUQSg1KQorI2RlZmluZSBHUE1DX05BTkRfREFUQV82CQkJCUdQTUNfTkFORF9EQVRBKDYpCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzcJCQkJR1BNQ19OQU5EX0RBVEEoNykKKworI2RlZmluZSBHUE1DX1BSRUZFVENIX0NPTkZJRzEJCQkoR1BNQ19CQVNFICsgMHgwMUUwKQorI2RlZmluZSBHUE1DX1BSRUZFVENIX0NPTkZJRzIJCQkoR1BNQ19CQVNFICsgMHgwMUU0KQorI2RlZmluZSBHUE1DX1BSRUZFVENIX0NPTlRST0wJCQkoR1BNQ19CQVNFICsgMHgwMUVDKQorI2RlZmluZSBHUE1DX1BSRUZFVENIX1NUQVRVUwkJCShHUE1DX0JBU0UgKyAweDAxRjApCisKKyNkZWZpbmUgR1BNQ19FQ0NfQ09ORklHCQkJCQkoR1BNQ19CQVNFICsgMHgwMUY0KQorI2RlZmluZSBHUE1DX0VDQ19DT05UUk9MCQkJCShHUE1DX0JBU0UgKyAweDAxRjgpCisjZGVmaW5lIEdQTUNfRUNDX1NJWkVfQ09ORklHCQkJKEdQTUNfQkFTRSArIDB4MDFGQykKKyNkZWZpbmUgR1BNQ19FQ0NfUkVTVUxUKGopCQkJCShHUE1DX0JBU0UgKyAweDAyMDAgKyBcCisJCQkJCQkJCQkJICgoKGopIC0gMSkgKiAweDAwMDQpKQorI2RlZmluZSBHUE1DX0VDQzFfUkVTVUxUCQkJCUdQTUNfRUNDX1JFU1VMVCgxKQorI2RlZmluZSBHUE1DX0VDQzJfUkVTVUxUCQkJCUdQTUNfRUNDX1JFU1VMVCgyKQorI2RlZmluZSBHUE1DX0VDQzNfUkVTVUxUCQkJCUdQTUNfRUNDX1JFU1VMVCgzKQorI2RlZmluZSBHUE1DX0VDQzRfUkVTVUxUCQkJCUdQTUNfRUNDX1JFU1VMVCg0KQorI2RlZmluZSBHUE1DX0VDQzVfUkVTVUxUCQkJCUdQTUNfRUNDX1JFU1VMVCg1KQorI2RlZmluZSBHUE1DX0VDQzZfUkVTVUxUCQkJCUdQTUNfRUNDX1JFU1VMVCg2KQorI2RlZmluZSBHUE1DX0VDQzdfUkVTVUxUCQkJCUdQTUNfRUNDX1JFU1VMVCg3KQorI2RlZmluZSBHUE1DX0VDQzhfUkVTVUxUCQkJCUdQTUNfRUNDX1JFU1VMVCg4KQorI2RlZmluZSBHUE1DX0VDQzlfUkVTVUxUCQkJCUdQTUNfRUNDX1JFU1VMVCg5KQorCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDAoaSkJCQkJKEdQTUNfQkFTRSArIDB4MDI0MCArICgoaSkgKiAweDAwMTApKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQwXzAJCQkJR1BNQ19CQ0hfUkVTVUxUMCgwKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQwXzEJCQkJR1BNQ19CQ0hfUkVTVUxUMCgxKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQwXzIJCQkJR1BNQ19CQ0hfUkVTVUxUMCgyKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQwXzMJCQkJR1BNQ19CQ0hfUkVTVUxUMCgzKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQwXzQJCQkJR1BNQ19CQ0hfUkVTVUxUMCg0KQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQwXzUJCQkJR1BNQ19CQ0hfUkVTVUxUMCg1KQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQwXzYJCQkJR1BNQ19CQ0hfUkVTVUxUMCg2KQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQwXzcJCQkJR1BNQ19CQ0hfUkVTVUxUMCg3KQorCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDEoaSkgCQkJKEdQTUNfQkFTRSArIDB4MDI0NCArICgoaSkgKiAweDAwMTApKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQxXzAJCQkJR1BNQ19CQ0hfUkVTVUxUMSgwKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQxXzEJCQkJR1BNQ19CQ0hfUkVTVUxUMSgxKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQxXzIJCQkJR1BNQ19CQ0hfUkVTVUxUMSgyKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQxXzMJCQkJR1BNQ19CQ0hfUkVTVUxUMSgzKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQxXzQJCQkJR1BNQ19CQ0hfUkVTVUxUMSg0KQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQxXzUJCQkJR1BNQ19CQ0hfUkVTVUxUMSg1KQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQxXzYJCQkJR1BNQ19CQ0hfUkVTVUxUMSg2KQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQxXzcJCQkJR1BNQ19CQ0hfUkVTVUxUMSg3KQorCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDIoaSkgCQkJKEdQTUNfQkFTRSArIDB4MDI0OCArICgoaSkgKiAweDAwMTApKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQyXzAJCQkJR1BNQ19CQ0hfUkVTVUxUMigwKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQyXzEJCQkJR1BNQ19CQ0hfUkVTVUxUMigxKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQyXzIJCQkJR1BNQ19CQ0hfUkVTVUxUMigyKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQyXzMJCQkJR1BNQ19CQ0hfUkVTVUxUMigzKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQyXzQJCQkJR1BNQ19CQ0hfUkVTVUxUMig0KQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQyXzUJCQkJR1BNQ19CQ0hfUkVTVUxUMig1KQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQyXzYJCQkJR1BNQ19CQ0hfUkVTVUxUMig2KQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQyXzcJCQkJR1BNQ19CQ0hfUkVTVUxUMig3KQorCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDMoaSkgCQkJKEdQTUNfQkFTRSArIDB4MDI0QyArICgoaSkgKiAweDAwMTApKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQzXzAJCQkJR1BNQ19CQ0hfUkVTVUxUMygwKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQzXzEJCQkJR1BNQ19CQ0hfUkVTVUxUMygxKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQzXzIJCQkJR1BNQ19CQ0hfUkVTVUxUMygyKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQzXzMJCQkJR1BNQ19CQ0hfUkVTVUxUMygzKQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQzXzQJCQkJR1BNQ19CQ0hfUkVTVUxUMyg0KQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQzXzUJCQkJR1BNQ19CQ0hfUkVTVUxUMyg1KQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQzXzYJCQkJR1BNQ19CQ0hfUkVTVUxUMyg2KQorI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQzXzcJCQkJR1BNQ19CQ0hfUkVTVUxUMyg3KQorCisjZGVmaW5lIEdQTUNfQkNIX1NXREFUQSAJCQkJKEdQTUNfQkFTRSArIDB4MDJEMCkKKworI2lmIGRlZmluZWQgKENPTkZJR19PTUFQMzRYWCkgfHwgZGVmaW5lZCAoQ09ORklHX0FNMzUxN0VWTSkKKyNkZWZpbmUgR1BNQ19DT05GSUdfQ1MwCQkoT01BUDM0WFhfR1BNQ19CQVNFKzB4NjApCisjZWxpZiBkZWZpbmVkIChDT05GSUdfQU0zNTE3VEVCKQorI2RlZmluZSBHUE1DX0NPTkZJR19DUzAJCShPTUFQMzRYWF9HUE1DX0JBU0UrMHhDMCkKKyNlbmRpZgorCisvKiBHUE1DIE1hcHBpbmcgKi8KKyMgZGVmaW5lIEZMQVNIX0JBU0UJCTB4MTAwMDAwMDAgIC8qIE5PUiBmbGFzaCAoYWxpZ25lZCB0byAyNTYgTWVnKSAqLworIyBkZWZpbmUgRkxBU0hfQkFTRV9TRFBWMQkweDA0MDAwMDAwICAvKiBOT1IgZmxhc2ggKGFsaWduZWQgdG8gNjQgTWVnKSAqLworIyBkZWZpbmUgRkxBU0hfQkFTRV9TRFBWMgkweDEwMDAwMDAwICAvKiBOT1IgZmxhc2ggKGFsaWduZWQgdG8gMjU2IE1lZykgKi8KKyMgZGVmaW5lIERFQlVHX0JBU0UJCTB4MDgwMDAwMDAgIC8qIGRlYnVnIGJvYXJkICovCisjIGRlZmluZSBOQU5EX0JBU0UJCTB4MzAwMDAwMDAgIC8qIE5BTkQgYWRkciAoYWN0dWFsIHNpemUgc21hbGwgcG9ydCkqLworIyBkZWZpbmUgUElTTU8yX0JBU0UJCTB4MTgwMDAwMDAgIC8qIFBJU01PMiBDUzEvMiAqLworIyBkZWZpbmUgT05FTkFORF9NQVAJCTB4MjAwMDAwMDAgIC8qIE9uZU5hbmQgYWRkciAoYWN0dWFsIHNpemUgc21hbGwgcG9ydCAqLworCisvKiBTTVMgKi8KKyNkZWZpbmUgU01TX1NZU0NPTkZJRwkJKE9NQVAzNFhYX1NNU19CQVNFKzB4MTApCisjZGVmaW5lIFNNU19SR19BVFQwCQkoT01BUDM0WFhfU01TX0JBU0UrMHg0OCkKKyNkZWZpbmUgU01TX0NMQVNTX0FSQjAJCShPTUFQMzRYWF9TTVNfQkFTRSsweEQwKQorI2RlZmluZSBCVVJTVENPTVBMRVRFX0dST1VQNwlCSVQzMQorCisvKiBTRFJDICovCisjZGVmaW5lIFNEUkNfUkVWSVNJT04JCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDAwKQorI2RlZmluZSBTRFJDX1NZU0NPTkZJRwkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4MTApCisjZGVmaW5lIFNEUkNfU1lTU1RBVFVTCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHgxNCkKKyNkZWZpbmUJU0RSQ19TVEFUVVMJCQlTRFJDX1NZU1NUQVRVUworI2RlZmluZSBTRFJDX0NTX0NGRwkJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDQwKQorI2RlZmluZSBTRFJDX1NIQVJJTkcJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDQ0KQorI2RlZmluZSBTRFJDX0VSUl9BRERSCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg0OCkKKyNkZWZpbmUgU0RSQ19FUlJfVFlQRQkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4NEMpCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg2MCkKKyNkZWZpbmUgU0RSQ19ETExBX1NUQVRVUwkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg2NCkKKyNkZWZpbmUgU0RSQ19ETExCX0NUUkwJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDY4KQorI2RlZmluZSBTRFJDX0RMTEJfU1RBVFVTCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDZDKQorI2RlZmluZSBETExQSEFTRQkJQklUMQorI2RlZmluZSBMT0FERExMCQkJQklUMgorI2RlZmluZSBETExfREVMQVlfTUFTSwkJMHhGRjAwCisjZGVmaW5lIERMTF9OT19GSUxURVJfTUFTSwkoQklUOHxCSVQ5KQorI2RlZmluZSBTRFJDX1BPV0VSX1JFRwkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4NzApCisjZGVmaW5lIFNEUkNfUE9XRVIJCQlTRFJDX1BPV0VSX1JFRworI2RlZmluZSBXQUtFVVBQUk9DCQlCSVQyNgorCisjZGVmaW5lIFNEUkNfTUNGR18wCQkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4ODApCisjZGVmaW5lIFNEUkNfTVJfMAkJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDg0KQorI2RlZmluZSBTRFJDX0VNUjJfMAkJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDhDKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBXzAJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4OUMpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfMAkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHhBMCkKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTF8wCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHhBNCkKKyNkZWZpbmUgU0RSQ19NQU5VQUxfMAkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4QTgpCisjZGVmaW5lIFNEUkNfTUNGR18xCQkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4QjApCisjZGVmaW5lIFNEUkNfTVJfMQkJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweEI0KQorI2RlZmluZSBTRFJDX0VNUjJfMQkJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweEJDKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBXzEJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4QzQpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfMQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHhDOCkKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTF8xCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHhENCkKKyNkZWZpbmUgU0RSQ19NQU5VQUxfMQkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4RDgpCisjZGVmaW5lIE9NQVAzNFhYX1NEUkNfQ1MwCTB4ODAwMDAwMDAKKyNkZWZpbmUgT01BUDM0WFhfU0RSQ19DUzEJMHhBMDAwMDAwMAorI2RlZmluZSBDTURfTk9QCQkJMHgwCisjZGVmaW5lIENNRF9QUkVDSEFSR0UJCTB4MQorI2RlZmluZSBDTURfQVVUT1JFRlJFU0gJCTB4MgorI2RlZmluZSBDTURfRU5UUl9QV1JET1dOCTB4MworI2RlZmluZSBDTURfRVhJVF9QV1JET1dOCTB4NAorI2RlZmluZSBDTURfRU5UUl9TUkZSU0gJCTB4NQorI2RlZmluZSBDTURfQ0tFX0hJR0gJCTB4NgorI2RlZmluZSBDTURfQ0tFX0xPVwkJMHg3CisjZGVmaW5lIFNPRlRSRVNFVAkJQklUMQorI2RlZmluZSBTTUFSVF9JRExFCQkoMHgyIDw8IDMpCisjZGVmaW5lIFJFRl9PTl9JRExFCQkoMHgxIDw8IDYpCisKKy8qIEVNSUY0IHJlZ2lzdGVyICovCisjZGVmaW5lCUVNSUY0X0JBU0UJCU9NQVAzNFhYX1NEUkNfQkFTRQorI2RlZmluZQlFTUlGNF9NT0RfSUQJCShFTUlGNF9CQVNFICsgMHgwMCkKKyNkZWZpbmUJRU1JRjRfU0RSQU1fU1RTCQkoRU1JRjRfQkFTRSArIDB4MDQpCisjZGVmaW5lCUVNSUY0X1NEUkFNX0NGRwkJKEVNSUY0X0JBU0UgKyAweDA4KQorI2RlZmluZQlFTUlGNF9TRFJBTV9SRkNSCShFTUlGNF9CQVNFICsgMHgxMCkKKyNkZWZpbmUJRU1JRjRfU0RSQU1fUkZDUl9TSERXCShFTUlGNF9CQVNFICsgMHgxNCkKKyNkZWZpbmUJRU1JRjRfU0RSQU1fVElNMQkoRU1JRjRfQkFTRSArIDB4MTgpCisjZGVmaW5lCUVNSUY0X1NEUkFNX1RJTTFfU0hEVwkoRU1JRjRfQkFTRSArIDB4MUMpCisjZGVmaW5lCUVNSUY0X1NEUkFNX1RJTTIJKEVNSUY0X0JBU0UgKyAweDIwKQorI2RlZmluZQlFTUlGNF9TRFJBTV9USU0yX1NIRFcJKEVNSUY0X0JBU0UgKyAweDI0KQorI2RlZmluZQlFTUlGNF9TRFJBTV9USU0zCShFTUlGNF9CQVNFICsgMHgyOCkKKyNkZWZpbmUJRU1JRjRfU0RSQU1fVElNM19TSERXCShFTUlGNF9CQVNFICsgMHgyYykKKyNkZWZpbmUJRU1JRjRfUFdSX01HVF9DVFJMCShFTUlGNF9CQVNFICsgMHgzOCkKKyNkZWZpbmUJRU1JRjRfUFdSX01HVF9DVFJMX1NIRFcJKEVNSUY0X0JBU0UgKyAweDNDKQorI2RlZmluZQlFTUlGNF9JT0RGVF9UTEdDCShFTUlGNF9CQVNFICsgMHg2MCkKKyNkZWZpbmUJRU1JRjRfRERSX1BIWUNUTDEJKEVNSUY0X0JBU0UgKyAweEU0KQorI2RlZmluZQlFTUlGNF9ERFJfUEhZQ1RMMV9TSERXCShFTUlGNF9CQVNFICsgMHhFOCkKKyNkZWZpbmUJRU1JRjRfRERSX1BIWUNUTDIJKEVNSUY0X0JBU0UgKyAweEVDKQorCisKKy8qIHRpbWVyIHJlZ3Mgb2Zmc2V0cyAoMzIgYml0IHJlZ3MpICovCisjZGVmaW5lIFRJRFIJCQkweDAgICAgICAvKiByICovCisjZGVmaW5lIFRJT0NQX0NGRwkJMHgxMCAgICAgLyogcncgKi8KKyNkZWZpbmUgVElTVEFUCQkJMHgxNCAgICAgLyogciAqLworI2RlZmluZSBUSVNSCQkJMHgxOCAgICAgLyogcncgKi8KKyNkZWZpbmUgVElFUgkJCTB4MUMgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRXRVIJCQkweDIwICAgICAvKiBydyAqLworI2RlZmluZSBUQ0xSCQkJMHgyNCAgICAgLyogcncgKi8KKyNkZWZpbmUgVENSUgkJCTB4MjggICAgIC8qIHJ3ICovCisjZGVmaW5lIFRMRFIJCQkweDJDICAgICAvKiBydyAqLworI2RlZmluZSBUVEdSCQkJMHgzMCAgICAgLyogcncgKi8KKyNkZWZpbmUgVFdQUwkJCTB4MzQgICAgIC8qIHIgKi8KKyNkZWZpbmUgVE1BUgkJCTB4MzggICAgIC8qIHJ3ICovCisjZGVmaW5lIFRDQVIxCQkJMHgzYyAgICAgLyogciAqLworI2RlZmluZSBUU0lDUgkJCTB4NDAgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRDQVIyCQkJMHg0NCAgICAgLyogciAqLworI2RlZmluZSBHUFRfRU4JCQkoKDA8PDIpfEJJVDF8QklUMCkgLyogZW5hYmxlIHN5c19jbGsgTk8tcHJlc2NhbGUgLzEgKi8KKworLyogV2F0Y2hkb2cgKi8KKyNkZWZpbmUgV1dQUwkJCTB4MzQgICAgIC8qIHIgKi8KKyNkZWZpbmUgV1NQUgkJCTB4NDggICAgIC8qIHJ3ICovCisjZGVmaW5lIFdEX1VOTE9DSzEJCTB4QUFBQQorI2RlZmluZSBXRF9VTkxPQ0syCQkweDU1NTUKKworLyogUFJDTSAqLworI2RlZmluZSBDTV9GQ0xLRU5fSVZBMiAgICAgIDB4NDgwMDQwMDAKKyNkZWZpbmUgQ01fQ0xLRU5fUExMX0lWQTIgICAweDQ4MDA0MDA0CisjZGVmaW5lIENNX0lETEVTVF9QTExfSVZBMiAgMHg0ODAwNDAyNAorI2RlZmluZSBDTV9DTEtTRUwxX1BMTF9JVkEyIDB4NDgwMDQwNDAKKyNkZWZpbmUgQ01fQ0xLU0VMMl9QTExfSVZBMiAweDQ4MDA0MDQ0CisjZGVmaW5lIENNX0NMS0VOX1BMTF9NUFUgICAgMHg0ODAwNDkwNAorI2RlZmluZSBDTV9JRExFU1RfUExMX01QVSAgIDB4NDgwMDQ5MjQKKyNkZWZpbmUgQ01fQ0xLU0VMMV9QTExfTVBVICAweDQ4MDA0OTQwCisjZGVmaW5lIENNX0NMS1NFTDJfUExMX01QVSAgMHg0ODAwNDk0NAorI2RlZmluZSBDTV9GQ0xLRU4xX0NPUkUgICAgIDB4NDgwMDRhMDAKKyNkZWZpbmUgQ01fSUNMS0VOMV9DT1JFICAgICAweDQ4MDA0YTEwCisjZGVmaW5lIENNX0lDTEtFTjJfQ09SRSAgICAgMHg0ODAwNGExNAorI2RlZmluZSBDTV9DTEtTRUxfQ09SRSAgICAgIDB4NDgwMDRhNDAKKyNkZWZpbmUgQ01fRkNMS0VOX0dGWCAgICAgICAweDQ4MDA0YjAwCisjZGVmaW5lIENNX0lDTEtFTl9HRlggICAgICAgMHg0ODAwNGIxMAorI2RlZmluZSBDTV9DTEtTRUxfR0ZYICAgICAgIDB4NDgwMDRiNDAKKyNkZWZpbmUgQ01fRkNMS0VOX1dLVVAgICAgICAweDQ4MDA0YzAwCisjZGVmaW5lIENNX0lDTEtFTl9XS1VQICAgICAgMHg0ODAwNGMxMAorI2RlZmluZSBDTV9DTEtTRUxfV0tVUCAgICAgIDB4NDgwMDRjNDAKKyNkZWZpbmUgQ01fSURMRVNUX1dLVVAgICAgICAweDQ4MDA0YzIwCisjZGVmaW5lIENNX0NMS0VOX1BMTCAgICAgICAgMHg0ODAwNGQwMAorI2RlZmluZSBDTV9JRExFU1RfQ0tHRU4gICAgIDB4NDgwMDRkMjAKKyNkZWZpbmUgQ01fQ0xLU0VMMV9QTEwgICAgICAweDQ4MDA0ZDQwCisjZGVmaW5lIENNX0NMS1NFTDJfUExMICAgICAgMHg0ODAwNGQ0NAorI2RlZmluZSBDTV9DTEtTRUwzX1BMTCAgICAgIDB4NDgwMDRkNDgKKyNkZWZpbmUgQ01fRkNMS0VOX0RTUyAgICAgICAweDQ4MDA0ZTAwCisjZGVmaW5lIENNX0lDTEtFTl9EU1MgICAgICAgMHg0ODAwNGUxMAorI2RlZmluZSBDTV9DTEtTRUxfRFNTICAgICAgIDB4NDgwMDRlNDAKKyNkZWZpbmUgQ01fRkNMS0VOX0NBTSAgICAgICAweDQ4MDA0ZjAwCisjZGVmaW5lIENNX0lDTEtFTl9DQU0gICAgICAgMHg0ODAwNGYxMAorI2RlZmluZSBDTV9DTEtTRUxfQ0FNICAgICAgIDB4NDgwMDRGNDAKKyNkZWZpbmUgQ01fRkNMS0VOX1BFUiAgICAgICAweDQ4MDA1MDAwCisjZGVmaW5lIENNX0lDTEtFTl9QRVIgICAgICAgMHg0ODAwNTAxMAorI2RlZmluZSBDTV9DTEtTRUxfUEVSICAgICAgIDB4NDgwMDUwNDAKKyNkZWZpbmUgQ01fQ0xLU0VMMV9FTVUgICAgICAweDQ4MDA1MTQwCisKKy8qIFNNWC1BUEUgKi8KKyNkZWZpbmUgUE1fUlRfQVBFX0JBU0VfQUREUl9BUk0JCShTTVhfQVBFX0JBU0UgKyAweDEwMDAwKQorI2RlZmluZSBQTV9HUE1DX0JBU0VfQUREUl9BUk0JCShTTVhfQVBFX0JBU0UgKyAweDEyNDAwKQorI2RlZmluZSBQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0JKFNNWF9BUEVfQkFTRSArIDB4MTI4MDApCisjZGVmaW5lIFBNX09DTV9ST01fQkFTRV9BRERSX0FSTQkoU01YX0FQRV9CQVNFICsgMHgxMkMwMCkKKyNkZWZpbmUgUE1fSVZBMl9CQVNFX0FERFJfQVJNCQkoU01YX0FQRV9CQVNFICsgMHgxNDAwMCkKKworI2RlZmluZSBSVF9SRVFfSU5GT19QRVJNSVNTSU9OXzEJKFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNICsgMHg2OCkKKyNkZWZpbmUgUlRfUkVBRF9QRVJNSVNTSU9OXzAJKFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNICsgMHg1MCkKKyNkZWZpbmUgUlRfV1JJVEVfUEVSTUlTU0lPTl8wCShQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSArIDB4NTgpCisjZGVmaW5lIFJUX0FERFJfTUFUQ0hfMQkoUE1fUlRfQVBFX0JBU0VfQUREUl9BUk0gKyAweDYwKQorCisjZGVmaW5lIEdQTUNfUkVRX0lORk9fUEVSTUlTU0lPTl8wCShQTV9HUE1DX0JBU0VfQUREUl9BUk0gKyAweDQ4KQorI2RlZmluZSBHUE1DX1JFQURfUEVSTUlTU0lPTl8wCShQTV9HUE1DX0JBU0VfQUREUl9BUk0gKyAweDUwKQorI2RlZmluZSBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMAkoUE1fR1BNQ19CQVNFX0FERFJfQVJNICsgMHg1OCkKKworI2RlZmluZSBPQ01fUkVRX0lORk9fUEVSTUlTU0lPTl8wCShQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0gKyAweDQ4KQorI2RlZmluZSBPQ01fUkVBRF9QRVJNSVNTSU9OXzAJKFBNX09DTV9SQU1fQkFTRV9BRERSX0FSTSArIDB4NTApCisjZGVmaW5lIE9DTV9XUklURV9QRVJNSVNTSU9OXzAJKFBNX09DTV9SQU1fQkFTRV9BRERSX0FSTSArIDB4NTgpCisjZGVmaW5lIE9DTV9BRERSX01BVENIXzIJKFBNX09DTV9SQU1fQkFTRV9BRERSX0FSTSArIDB4ODApCisKKyNkZWZpbmUgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzAJKFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4NDgpCisjZGVmaW5lIElWQTJfUkVBRF9QRVJNSVNTSU9OXzAJKFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4NTApCisjZGVmaW5lIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wCShQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDU4KQorCisjZGVmaW5lIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8xCShQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDY4KQorI2RlZmluZSBJVkEyX1JFQURfUEVSTUlTU0lPTl8xCQkoUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg3MCkKKyNkZWZpbmUgSVZBMl9XUklURV9QRVJNSVNTSU9OXzEJCShQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDc4KQorCisjZGVmaW5lIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8yCShQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDg4KQorI2RlZmluZSBJVkEyX1JFQURfUEVSTUlTU0lPTl8yCQkoUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg5MCkKKyNkZWZpbmUgSVZBMl9XUklURV9QRVJNSVNTSU9OXzIJCShQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDk4KQorCisjZGVmaW5lIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8zCShQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweEE4KQorI2RlZmluZSBJVkEyX1JFQURfUEVSTUlTU0lPTl8zCQkoUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHhCMCkKKyNkZWZpbmUgSVZBMl9XUklURV9QRVJNSVNTSU9OXzMJCShQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweEI4KQorCisvKiBJMkMgYmFzZSAqLworI2RlZmluZSBJMkNfQkFTRTEJCShPTUFQMzRYWF9DT1JFX0w0X0lPX0JBU0UgKyAweDcwMDAwKQorI2RlZmluZSBJMkNfQkFTRTIJCShPTUFQMzRYWF9DT1JFX0w0X0lPX0JBU0UgKyAweDcyMDAwKQorI2RlZmluZSBJMkNfQkFTRTMJCShPTUFQMzRYWF9DT1JFX0w0X0lPX0JBU0UgKyAweDYwMDAwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvZ3BtYy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9ncG1jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiMTFkOQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvZ3BtYy5oCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyByZWdpc3RlciBhbmQgcmVnaXN0ZXIgZmllbGQgY29uc3RhbnRzIGFuZAorICogICAgICBtYWNyb3MgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBPcGVuIE11bHRpbWVkaWEgQXBwbGljYXRpb24KKyAqICAgICAgUGxhdGZvcm0gKE9NQVApIDMgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyIChHUE1DKS4KKyAqLworCisjaWZuZGVmIF9PTUFQM19HUE1DX0gKKyNkZWZpbmUgX09NQVAzX0dQTUNfSAorCisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorCisvKgorICogR1BNQyBJbnRlcmNvbm5lY3QgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHX0FVVE9JRExFX0RJU0FCTEUJCQkJCUFSTV9SRUdfVkFMKDAsIDApCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHX0FVVE9JRExFX0VOQUJMRQkJCQkJQVJNX1JFR19WQUwoMCwgMSkKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUdfU09GVFJFU0VUCQkJCQkJQVJNX1JFR19WQUwoMSwgMSkKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUdfSURMRU1PREVfRk9SQ0UJCQkJCUFSTV9SRUdfVkFMKDMsIDApCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHX0lETEVNT0RFX05PTkUJCQkJCUFSTV9SRUdfVkFMKDMsIDEpCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHX0lETEVNT0RFX1NNQVJUCQkJCQlBUk1fUkVHX1ZBTCgzLCAyKQorCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHX0lSUUVOQUJMRV9GSUZPRVZFTlRfRElTQUJMRQkJQVJNX1JFR19WQUwoMCwgMCkKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUdfSVJRRU5BQkxFX0ZJRk9FVkVOVF9FTkFCTEUJCUFSTV9SRUdfVkFMKDAsIDEpCisKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUdfSVJRRU5BQkxFX1RFUk1JTkFMQ09VTlRfRElTQUJMRQlBUk1fUkVHX1ZBTCgwLCAwKQorI2RlZmluZSBHUE1DX1NZU0NPTkZJR19JUlFFTkFCTEVfVEVSTUlOQUxDT1VOVF9FTkFCTEUJQVJNX1JFR19WQUwoMCwgMSkKKworI2RlZmluZSBHUE1DX1NZU0NPTkZJR19JUlFFTkFCTEVfVEVSTUlOQUxDT1VOVF9ESVNBQkxFCUFSTV9SRUdfVkFMKDAsIDApCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHX0lSUUVOQUJMRV9URVJNSU5BTENPVU5UX0VOQUJMRQlBUk1fUkVHX1ZBTCgwLCAxKQorCisvKgorICogR1BNQyBJbnRlcnJ1cHQgQ29udHJvbAorICovCisKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfV0FJVDNFREdFREVURUNUSU9OX0RJU0FCTEUJCUFSTV9SRUdfVkFMKDExLCAwKQorI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9XQUlUM0VER0VERVRFQ1RJT05fRU5BQkxFCQlBUk1fUkVHX1ZBTCgxMSwgMSkKKworI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9XQUlUMkVER0VERVRFQ1RJT05fRElTQUJMRQkJQVJNX1JFR19WQUwoMTAsIDApCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX1dBSVQyRURHRURFVEVDVElPTl9FTkFCTEUJCUFSTV9SRUdfVkFMKDEwLCAxKQorCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX1dBSVQxRURHRURFVEVDVElPTl9ESVNBQkxFCQlBUk1fUkVHX1ZBTCg5LCAwKQorI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9XQUlUMUVER0VERVRFQ1RJT05fRU5BQkxFCQlBUk1fUkVHX1ZBTCg5LCAxKQorCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX1dBSVQwRURHRURFVEVDVElPTl9ESVNBQkxFCQlBUk1fUkVHX1ZBTCg4LCAwKQorI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9XQUlUMEVER0VERVRFQ1RJT05fRU5BQkxFCQlBUk1fUkVHX1ZBTCg4LCAxKQorCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX1RFUk1JTkFMQ09VTlRFVkVOVF9ESVNBQkxFCQlBUk1fUkVHX1ZBTCgxLCAwKQorI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9URVJNSU5BTENPVU5URVZFTlRfRU5BQkxFCQlBUk1fUkVHX1ZBTCgxLCAxKQorCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX0ZJRk9FVkVOVEVOQUJMRV9ESVNBQkxFCQkJQVJNX1JFR19WQUwoMCwgMCkKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfRklGT0VWRU5URU5BQkxFX0VOQUJMRQkJCUFSTV9SRUdfVkFMKDAsIDApCisKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfQUxMX0RJU0FCTEUJCQkJCVwKKwkoR1BNQ19JUlFFTkFCTEVfV0FJVDNFREdFREVURUNUSU9OX0RJU0FCTEUgfAlcCisJIEdQTUNfSVJRRU5BQkxFX1dBSVQyRURHRURFVEVDVElPTl9ESVNBQkxFIHwJXAorCSBHUE1DX0lSUUVOQUJMRV9XQUlUMUVER0VERVRFQ1RJT05fRElTQUJMRSB8CVwKKwkgR1BNQ19JUlFFTkFCTEVfV0FJVDBFREdFREVURUNUSU9OX0RJU0FCTEUgfAlcCisJIEdQTUNfSVJRRU5BQkxFX1RFUk1JTkFMQ09VTlRFVkVOVF9ESVNBQkxFIHwJXAorCSBHUE1DX0lSUUVOQUJMRV9GSUZPRVZFTlRFTkFCTEVfRElTQUJMRSkKKworI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9BTExfRU5BQkxFCQkJCQlcCisJKEdQTUNfSVJRRU5BQkxFX1dBSVQzRURHRURFVEVDVElPTl9FTkFCTEUgfAkJXAorCSBHUE1DX0lSUUVOQUJMRV9XQUlUMkVER0VERVRFQ1RJT05fRU5BQkxFIHwJCVwKKwkgR1BNQ19JUlFFTkFCTEVfV0FJVDFFREdFREVURUNUSU9OX0VOQUJMRSB8CQlcCisJIEdQTUNfSVJRRU5BQkxFX1dBSVQwRURHRURFVEVDVElPTl9FTkFCTEUgfAkJXAorCSBHUE1DX0lSUUVOQUJMRV9URVJNSU5BTENPVU5URVZFTlRfRU5BQkxFIHwJCVwKKwkgR1BNQ19JUlFFTkFCTEVfRklGT0VWRU5URU5BQkxFX0VOQUJMRSkKKworLyoKKyAqIEdQTUMgVGltZW91dCBDb3VudGVyIENvbnRyb2wKKyAqLworCisjZGVmaW5lIEdQTUNfVElNRU9VVFNUQVJUVkFMVUVfTUFTSwkJCQkJCUFSTV9SRUdfVkFMKDQsIDB4MUZGKQorI2RlZmluZSBHUE1DX1RJTUVPVVRTVEFSVFZBTFVFX0VOQ09ERSh2KQkJCQlBUk1fUkVHX1ZBTF9FTkNPREUoNCwgR1BNQ19USU1FT1VUU1RBUlRWQUxVRV9NQVNLLCB2KQorI2RlZmluZSBHUE1DX1RJTUVPVVRTVEFSVFZBTFVFX0RFQ09ERSh2KQkJCQlBUk1fUkVHX1ZBTF9ERUNPREUoNCwgR1BNQ19USU1FT1VUU1RBUlRWQUxVRV9NQVNLLCB2KQorCisjZGVmaW5lIEdQTUNfVElNRU9VVEVOQUJMRV9PRkYJCQkJCQkJQVJNX1JFR19WQUwoMCwgMCkKKyNkZWZpbmUgR1BNQ19USU1FT1VURU5BQkxFX09OCQkJCQkJCUFSTV9SRUdfVkFMKDAsIDEpCisKKy8qCisgKiBHUE1DIEdsb2JhbCBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgR1BNQ19XQUlUM1BJTlBPTEFSSVRZX0FDVElWRV9MT1cJCQkJQVJNX1JFR19WQUwoMTEsIDApCisjZGVmaW5lIEdQTUNfV0FJVDNQSU5QT0xBUklUWV9BQ1RJVkVfSElHSAkJCQlBUk1fUkVHX1ZBTCgxMSwgMSkKKworI2RlZmluZSBHUE1DX1dBSVQyUElOUE9MQVJJVFlfQUNUSVZFX0xPVwkJCQlBUk1fUkVHX1ZBTCgxMCwgMCkKKyNkZWZpbmUgR1BNQ19XQUlUMlBJTlBPTEFSSVRZX0FDVElWRV9ISUdICQkJCUFSTV9SRUdfVkFMKDEwLCAxKQorCisjZGVmaW5lIEdQTUNfV0FJVDFQSU5QT0xBUklUWV9BQ1RJVkVfTE9XCQkJCUFSTV9SRUdfVkFMKDksIDApCisjZGVmaW5lIEdQTUNfV0FJVDFQSU5QT0xBUklUWV9BQ1RJVkVfSElHSAkJCQlBUk1fUkVHX1ZBTCg5LCAxKQorCisjZGVmaW5lIEdQTUNfV0FJVDBQSU5QT0xBUklUWV9BQ1RJVkVfTE9XCQkJCUFSTV9SRUdfVkFMKDgsIDApCisjZGVmaW5lIEdQTUNfV0FJVDBQSU5QT0xBUklUWV9BQ1RJVkVfSElHSAkJCQlBUk1fUkVHX1ZBTCg4LCAxKQorCisjZGVmaW5lIEdQTUNfV1JJVEVQUk9URUNUX0xPVwkJCQkJCQlBUk1fUkVHX1ZBTCg0LCAwKQorI2RlZmluZSBHUE1DX1dSSVRFUFJPVEVDVF9ISUdICQkJCQkJCUFSTV9SRUdfVkFMKDQsIDEpCisKKyNkZWZpbmUgR1BNQ19MSU1JVEVEQUREUkVTU19ESVNBQkxFRAkJCQkJQVJNX1JFR19WQUwoMSwgMCkKKyNkZWZpbmUgR1BNQ19MSU1JVEVEQUREUkVTU19FTkFCTEVECQkJCQkJQVJNX1JFR19WQUwoMSwgMSkKKworI2RlZmluZSBHUE1DX05BTkRGT1JDRVBPU1RFRFdSSVRFX0RJU0FCTEVECQkJCUFSTV9SRUdfVkFMKDAsIDApCisjZGVmaW5lIEdQTUNfTkFOREZPUkNFUE9TVEVEV1JJVEVfRU5BQkxFRAkJCQlBUk1fUkVHX1ZBTCgwLCAxKQorCisjZGVmaW5lIEdQTUNfQ09ORklHN19NQVNLQUREUkVTU19NQVNLCQkJCQlBUk1fUkVHX1ZBTCg4LCAweEYpCisjZGVmaW5lIEdQTUNfQ09ORklHN19NQVNLQUREUkVTU19FTkNPREUodikJCQkJQVJNX1JFR19WQUxfRU5DT0RFKDgsIEdQTUNfQ09ORklHN19NQVNLQUREUkVTU19NQVNLLCB2KQorI2RlZmluZSBHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfREVDT0RFKHYpCQkJCUFSTV9SRUdfVkFMX0RFQ09ERSg4LCBHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfTUFTSywgdikKKyNkZWZpbmUgR1BNQ19DT05GSUc3X01BU0tBRERSRVNTXzI1Nl9NQgkJCQkJICAweDAKKyNkZWZpbmUgR1BNQ19DT05GSUc3X01BU0tBRERSRVNTXzEyOF9NQgkJCQkJICAweDgKKyNkZWZpbmUgR1BNQ19DT05GSUc3X01BU0tBRERSRVNTXzY0X01CCQkJCQkgIDB4QworI2RlZmluZSBHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfMzJfTUIJCQkJCSAgMHhFCisjZGVmaW5lIEdQTUNfQ09ORklHN19NQVNLQUREUkVTU18xNl9NQgkJCQkJICAweEYKKworI2RlZmluZSBHUE1DX0NPTkZJRzdfQ1NWQUxJRF9ESVNBQkxFRAkJCQkJQVJNX1JFR19WQUwoNiwgMCkKKyNkZWZpbmUgR1BNQ19DT05GSUc3X0NTVkFMSURfRU5BQkxFRAkJCQkJQVJNX1JFR19WQUwoNiwgMSkKKworI2RlZmluZSBHUE1DX0NPTkZJRzdfQkFTRUFERFJFU1NfTUFTSwkJCQkJQVJNX1JFR19WQUwoMCwgMHgzRikKKyNkZWZpbmUgR1BNQ19DT05GSUc3X0JBU0VBRERSRVNTX0VOQ09ERSh2KQkJCQlBUk1fUkVHX1ZBTF9FTkNPREUoMCwgR1BNQ19DT05GSUc3X0JBU0VBRERSRVNTX01BU0ssICgodikgPj4gMjQpKQorI2RlZmluZSBHUE1DX0NPTkZJRzdfQkFTRUFERFJFU1NfREVDT0RFKHYpCQkJCShBUk1fUkVHX1ZBTF9ERUNPREUoMCwgR1BNQ19DT05GSUc3X0JBU0VBRERSRVNTX01BU0ssIHYpIDw8IDI0KQorCisKKyNlbmRpZiAvKiBfT01BUDNfR1BNQ19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2kyYy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZmNkYTVlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9pMmMuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX09NQVAzNFhYX0kyQ19IXworI2RlZmluZSBfT01BUDM0WFhfSTJDX0hfCisKKy8qIEdldCB0aGUgaTJjIGJhc2UgYWRkcmVzc2VzICovCisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisKKyNkZWZpbmUgSTJDX0RFRkFVTFRfQkFTRSBJMkNfQkFTRTEKKworI2RlZmluZSBJMkNfUkVWICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgSTJDX0lFICAgICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIEkyQ19TVEFUICAgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBJMkNfSVYgICAgICAgICAgICAgICAgICAoMHgwYykKKyNkZWZpbmUgSTJDX0JVRiAgICAgICAgICAgICAgICAgKDB4MTQpCisjZGVmaW5lIEkyQ19DTlQgICAgICAgICAgICAgICAgICgweDE4KQorI2RlZmluZSBJMkNfREFUQSAgICAgICAgICAgICAgICAoMHgxYykKKyNkZWZpbmUgSTJDX1NZU0MgICAgICAgICAgICAgICAgKDB4MjApIAorI2RlZmluZSBJMkNfQ09OICAgICAgICAgICAgICAgICAoMHgyNCkKKyNkZWZpbmUgSTJDX09BICAgICAgICAgICAgICAgICAgKDB4MjgpCisjZGVmaW5lIEkyQ19TQSAgICAgICAgICAgICAgICAgICgweDJjKQorI2RlZmluZSBJMkNfUFNDICAgICAgICAgICAgICAgICAoMHgzMCkKKyNkZWZpbmUgSTJDX1NDTEwgICAgICAgICAgICAgICAgKDB4MzQpCisjZGVmaW5lIEkyQ19TQ0xIICAgICAgICAgICAgICAgICgweDM4KQorI2RlZmluZSBJMkNfU1lTVEVTVCAgICAgICAgICAgICAoMHgzYykKKworLyogSTJDIG1hc2tzICovCisKKy8qIEkyQyBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIChJMkNfSUUpOiAqLworI2RlZmluZSBJMkNfSUVfR0NfSUUgICAgKDEgPDwgNSkKKyNkZWZpbmUgSTJDX0lFX1hSRFlfSUUgICgxIDw8IDQpICAgICAgICAvKiBUcmFuc21pdCBkYXRhIHJlYWR5IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0lFX1JSRFlfSUUgICgxIDw8IDMpICAgICAgICAvKiBSZWNlaXZlIGRhdGEgcmVhZHkgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJMkNfSUVfQVJEWV9JRSAgKDEgPDwgMikgICAgICAgIC8qIFJlZ2lzdGVyIGFjY2VzcyByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19JRV9OQUNLX0lFICAoMSA8PCAxKSAgICAgICAgLyogTm8gYWNrbm93bGVkZ21lbnQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJMkNfSUVfQUxfSUUgICAgKDEgPDwgMCkgICAgICAgIC8qIEFyYml0cmF0aW9uIGxvc3QgaW50ZXJydXB0IGVuYWJsZSAqLworCisvKiBJMkMgU3RhdHVzIFJlZ2lzdGVyIChJMkNfU1RBVCk6ICovCisKKyNkZWZpbmUgSTJDX1NUQVRfU0JEICAgICgxIDw8IDE1KSAgICAgICAvKiBTaW5nbGUgYnl0ZSBkYXRhICovCisjZGVmaW5lIEkyQ19TVEFUX0JCICAgICAoMSA8PCAxMikgICAgICAgLyogQnVzIGJ1c3kgKi8KKyNkZWZpbmUgSTJDX1NUQVRfUk9WUiAgICgxIDw8IDExKSAgICAgICAvKiBSZWNlaXZlIG92ZXJydW4gKi8KKyNkZWZpbmUgSTJDX1NUQVRfWFVERiAgICgxIDw8IDEwKSAgICAgICAvKiBUcmFuc21pdCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgSTJDX1NUQVRfQUFTICAgICgxIDw8IDkpICAgICAgICAvKiBBZGRyZXNzIGFzIHNsYXZlICovCisjZGVmaW5lIEkyQ19TVEFUX0dDICAgICAoMSA8PCA1KQorI2RlZmluZSBJMkNfU1RBVF9YUkRZICAgKDEgPDwgNCkgICAgICAgIC8qIFRyYW5zbWl0IGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX1NUQVRfUlJEWSAgICgxIDw8IDMpICAgICAgICAvKiBSZWNlaXZlIGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX1NUQVRfQVJEWSAgICgxIDw8IDIpICAgICAgICAvKiBSZWdpc3RlciBhY2Nlc3MgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX1NUQVRfTkFDSyAgICgxIDw8IDEpICAgICAgICAvKiBObyBhY2tub3dsZWRnbWVudCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19TVEFUX0FMICAgICAoMSA8PCAwKSAgICAgICAgLyogQXJiaXRyYXRpb24gbG9zdCBpbnRlcnJ1cHQgZW5hYmxlICovCisKKworLyogSTJDIEludGVycnVwdCBDb2RlIFJlZ2lzdGVyIChJMkNfSU5UQ09ERSk6ICovCisKKyNkZWZpbmUgSTJDX0lOVENPREVfTUFTSyAgICAgICAgNworI2RlZmluZSBJMkNfSU5UQ09ERV9OT05FICAgICAgICAwCisjZGVmaW5lIEkyQ19JTlRDT0RFX0FMICAgICAgICAgIDEgICAgICAgLyogQXJiaXRyYXRpb24gbG9zdCAqLworI2RlZmluZSBJMkNfSU5UQ09ERV9OQUsgICAgICAgICAyICAgICAgIC8qIE5vIGFja25vd2xlZGdlbWVudC9nZW5lcmFsIGNhbGwgKi8KKyNkZWZpbmUgSTJDX0lOVENPREVfQVJEWSAgICAgICAgMyAgICAgICAvKiBSZWdpc3RlciBhY2Nlc3MgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX0lOVENPREVfUlJEWSAgICAgICAgNCAgICAgICAvKiBSY3YgZGF0YSByZWFkeSAqLworI2RlZmluZSBJMkNfSU5UQ09ERV9YUkRZICAgICAgICA1ICAgICAgIC8qIFhtaXQgZGF0YSByZWFkeSAqLworCisvKiBJMkMgQnVmZmVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKEkyQ19CVUYpOiAqLworCisjZGVmaW5lIEkyQ19CVUZfUkRNQV9FTiAgICAgICAgICgxIDw8IDE1KSAgICAgICAvKiBSZWNlaXZlIERNQSBjaGFubmVsIGVuYWJsZSAqLworI2RlZmluZSBJMkNfQlVGX1hETUFfRU4gICAgICAgICAoMSA8PCA3KSAgICAgICAgLyogVHJhbnNtaXQgRE1BIGNoYW5uZWwgZW5hYmxlICovCisKKy8qIEkyQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChJMkNfQ09OKTogKi8KKworI2RlZmluZSBJMkNfQ09OX0VOICAgICAgKDEgPDwgMTUpICAgICAgIC8qIEkyQyBtb2R1bGUgZW5hYmxlICovCisjZGVmaW5lIEkyQ19DT05fQkUgICAgICAoMSA8PCAxNCkgICAgICAgLyogQmlnIGVuZGlhbiBtb2RlICovCisjZGVmaW5lIEkyQ19DT05fU1RCICAgICAoMSA8PCAxMSkgICAgICAgLyogU3RhcnQgYnl0ZSBtb2RlIChtYXN0ZXIgbW9kZSBvbmx5KSAqLworI2RlZmluZSBJMkNfQ09OX01TVCAgICAgKDEgPDwgMTApICAgICAgIC8qIE1hc3Rlci9zbGF2ZSBtb2RlICovCisjZGVmaW5lIEkyQ19DT05fVFJYICAgICAoMSA8PCA5KSAgICAgICAgLyogVHJhbnNtaXR0ZXIvcmVjZWl2ZXIgbW9kZSAobWFzdGVyIG1vZGUgb25seSkgKi8KKyNkZWZpbmUgSTJDX0NPTl9YQSAgICAgICgxIDw8IDgpICAgICAgICAvKiBFeHBhbmQgYWRkcmVzcyAqLworI2RlZmluZSBJMkNfQ09OX1NUUCAgICAgKDEgPDwgMSkgICAgICAgIC8qIFN0b3AgY29uZGl0aW9uIChtYXN0ZXIgbW9kZSBvbmx5KSAqLworI2RlZmluZSBJMkNfQ09OX1NUVCAgICAgKDEgPDwgMCkgICAgICAgIC8qIFN0YXJ0IGNvbmRpdGlvbiAobWFzdGVyIG1vZGUgb25seSkgKi8KKworLyogSTJDIFN5c3RlbSBUZXN0IFJlZ2lzdGVyIChJMkNfU1lTVEVTVCk6ICovCisKKyNkZWZpbmUgSTJDX1NZU1RFU1RfU1RfRU4gICAgICAgKDEgPDwgMTUpICAgICAgIC8qIFN5c3RlbSB0ZXN0IGVuYWJsZSAqLworI2RlZmluZSBJMkNfU1lTVEVTVF9GUkVFICAgICAgICAoMSA8PCAxNCkgICAgICAgLyogRnJlZSBydW5uaW5nIG1vZGUgKG9uIGJyZWFrcG9pbnQpICovCisjZGVmaW5lIEkyQ19TWVNURVNUX1RNT0RFX01BU0sgICgzIDw8IDEyKSAgICAgICAvKiBUZXN0IG1vZGUgc2VsZWN0ICovCisjZGVmaW5lIEkyQ19TWVNURVNUX1RNT0RFX1NISUZUICgxMikgICAgICAgICAgICAvKiBUZXN0IG1vZGUgc2VsZWN0ICovCisjZGVmaW5lIEkyQ19TWVNURVNUX1NDTF9JICAgICAgICgxIDw8IDMpICAgICAgICAvKiBTQ0wgbGluZSBzZW5zZSBpbnB1dCB2YWx1ZSAqLworI2RlZmluZSBJMkNfU1lTVEVTVF9TQ0xfTyAgICAgICAoMSA8PCAyKSAgICAgICAgLyogU0NMIGxpbmUgZHJpdmUgb3V0cHV0IHZhbHVlICovCisjZGVmaW5lIEkyQ19TWVNURVNUX1NEQV9JICAgICAgICgxIDw8IDEpICAgICAgICAvKiBTREEgbGluZSBzZW5zZSBpbnB1dCB2YWx1ZSAqLworI2RlZmluZSBJMkNfU1lTVEVTVF9TREFfTyAgICAgICAoMSA8PCAwKSAgICAgICAgLyogU0RBIGxpbmUgZHJpdmUgb3V0cHV0IHZhbHVlICovCisKKyNkZWZpbmUgSTJDX1NDTExfU0NMTCAgICAgICAgKDApCisjZGVmaW5lIEkyQ19TQ0xMX1NDTExfTSAgICAgICgweEZGKQorI2RlZmluZSBJMkNfU0NMTF9IU1NDTEwgICAgICAoOCkKKyNkZWZpbmUgSTJDX1NDTEhfSFNTQ0xMX00gICAgKDB4RkYpCisjZGVmaW5lIEkyQ19TQ0xIX1NDTEggICAgICAgICgwKQorI2RlZmluZSBJMkNfU0NMSF9TQ0xIX00gICAgICAoMHhGRikKKyNkZWZpbmUgSTJDX1NDTEhfSFNTQ0xIICAgICAgKDgpCisjZGVmaW5lIEkyQ19TQ0xIX0hTU0NMSF9NICAgICgweEZGKQorCisjZGVmaW5lIE9NQVBfSTJDX1NUQU5EQVJEICAgICAgICAgIDEwMAorI2RlZmluZSBPTUFQX0kyQ19GQVNUX01PREUgICAgICAgICA0MDAKKyNkZWZpbmUgT01BUF9JMkNfSElHSF9TUEVFRCAgICAgICAgMzQwMAorCisjZGVmaW5lIFNZU1RFTV9DTE9DS18xMiAgICAgICAxMjAwMAorI2RlZmluZSBTWVNURU1fQ0xPQ0tfMTMgICAgICAgMTMwMDAKKyNkZWZpbmUgU1lTVEVNX0NMT0NLXzE5MiAgICAgIDE5MjAwCisjZGVmaW5lIFNZU1RFTV9DTE9DS185NiAgICAgICA5NjAwMAorCisjZGVmaW5lIEkyQ19JUF9DTEsgU1lTVEVNX0NMT0NLXzk2CisjZGVmaW5lIEkyQ19QU0NfTUFYICAgICAgICAgICgweDBmKQorI2RlZmluZSBJMkNfUFNDX01JTiAgICAgICAgICAoMHgwMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL21lbS5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9tZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDBiY2U1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9tZW0uaApAQCAtMCwwICsxLDU4NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX09NQVAzNFhYX01FTV9IXworI2RlZmluZSBfT01BUDM0WFhfTUVNX0hfCisKKyNkZWZpbmUgU0RSQ19DUzBfT1NFVCAgICAweDAKKyNkZWZpbmUgU0RSQ19DUzFfT1NFVCAgICAweDMwICAvKiBtaXJyb3IgQ1MxIHJlZ3MgYXBwZWFyIG9mZnNldCAweDMwIGZyb20gQ1MwICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3R5cGVkZWYgZW51bSB7CisJU1RBQ0tFRAkJPSAwLAorCUlQX0REUgkJPSAxLAorCUNPTUJPX0REUgk9IDIsCisJSVBfU0RSCSAJPSAzLAorfSBtZW1fdDsKKworCisvKiBNZW1vcnkgdGhhdCBjYW4gYmUgY29ubmVjdGVkIHRvIEdQTUMgKi8KKyNkZWZpbmUgR1BNQ19OT1IgICAgICAgICAgICAwCisjZGVmaW5lIEdQTUNfTkFORCAgICAgICAgICAgMQorI2RlZmluZSBHUE1DX01ET0MgICAgICAgICAgIDIKKyNkZWZpbmUgR1BNQ19PTkVOQU5EICAgICAgICAzCisjZGVmaW5lIE1NQ19OQU5ECQkJNAorI2RlZmluZSBNTUNfT05FTkFORAkJCTUKKyNkZWZpbmUgVVNCX1BFUklQSEVSQUwgICAgICA2CisKKyNlbmRpZgorCisvKiBzZXQgdGhlIDM0M3gtU0RSQyBpbmNvbWluZyBhZGRyZXNzIGNvbnZlbnRpb24gKi8KKyNpZiBkZWZpbmVkKFNEUkNfQl9SX0MpCisjZGVmaW5lIEJfQUxMCSgwIDw8IDYpCS8qIGJhbmstcm93LWNvbHVtbiAqLworI2VsaWYgZGVmaW5lZChTRFJDX0IxX1JfQjBfQykKKyNkZWZpbmUgQl9BTEwJKDEgPDwgNikJLyogYmFuazEtcm93LWJhbmswLWNvbHVtbiAqLworI2VsaWYgZGVmaW5lZChTRFJDX1JfQl9DKQorI2RlZmluZSBCX0FMTAkoMiA8PCA2KQkvKiByb3ctYmFuay1jb2x1bW4gKi8KKyNlbmRpZgorCisvKiBGdXR1cmUgbWVtb3J5IGNvbWJpbmF0aW9ucyBiYXNlZCBvbiBwYXN0ICovCisjZGVmaW5lIFNEUF9TRFJDX01EQ0ZHX01PTk9fRERSICAgIDB4MAorI2RlZmluZSBTRFBfQ09NQk9fTURDRkdfMF9ERFIgICAgICAweDAKKyNkZWZpbmUgU0RQX1NEUkNfTURDRkdfMF9TRFIgICAgICAgMHgwCisKKy8qIFNsb3dlciBmdWxsIGZyZXF1ZW5jeSByYW5nZSBkZWZhdWx0IHRpbWluZ3MgZm9yIHgzMiBvcGVyYXRpb24qLworI2RlZmluZSBTRFBfU0RSQ19TSEFSSU5HCQkweDAwMDAwMTAwCisjZGVmaW5lIFNEUF9TRFJDX01SXzBfU0RSCQkweDAwMDAwMDMxCisKKyNpZmRlZiBDT05GSUdfMzQzMFpFQlUKKyNkZWZpbmUgU0RQX1NEUkNfTURDRkdfMF9ERFIJKDB4MDI1ODIwMTl8Ql9BTEwpIC8qIEluZmluIGRkciBtb2R1bGUgKi8KKyNlbHNlCisjZGVmaW5lIFNEUF9TRFJDX01EQ0ZHXzBfRERSCSgweDAyNTg0MDE5fEJfQUxMKSAvKiBJbmZpbiBkZHIgbW9kdWxlICovCisjZW5kaWYKKworI2RlZmluZSBTRFBfU0RSQ19NUl8wX0REUgkJMHgwMDAwMDAzMgorCisvKiBEaWFibGluZyBwb3dlciBkb3duIG1vZGUgdXNpbmcgQ0tFIHBpbiAqLworI2RlZmluZSBTRFBfU0RSQ19QT1dFUl9QT1AgICAgICAweDAwMDAwMDgxCisKKy8qIG9wdGltaXplZCB0aW1pbmdzIGdvb2QgZm9yIGN1cnJlbnQgc2hpcHBpbmcgcGFydHMgKi8KKyNkZWZpbmUgU0RQXzM0MzBfU0RSQ19SRlJfQ1RSTF8xMDBNSHogICAweDAwMDJkYTAxCisjZGVmaW5lIFNEUF8zNDMwX1NEUkNfUkZSX0NUUkxfMTMzTUh6ICAgMHgwMDAzZGUwMSAvKiA3Ljh1cy83LjVucyAtIDUwPTB4M2RlICovCisjZGVmaW5lIFNEUF8zNDMwX1NEUkNfUkZSX0NUUkxfMTY1TUh6ICAgMHgwMDA0ZTIwMSAvKiA3Ljh1cy82bnMgLSA1MD0weDRlMiAqLworCisjZGVmaW5lIERMTF9PRkZTRVQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRExMX1dSSVRFRERSQ0xLWDJESVMgICAgMQorI2RlZmluZSBETExfRU5BRExMICAgICAgICAgICAgICAxCisjZGVmaW5lIERMTF9MT0NLRExMICAgICAgICAgICAgIDAKKyNkZWZpbmUgRExMX0RMTFBIQVNFXzcyICAgICAgICAgMAorI2RlZmluZSBETExfRExMUEhBU0VfOTAgICAgICAgICAxCisKKy8vIHJrdyAtIG5lZWQgdG8gZmluZCBvZiA5MC83MiBkZWdyZWUgcmVjb21tZW5kYXRpb24gZm9yIHNwZWVkIGxpa2UgYmVmb3JlLgorI2RlZmluZSBTRFBfU0RSQ19ETExBQl9DVFJMICgoRExMX0VOQURMTCA8PCAzKSB8IFwKKyAgICAoRExMX0xPQ0tETEwgPDwgMikgfCAoRExMX0RMTFBIQVNFXzkwIDw8IDEpKQorCisvKiBJbmZpbmVvbiBwYXJ0IG9mIDM0MzBTRFAgKDEzM01IeiBvcHRpbWl6ZWQpIH4gNy41bnMKKyAqCVREQUwgPSBUd3IvVGNrICsgVHJwL3RjayA9IDE1LzcuNSArIDIyLjUvNy41ID0gMiArIDMgPSA1CisgKglURFBMID0gMTUvNy41CT0gMgorICoJVFJSRCA9IDE1LzIuNQk9IDIKKyAqCVRSQ0QgPSAyMi41LzcuNQk9IDMKKyAqCVRSUCA9IDIyLjUvNy41CT0gMworICoJVFJBUyA9IDQ1LzcuNQk9IDYKKyAqCVRSQyA9IDY1LzcuNQk9IDguNi0+OQorICoJVFJGQyA9IDc1LzcuNQk9IDEwCisgKiAgIEFDVElNQgorICoJVENLRSA9IDIKKyAqCVhTUiA9IDEyMC83LjUgPSAxNgorICovCisjZGVmaW5lIElORklORU9OX1REQUxfMTMzICAgNQorI2RlZmluZSBJTkZJTkVPTl9URFBMXzEzMyAgIDIKKyNkZWZpbmUgSU5GSU5FT05fVFJSRF8xMzMgICAyCisjZGVmaW5lIElORklORU9OX1RSQ0RfMTMzICAgMworI2RlZmluZSBJTkZJTkVPTl9UUlBfMTMzICAgIDMKKyNkZWZpbmUgSU5GSU5FT05fVFJBU18xMzMgICA2CisjZGVmaW5lIElORklORU9OX1RSQ18xMzMgICAgOQorI2RlZmluZSBJTkZJTkVPTl9UUkZDXzEzMyAgMTAKKyNkZWZpbmUgSU5GSU5FT05fVl9BQ1RJTUFfMTMzICgoSU5GSU5FT05fVFJGQ18xMzMgPDwgMjcpIHwgKElORklORU9OX1RSQ18xMzMgPDwgMjIpIHwgKElORklORU9OX1RSQVNfMTMzIDw8IDE4KSBcCisJCXwoSU5GSU5FT05fVFJQXzEzMyA8PCAxNSkgfCAoSU5GSU5FT05fVFJDRF8xMzMgPDwgMTIpIHwoSU5GSU5FT05fVFJSRF8xMzMgPDwgOSkgfChJTkZJTkVPTl9URFBMXzEzMyA8PCA2KSBcCisJCXwgKElORklORU9OX1REQUxfMTMzKSkKKworI2RlZmluZSBJTkZJTkVPTl9UV1RSXzEzMyAgIDEKKyNkZWZpbmUgSU5GSU5FT05fVENLRV8xMzMgICAyCisjZGVmaW5lIElORklORU9OX1RYUF8xMzMgICAgMgorI2RlZmluZSBJTkZJTkVPTl9YU1JfMTMzICAgMTYKKyNkZWZpbmUgSU5GSU5FT05fVl9BQ1RJTUJfMTMzICgoSU5GSU5FT05fVENLRV8xMzMgPDwgMTIpIHwgKElORklORU9OX1hTUl8xMzMgPDwgMCkpIHwgXAorCQkJCShJTkZJTkVPTl9UWFBfMTMzIDw8IDgpIHwgKElORklORU9OX1RXVFJfMTMzIDw8IDE2KQorCisjZGVmaW5lIElORklORU9OX1ZfQUNUSU1BXzEwMCBJTkZJTkVPTl9WX0FDVElNQV8xMzMKKyNkZWZpbmUgSU5GSU5FT05fVl9BQ1RJTUJfMTAwIElORklORU9OX1ZfQUNUSU1CXzEzMworCisKKy8qIEluZmluZW9uIHBhcnQgb2YgMzQzMFNEUCAoMTY1TUh6IG9wdGltaXplZCkgNi4wNm5zCisgKiAgIEFDVElNQQorICoJVERBTCA9IFR3ci9UY2sgKyBUcnAvdGNrID0gMTUvNiArIDE4LzYgPSAyLjUgKyAzID0gNS41IC0+IDYKKyAqCVREUEwgKFR3cikgPSAxNS82CT0gMi41IC0+IDMKKyAqCVRSUkQgPSAxMi82CT0gMgorICoJVFJDRCA9IDE4LzYJPSAzCisgKglUUlAgPSAxOC82CT0gMworICoJVFJBUyA9IDQyLzYJPSA3CisgKglUUkMgPSA2MC82CT0gMTAKKyAqCVRSRkMgPSA3Mi82CT0gMTIKKyAqICAgQUNUSU1CCisgKglUQ0tFID0gMgorICoJWFNSID0gMTIwLzYgPSAyMAorICovCisjZGVmaW5lIElORklORU9OX1REQUxfMTY1ICAgNgorI2RlZmluZSBJTkZJTkVPTl9URFBMXzE2NSAgIDMKKyNkZWZpbmUgSU5GSU5FT05fVFJSRF8xNjUgICAyCisjZGVmaW5lIElORklORU9OX1RSQ0RfMTY1ICAgMworI2RlZmluZSBJTkZJTkVPTl9UUlBfMTY1ICAgIDMKKyNkZWZpbmUgSU5GSU5FT05fVFJBU18xNjUgICA3CisjZGVmaW5lIElORklORU9OX1RSQ18xNjUgICAxMAorI2RlZmluZSBJTkZJTkVPTl9UUkZDXzE2NSAgMTIKKyNkZWZpbmUgSU5GSU5FT05fVl9BQ1RJTUFfMTY1ICgoSU5GSU5FT05fVFJGQ18xNjUgPDwgMjcpIHwgKElORklORU9OX1RSQ18xNjUgPDwgMjIpIHwgKElORklORU9OX1RSQVNfMTY1IDw8IDE4KSBcCisJCXwgKElORklORU9OX1RSUF8xNjUgPDwgMTUpIHwgKElORklORU9OX1RSQ0RfMTY1IDw8IDEyKSB8KElORklORU9OX1RSUkRfMTY1IDw8IDkpIHwgXAorCQkoSU5GSU5FT05fVERQTF8xNjUgPDwgNikgfCAoSU5GSU5FT05fVERBTF8xNjUpKQorCisjZGVmaW5lIElORklORU9OX1RXVFJfMTY1ICAgMQorI2RlZmluZSBJTkZJTkVPTl9UQ0tFXzE2NSAgIDIKKyNkZWZpbmUgSU5GSU5FT05fVFhQXzE2NSAgICAyCisjZGVmaW5lIElORklORU9OX1hTUl8xNjUgICAgMjAKKyNkZWZpbmUgSU5GSU5FT05fVl9BQ1RJTUJfMTY1ICgoSU5GSU5FT05fVENLRV8xNjUgPDwgMTIpIHwgKElORklORU9OX1hTUl8xNjUgPDwgMCkpIHwgXAorCQkJCShJTkZJTkVPTl9UWFBfMTY1IDw8IDgpIHwgKElORklORU9OX1RXVFJfMTY1IDw8IDE2KQorCisvKiBNaWNyb24gcGFydCBvZiAzNDMwIEVWTSAoMTMzTUh6IG9wdGltaXplZCkgfiA3LjVucworICoJVERBTCA9IFR3ci9UY2sgKyBUcnAvdGNrID0gMTUvNy41ICsgMjIuNS83LjUgPSAyICsgMyA9IDUKKyAqCVREUEwgPSAgMTUvNy41ICAgPSAyCisgKglUUlJEID0gIDE1LzcuNSAgID0gMgorICoJVFJDRCA9ICAyMi41LzcuNSA9IDMKKyAqCVRSUCAgPSAgMjIuNS83LjUgPSAzCisgKglUUkFTID0gIDQ1LzcuNSAgID0gNgorICoJVFJDICA9ICA3NS83LjUgICA9IDEwCisgKglUUkZDID0gIDEyNS83LjUgID0gMTYuNi0+MTcKKyAqICAgQUNUSU1CCisgKglUV1RSID0gIDEKKyAqCVRDS0UgPSAgMQorICoJVFhTUiA9ICAxMzgvNy41ICA9IDE4LjMtPjE5CisgKglUWFAgID0gIDI1LzcuNSAgID0gMy4zLT40CisgKi8KKyNkZWZpbmUgTUlDUk9OX1REQUxfMTMzICAgNQorI2RlZmluZSBNSUNST05fVERQTF8xMzMgICAyCisjZGVmaW5lIE1JQ1JPTl9UUlJEXzEzMyAgIDIKKyNkZWZpbmUgTUlDUk9OX1RSQ0RfMTMzICAgMworI2RlZmluZSBNSUNST05fVFJQXzEzMyAgICAzCisjZGVmaW5lIE1JQ1JPTl9UUkFTXzEzMyAgIDYKKyNkZWZpbmUgTUlDUk9OX1RSQ18xMzMgICAgMTAKKyNkZWZpbmUgTUlDUk9OX1RSRkNfMTMzICAgMTcKKyNkZWZpbmUgTUlDUk9OX1ZfQUNUSU1BXzEzMyAoKE1JQ1JPTl9UUkZDXzEzMyA8PCAyNykgfCAoTUlDUk9OX1RSQ18xMzMgPDwgMjIpIHwgKE1JQ1JPTl9UUkFTXzEzMyA8PCAxOCkgXAorCQl8KE1JQ1JPTl9UUlBfMTMzIDw8IDE1KSB8IChNSUNST05fVFJDRF8xMzMgPDwgMTIpIHwoTUlDUk9OX1RSUkRfMTMzIDw8IDkpIHwoTUlDUk9OX1REUExfMTMzIDw8IDYpIFwKKwkJfCAoTUlDUk9OX1REQUxfMTMzKSkKKworI2RlZmluZSBNSUNST05fVFdUUl8xMzMgICAxCisjZGVmaW5lIE1JQ1JPTl9UQ0tFXzEzMyAgIDEKKyNkZWZpbmUgTUlDUk9OX1RYU1JfMTMzICAgMTkKKyNkZWZpbmUgTUlDUk9OX1RYUF8xMzMgICAgNAorI2RlZmluZSBNSUNST05fVl9BQ1RJTUJfMTMzICgoTUlDUk9OX1RXVFJfMTMzIDw8IDE2KSB8IChNSUNST05fVENLRV8xMzMgPDwgMTIpIHwgKE1JQ1JPTl9UWFBfMTMzIDw8IDgpIFwKKwkJfCAoTUlDUk9OX1RYU1JfMTMzIDw8IDApKQorCisjZGVmaW5lIE1JQ1JPTl9WX0FDVElNQV8xMDAgTUlDUk9OX1ZfQUNUSU1BXzEzMworI2RlZmluZSBNSUNST05fVl9BQ1RJTUJfMTAwIE1JQ1JPTl9WX0FDVElNQl8xMzMKKworLyogTWljcm9uIHBhcnQgb2YgMzQzMCBFVk0gKDE2NU1IeiBvcHRpbWl6ZWQpIDYuMDZucworICogICBBQ1RJTUEKKyAqCVREQUwgPSBUd3IvVGNrICsgVHJwL3RjayA9IDE1LzYgKyAxOCAvNiA9IDIuNSArIDMgPSA1LjUgLT4gNgorICoJVERQTCAoVHdyKSA9IDE1LzYJPSAyLjUgLT4gMworICoJVFJSRCA9IDEyLzYJPSAyCisgKglUUkNEID0gMTgvNiA9IDMKKyAqCVRSUCA9IDE4LzYJPSAzCisgKglUUkFTID0gNDIvNgk9IDcKKyAqCVRSQyA9IDYwLzYJPSAxMAorICoJVFJGQyA9IDEyNS82CT0gMjEKKyAqICAgQUNUSU1CCisgKglUV1RSID0gIDEKKyAqCVRDS0UgPSAgMQorICoJVFhTUiA9ICAxMzgvNiAgPSAyMworICoJVFhQICA9ICAyNS82ICAgPSA0LjEgfjUKKyAqLworI2RlZmluZSBNSUNST05fVERBTF8xNjUgICA2CisjZGVmaW5lIE1JQ1JPTl9URFBMXzE2NSAgIDMKKyNkZWZpbmUgTUlDUk9OX1RSUkRfMTY1ICAgMgorI2RlZmluZSBNSUNST05fVFJDRF8xNjUgICAzCisjZGVmaW5lIE1JQ1JPTl9UUlBfMTY1ICAgIDMKKyNkZWZpbmUgTUlDUk9OX1RSQVNfMTY1ICAgNworI2RlZmluZSBNSUNST05fVFJDXzE2NSAgIDEwCisjZGVmaW5lIE1JQ1JPTl9UUkZDXzE2NSAgMjEKKyNkZWZpbmUgTUlDUk9OX1ZfQUNUSU1BXzE2NSAoKE1JQ1JPTl9UUkZDXzE2NSA8PCAyNykgfCAoTUlDUk9OX1RSQ18xNjUgPDwgMjIpIHwgKE1JQ1JPTl9UUkFTXzE2NSA8PCAxOCkgXAorCQl8IChNSUNST05fVFJQXzE2NSA8PCAxNSkgfCAoTUlDUk9OX1RSQ0RfMTY1IDw8IDEyKSB8KE1JQ1JPTl9UUlJEXzE2NSA8PCA5KSB8IFwKKwkJKE1JQ1JPTl9URFBMXzE2NSA8PCA2KSB8IChNSUNST05fVERBTF8xNjUpKQorCisjZGVmaW5lIE1JQ1JPTl9UV1RSXzE2NSAgIDEKKyNkZWZpbmUgTUlDUk9OX1RDS0VfMTY1ICAgMQorI2RlZmluZSBNSUNST05fVFhQXzE2NSAgICA1CisjZGVmaW5lIE1JQ1JPTl9YU1JfMTY1ICAgIDIzCisjZGVmaW5lIE1JQ1JPTl9WX0FDVElNQl8xNjUgKChNSUNST05fVENLRV8xNjUgPDwgMTIpIHwgKE1JQ1JPTl9YU1JfMTY1IDw8IDApKSB8IFwKKwkJCQkoTUlDUk9OX1RYUF8xNjUgPDwgOCkgfCAoTUlDUk9OX1RXVFJfMTY1IDw8IDE2KQorCisKKworLyogSHluaXggcGFydCBvZiBBTS9ETTM3eEVWTSAoMjAwTUh6IG9wdGltaXplZCkKKyAqICAgQUNUSU1BCisgKglUREFMCQk9IDYKKyAqCVREUEwgKFR3cikJPSAzCisgKglUUlJECQk9IDIKKyAqCVRSQ0QJCT0gNAorICoJVFJQCQk9IDMKKyAqCVRSQVMJCT0gOAorICoJVFJDCQk9IDExCisgKglUUkZDCQk9IDE4CisgKiAgIEFDVElNQgorICoJVFdUUgkJPSAyCisgKglUQ0tFCQk9IDEKKyAqCVRYUAkJPSAxCisgKglUWFNSCQk9IDI4CisgKi8KKyNkZWZpbmUgSFlOSVhfVERBTF8yMDAJNgorI2RlZmluZSBIWU5JWF9URFBMXzIwMAkzCisjZGVmaW5lIEhZTklYX1RSUkRfMjAwCTIKKyNkZWZpbmUgSFlOSVhfVFJDRF8yMDAJNAorI2RlZmluZSBIWU5JWF9UUlBfMjAwCQkzCisjZGVmaW5lIEhZTklYX1RSQVNfMjAwCTgKKyNkZWZpbmUgSFlOSVhfVFJDXzIwMAkJMTEKKyNkZWZpbmUgSFlOSVhfVFJGQ18yMDAJMTgKKyNkZWZpbmUgSFlOSVhfVl9BQ1RJTUFfMjAwCSgoSFlOSVhfVFJGQ18yMDAgPDwgMjcpIHwgKEhZTklYX1RSQ18yMDAgPDwgMjIpIHwgXAorCQkJKEhZTklYX1RSQVNfMjAwIDw8IDE4KSB8IChIWU5JWF9UUlBfMjAwIDw8IDE1KSB8ICBcCisJCQkoSFlOSVhfVFJDRF8yMDAgPDwgMTIpIHwgKEhZTklYX1RSUkRfMjAwIDw8IDkpIHwgIFwKKwkJCShIWU5JWF9URFBMXzIwMCA8PCA2KSB8IChIWU5JWF9UREFMXzIwMCkpCisKKyNkZWZpbmUgSFlOSVhfVFdUUl8yMDAJMgorI2RlZmluZSBIWU5JWF9UQ0tFXzIwMAkxCisjZGVmaW5lIEhZTklYX1RYUF8yMDAJCTEKKyNkZWZpbmUgSFlOSVhfWFNSXzIwMAkJMjgKKyNkZWZpbmUgSFlOSVhfVl9BQ1RJTUJfMjAwCSgoKEhZTklYX1RDS0VfMjAwIDw8IDEyKSB8IChIWU5JWF9YU1JfMjAwIDw8IDApKSB8CVwKKwkJCShIWU5JWF9UWFBfMjAwIDw8IDgpIHwgKEhZTklYX1RXVFJfMjAwIDw8IDE2KSkKKworI2RlZmluZSBIWU5JWF9TRFJDX0FDVElNX0NUUkxBXzAJSFlOSVhfVl9BQ1RJTUFfMjAwCisjZGVmaW5lIEhZTklYX1NEUkNfQUNUSU1fQ1RSTEJfMAlIWU5JWF9WX0FDVElNQl8yMDAKKworCisKKy8qIE5ldyBhbmQgY29tcGF0YWJpbGl0eSBzcGVlZCBkZWZpbmVzICovCisjaWYgZGVmaW5lZChQUkNNX0NMS19DRkcyXzIwME1IWikgfHwgZGVmaW5lZChQUkNNX0NPTkZJR19JSSkgfHwgZGVmaW5lZChQUkNNX0NPTkZJR181QikKKyMgZGVmaW5lIEwzXzEwME1IWiAgIC8qIFVzZSB3aXRoIDw9IDEwME1IeiBTRFJBTSAqLworI2VsaWYgZGVmaW5lZCAoUFJDTV9DTEtfQ0ZHMl8yNjZNSFopIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfSUlJKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHXzVBKQorIyBkZWZpbmUgTDNfMTMzTUhaICAgIC8qIFVzZSB3aXRoIDw9IDEzM01IeiBTRFJBTSovCisjZWxpZiAgZGVmaW5lZChQUkNNX0NMS19DRkcyXzMzMk1IWikgfHwgZGVmaW5lZChQUkNNX0NPTkZJR19JKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHXzIpCisjIGRlZmluZSBMM18xNjVNSFogICAgLyogVXNlIHdpdGggPD0gMTY1TUh6IFNEUkFNIChMMz0xNjYgb24gMzQzMCkgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChMM18xMDBNSFopCisjIGRlZmluZSBNSUNST05fU0RSQ19BQ1RJTV9DVFJMQV8wICAgICBNSUNST05fVl9BQ1RJTUFfMTAwCisjIGRlZmluZSBNSUNST05fU0RSQ19BQ1RJTV9DVFJMQl8wICAgICBNSUNST05fVl9BQ1RJTUJfMTAwCisjZWxpZiBkZWZpbmVkKEwzXzEzM01IWikKKyMgZGVmaW5lIE1JQ1JPTl9TRFJDX0FDVElNX0NUUkxBXzAgICAgIE1JQ1JPTl9WX0FDVElNQV8xMzMKKyMgZGVmaW5lIE1JQ1JPTl9TRFJDX0FDVElNX0NUUkxCXzAgICAgIE1JQ1JPTl9WX0FDVElNQl8xMzMKKyNlbGlmICBkZWZpbmVkKEwzXzE2NU1IWikKKyMgZGVmaW5lIE1JQ1JPTl9TRFJDX0FDVElNX0NUUkxBXzAgICAgIE1JQ1JPTl9WX0FDVElNQV8xNjUKKyMgZGVmaW5lIE1JQ1JPTl9TRFJDX0FDVElNX0NUUkxCXzAgICAgIE1JQ1JPTl9WX0FDVElNQl8xNjUKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKEwzXzEwME1IWikKKyMgZGVmaW5lIElORklORU9OX1NEUkNfQUNUSU1fQ1RSTEFfMCAgICAgSU5GSU5FT05fVl9BQ1RJTUFfMTAwCisjIGRlZmluZSBJTkZJTkVPTl9TRFJDX0FDVElNX0NUUkxCXzAgICAgIElORklORU9OX1ZfQUNUSU1CXzEwMAorI2VsaWYgZGVmaW5lZChMM18xMzNNSFopCisjIGRlZmluZSBJTkZJTkVPTl9TRFJDX0FDVElNX0NUUkxBXzAgICAgIElORklORU9OX1ZfQUNUSU1BXzEzMworIyBkZWZpbmUgSU5GSU5FT05fU0RSQ19BQ1RJTV9DVFJMQl8wICAgICBJTkZJTkVPTl9WX0FDVElNQl8xMzMKKyNlbGlmICBkZWZpbmVkKEwzXzE2NU1IWikKKyMgZGVmaW5lIElORklORU9OX1NEUkNfQUNUSU1fQ1RSTEFfMCAgICAgSU5GSU5FT05fVl9BQ1RJTUFfMTY1CisjIGRlZmluZSBJTkZJTkVPTl9TRFJDX0FDVElNX0NUUkxCXzAgICAgIElORklORU9OX1ZfQUNUSU1CXzE2NQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEwzXzEwME1IWikKKyMgZGVmaW5lIFNEUF9TRFJDX1JGUl9DVFJMICAgICAgICAgIFNEUF8zNDMwX1NEUkNfUkZSX0NUUkxfMTAwTUh6CisjZWxpZiBkZWZpbmVkKEwzXzEzM01IWikKKyMgZGVmaW5lIFNEUF9TRFJDX1JGUl9DVFJMICAgICAgICAgIFNEUF8zNDMwX1NEUkNfUkZSX0NUUkxfMTMzTUh6CisjZWxpZiAgZGVmaW5lZChMM18xNjVNSFopCisjIGRlZmluZSBTRFBfU0RSQ19SRlJfQ1RSTCAgICAgICAgICBTRFBfMzQzMF9TRFJDX1JGUl9DVFJMXzE2NU1IegorI2VuZGlmCisKKy8qCisgKiBHUE1DIHNldHRpbmdzIC0KKyAqIERlZmluaXRpb25zIGlzIGFzIHBlciB0aGUgZm9sbG93aW5nIGZvcm1hdAorICogIyBkZWZpbmUgPFBBUlQ+X0dQTUNfQ09ORklHPHg+IDx2YWx1ZT4KKyAqIFdoZXJlOgorICogUEFSVCBpcyB0aGUgcGFydCBuYW1lIGUuZy4gU1ROT1IgLSBJbnRlbCBTdHJhdGEgRmxhc2gKKyAqIHggaXMgR1BNQyBjb25maWcgcmVnaXN0ZXJzIGZyb20gMSB0byA2ICh0aGVyZSB3aWxsIGJlIDYgbWFjcm9zKQorICogVmFsdWUgaXMgY29ycmVzcG9uZGluZyB2YWx1ZQorICoKKyAqIEZvciBldmVyeSB2YWxpZCBQUkNNIGNvbmZpZ3VyYXRpb24gdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIGRlZmluaXRpb24gb2YKKyAqIHRoZSBzYW1lLiBpZiB2YWx1ZXMgYXJlIGluZGVwZW5kZW50IG9mIHRoZSBib2FyZCwgdGhpcyBkZWZpbml0aW9uIHdpbGwgYmUKKyAqIHByZXNlbnQgaW4gdGhpcyBmaWxlIGlmIHZhbHVlcyBhcmUgZGVwZW5kZW50IG9uIHRoZSBib2FyZCwgdGhlbiB0aGlzIHNob3VsZAorICogZ28gaW50byBjb3JyZXNwb25kaW5nIG1lbS1ib2FyZE5hbWUuaCBmaWxlCisgKgorICogQ3VycmVudGx5IHZhbGlkIHBhcnQgTmFtZXMgYXJlIChQQVJUKToKKyAqIFNUTk9SIC0gSW50ZWwgU3RyYXRhIEZsYXNoCisgKiBTTU5BTkQgLSBTYW1zdW5nIE5BTkQKKyAqIE1fTkFORCAtIE1pY3JvbiBMYXJnZSBwYWdlIHgxNiBOQU5ECisgKiBNUERCIC0gSDQgTVBEQiBib2FyZAorICogU0JOT1IgLSBTaWJsZXkgTk9SCisgKiBPTk5BTkQgLSBTYW1zdW5nIE9uZSBOQU5ECisgKgorICogaW5jbHVkZS9jb25maWdzL2ZpbGUuaCBjb250YWlucyB0aGUgZGVmbiAtIGZvciBhbGwgQ1Mgd2UgYXJlIGludGVyZXN0ZWQKKyAqICNkZWZpbmUgT01BUDM0WFhfR1BNQ19DU3ggUEFSVAorICogI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTeF9TSVpFIFNpemUKKyAqICNkZWZpbmUgT01BUDM0WFhfR1BNQ19DU3hfTUFQIE1hcAorICogV2hlcmU6CisgKiB4IC0gQ1MgbnVtYmVyCisgKiBQQVJUIC0gUGFydCBOYW1lIGFzIGRlZmluZWQgYWJvdmUKKyAqIFNJWkUgLSBob3cgYmlnIGlzIHRoZSBtYXBwaW5nIHRvIGJlCisgKiAgIEdQTUNfU0laRV8xMjhNIC0gMHg4CisgKiAgIEdQTUNfU0laRV82NE0gIC0gMHhDCisgKiAgIEdQTUNfU0laRV8zMk0gIC0gMHhFCisgKiAgIEdQTUNfU0laRV8xNk0gIC0gMHhGCisgKiBNQVAgIC0gTWFwIHRoaXMgQ1MgdG8gd2hpY2ggYWRkcmVzcyhHUE1DIGFkZHJlc3Mgc3BhY2UpLSBBYnNvbHV0ZSBhZGRyZXNzCisgKiAgID4+MjQgYmVmb3JlIGJlaW5nIHVzZWQuCisgKi8KKyNkZWZpbmUgR1BNQ19TSVpFXzEyOE0gIDB4OAorI2RlZmluZSBHUE1DX1NJWkVfNjRNICAgMHhDCisjZGVmaW5lIEdQTUNfU0laRV8zMk0gICAweEUKKyNkZWZpbmUgR1BNQ19TSVpFXzE2TSAgIDB4RgorCisjaWYgZGVmaW5lZChMM18xMDBNSFopCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUcxIDB4MAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMiAweDAwMTQxNDAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUczIDB4MDAxNDE0MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzQgMHgwRjAxMEYwMQorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNSAweDAxMEMxNDE0CisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc2IDB4MDAwMDBBODAKKworI2lmIGRlZmluZWQgKENPTkZJR19PTUFQMzRYWCkKKworIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAxODAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcyIDB4MDAwOTA5MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzMgMHgwMDA5MDkwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNCAweDA3MDEwNzAyCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc1IDB4MDEwNTA5MDgKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzYgMHgxRjBGMDM4MAorCisjZWxpZiBkZWZpbmVkIChDT05GSUdfQU0zNTE3RVZNKSB8fCBkZWZpbmVkIChDT05GSUdfQU0zNTE3VEVCKQorCisjaWZkZWYgTkFORF8xNkJJVAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAxODAwCisjZWxzZQorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAwODAwCisjZW5kaWYKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzIgMHgwMDA4MDgwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMyAweDAwMDgwODAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc0IDB4MDYwMDA2MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzUgMHgwMDA3MDgwOAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNiAweDAwMDAwM2NmCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc3IDB4MDAwMDA4NDgKKworI2VuZGlmCisKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMSAgMHgzCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzIgIDB4MDAwZjBmMDEKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMyAgMHgwMDA1MDUwMgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc0ICAweDBDMDYwQzA2CisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzUgIDB4MDExMzFGMUYKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNiAgMHgwICAvKiAwPyAqLworIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzEgICAweDAwMDExMDAwCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMiAgIDB4MDAxRjFGMDAKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUczICAgMHgwMDA4MDgwMgorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzQgICAweDFDMDkxQzA5CisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNSAgIDB4MDMxQTFGMUYKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc2ICAgMHgwMDAwMDNDMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEwzXzEzM01IWikKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMDgwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMiAweDAwMTQxNDAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUczIDB4MDAxNDE0MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzQgMHgwRjAxMEYwMQorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNSAweDAxMEMxNDE0CisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc2IDB4MDAwMDBBODAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzcgMHgwMDAwMEM0NAorCisjaWYgZGVmaW5lZCAoQ09ORklHX09NQVAzNFhYKQorCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDE4MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzIgU01OQU5EX0dQTUNfQ09ORklHMgorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMyBTTU5BTkRfR1BNQ19DT05GSUczCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc0IFNNTkFORF9HUE1DX0NPTkZJRzQKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzUgU01OQU5EX0dQTUNfQ09ORklHNQorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNiBTTU5BTkRfR1BNQ19DT05GSUc2CisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc3IFNNTkFORF9HUE1DX0NPTkZJRzcKKworI2VsaWYgZGVmaW5lZCAoQ09ORklHX0FNMzUxN0VWTSkgfHwgZGVmaW5lZCAoQ09ORklHX0FNMzUxN1RFQikKKworI2lmZGVmIE5BTkRfMTZCSVQKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMTgwMAorI2Vsc2UKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMDgwMAorI2VuZGlmCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcyIDB4MDAwODA4MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzMgMHgwMDA4MDgwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNCAweDA2MDAwNjAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc1IDB4MDAwNzA4MDgKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzYgMHgwMDAwMDNjZgorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNyAweDAwMDAwODQ4CisKKyNlbmRpZgorCisKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMSAgMHgxMjAzCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzIgIDB4MDAxNTE1MDEKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMyAgMHgwMDA2MDYwMgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc0ICAweDEwMDgxMDA4CisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzUgIDB4MDExMzFGMUYKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNiAgMHgwMDAwMDRjNAorCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUcxICAweDEyMDAKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzIgIDB4MDAxZjFmMDAKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzMgIDB4MDAwODA4MDIKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzQgIDB4MUMwOTFDMDkKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzUgIDB4MDExMzFGMUYKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzYgIDB4MDAwMDAzQzIKKworIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzEgIDB4MDAwMTEwMDAKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUcyICAweDAwMWYxZjAxCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMyAgMHgwMDA4MDgwMworIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzQgIDB4MUMwOTFDMDkKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc1ICAweDA0MWYxRjFGCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNiAgMHgwMDAwMDRDNAorCisjIGRlZmluZSBQMl9HUE1DX0NPTkZJRzEgIDB4MAorIyBkZWZpbmUgUDJfR1BNQ19DT05GSUcyICAweDAKKyMgZGVmaW5lIFAyX0dQTUNfQ09ORklHMyAgMHgwCisjIGRlZmluZSBQMl9HUE1DX0NPTkZJRzQgIDB4MAorIyBkZWZpbmUgUDJfR1BNQ19DT05GSUc1ICAweDAKKyMgZGVmaW5lIFAyX0dQTUNfQ09ORklHNiAgMHgwCisKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDEyMDAKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUcyIDB4MDAwYzBjMDEKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUczIDB4MDAwMzAzMDEKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUc0IDB4MGMwNDBjMDQKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUc1IDB4MDEwQzEwMTAKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUc2IDB4MDAwMDAwMDAKKworI2VuZGlmIC8qIGVuZGlmIEwzXzEzM01IWiAqLworCisjaWYgZGVmaW5lZCAoTDNfMTY1TUhaKQorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAwODAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUcyIDB4MDAxNDE0MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzMgMHgwMDE0MTQwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNCAweDBGMDEwRjAxCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc1IDB4MDEwQzE0MTQKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzYgMHgxRjBGMEE4MAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNyAweDAwMDAwQzQ0CisKKyNpZiBkZWZpbmVkIChDT05GSUdfT01BUDM0WFgpCisKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMTgwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMiBTTU5BTkRfR1BNQ19DT05GSUcyCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUczIFNNTkFORF9HUE1DX0NPTkZJRzMKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzQgU01OQU5EX0dQTUNfQ09ORklHNAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNSBTTU5BTkRfR1BNQ19DT05GSUc1CisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc2IFNNTkFORF9HUE1DX0NPTkZJRzYKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzcgU01OQU5EX0dQTUNfQ09ORklHNworCisjZWxpZiBkZWZpbmVkIChDT05GSUdfQU0zNTE3RVZNKSB8fCBkZWZpbmVkIChDT05GSUdfQU0zNTE3VEVCKQorCisjaWZkZWYgTkFORF8xNkJJVAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAxODAwCisjZWxzZQorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAwODAwCisjZW5kaWYKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzIgMHgwMDA4MDgwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMyAweDAwMDgwODAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc0IDB4MDYwMDA2MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzUgMHgwMDA3MDgwOAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNiAweDAwMDAwM2NmCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc3IDB4MDAwMDA4NDgKKworI2VuZGlmCisKKworIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUcxICAweDMKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMiAgMHgwMDE1MTUwMQorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUczICAweDAwMDYwNjAyCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzQgIDB4MTEwOTExMDkKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNSAgMHgwMTE0MUYxRgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc2ICAweDAwMDAwNGM0CisKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzEgIDB4MTIwMAorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHMiAgMHgwMDFmMWYwMAorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHMyAgMHgwMDA4MDgwMgorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHNCAgMHgxQzA5MUMwOQorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHNSAgMHgwMTEzMUYxRgorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHNiAgMHgxRjBGMDNDMgorCisjIGRlZmluZSBTRFBWMl9NUERCX0dQTUNfQ09ORklHMSAgMHgwMDYxMTIwMAorIyBkZWZpbmUgU0RQVjJfTVBEQl9HUE1DX0NPTkZJRzIgIDB4MDAxRjFGMDEKKyMgZGVmaW5lIFNEUFYyX01QREJfR1BNQ19DT05GSUczICAweDAwMDgwODAzCisjIGRlZmluZSBTRFBWMl9NUERCX0dQTUNfQ09ORklHNCAgMHgxRDA5MUQwOQorIyBkZWZpbmUgU0RQVjJfTVBEQl9HUE1DX0NPTkZJRzUgIDB4MDQxRDFGMUYKKyMgZGVmaW5lIFNEUFYyX01QREJfR1BNQ19DT05GSUc2ICAweDFEMDkwNEM0CisKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUcxICAweDAwMDExMDAwCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMiAgMHgwMDFmMWYwMQorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzMgIDB4MDAwODA4MDMKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc0ICAweDFjMGIxYzBhCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNSAgMHgwNDFmMUYxRgorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzYgIDB4MUYwRjA0QzQKKworIyBkZWZpbmUgUDJfR1BNQ19DT05GSUcxICAweDAKKyMgZGVmaW5lIFAyX0dQTUNfQ09ORklHMiAgMHgwCisjIGRlZmluZSBQMl9HUE1DX0NPTkZJRzMgIDB4MAorIyBkZWZpbmUgUDJfR1BNQ19DT05GSUc0ICAweDAKKyMgZGVmaW5lIFAyX0dQTUNfQ09ORklHNSAgMHgwCisjIGRlZmluZSBQMl9HUE1DX0NPTkZJRzYgIDB4MAorCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHMSAweDAwMDAxMjAwCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHMiAweDAwMEYwRjAxCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHMyAweDAwMDMwMzAxCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHNCAweDBGMDQwRjA0CisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHNSAweDAxMEYxMDEwCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHNiAweDFGMDYwMDAwCisKKyNlbmRpZgorCisvKiBtYXggbnVtYmVyIG9mIEdQTUMgQ2hpcCBTZWxlY3RzICovCisjZGVmaW5lIEdQTUNfTUFYX0NTICAgIDgKKy8qIG1heCBudW1iZXIgb2YgR1BNQyByZWdzICovCisjZGVmaW5lIEdQTUNfTUFYX1JFRyAgIDcKKworI2RlZmluZSBQSVNNTzFfTk9SICAgICAgIDEKKyNkZWZpbmUgUElTTU8xX05BTkQgICAgICAyCisjZGVmaW5lIFBJU01PMl9DUzAgIDMKKyNkZWZpbmUgUElTTU8yX0NTMSAgNAorI2RlZmluZSBQSVNNTzFfT05FTkFORCAgNQorI2RlZmluZSBQT1BfT05FTkFORAk1CisjZGVmaW5lIERCR19NUERCICAgICAgIDYKKyNkZWZpbmUgUElTTU8yX05BTkRfQ1MwIDcKKyNkZWZpbmUgUElTTU8yX05BTkRfQ1MxIDgKKworLyogbWFrZSBpdCByZWFkYWJsZSBmb3IgdGhlIGdwbWNfaW5pdCAqLworI2RlZmluZSBQSVNNTzFfTk9SX0JBU0UJCUZMQVNIX0JBU0UKKyNkZWZpbmUgUElTTU8xX05BTkRfQkFTRQlOQU5EX0JBU0UKKyNkZWZpbmUgUElTTU8yX0NTMF9CQVNFCQlQSVNNTzJfTUFQMQorI2RlZmluZSBQSVNNTzFfT05FTl9CQVNFCU9ORU5BTkRfTUFQCisjZGVmaW5lIFBPUF9PTkVOX0JBU0UJCU9ORU5BTkRfTUFQCisjZGVmaW5lIERCR19NUERCX0JBU0UJCURFQlVHX0JBU0UKKworI2VuZGlmIC8qIGVuZGlmIF9PTUFQMzRYWF9NRU1fSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbW1jLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL21tYy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiY2ViNWYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL21tYy5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvbW1jL21tY19weGEuaAorICoKKyAqICBBdXRob3I6IFZsYWRpbWlyIFNoZWJvcmRhZXYsIElnb3IgT2JsYWtvdgorICogIENvcHlyaWdodDogIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqICAkSWQ6IG1tY19weGEuaCx2IDAuMy4xLjYgMjAwMi8wOS8yNSAxOToyNTo0OCB0ZWQgRXhwIHRlZCAkCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2lmbmRlZiBfX01NQ19QWEFfUF9IX18KKyNkZWZpbmUgX19NTUNfUFhBX1BfSF9fCisKKy8qIFBYQS0yNTAgTU1DIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCisKKy8qIE1NQ19TVFJQQ0wgKi8KKyNkZWZpbmUgTU1DX1NUUlBDTF9TVE9QX0NMSyAgICAgCSgweDAwMDFVTCkKKyNkZWZpbmUgTU1DX1NUUlBDTF9TVEFSVF9DTEsJCSgweDAwMDJVTCkKKworLyogTU1DX1NUQVQgKi8KKworI2RlZmluZSBNTUNfU1RBVF9FUlJPUlMgKE1NQ19TVEFUX1JFU19DUkNfRVJST1IgfCBNTUNfU1RBVF9TUElfUkVBRF9FUlJPUl9UT0tFTlwKKwl8IE1NQ19TVEFUX0NSQ19SRUFEX0VSUk9SIHwgTU1DX1NUQVRfVElNRV9PVVRfUkVTUE9OU0UgXAorCXwgTU1DX1NUQVRfUkVBRF9USU1FX09VVCB8IE1NQ19TVEFUX0NSQ19XUklURV9FUlJPUikKKworLyogTU1DX0NMS1JUICovCisjZGVmaW5lIE1NQ19DTEtSVF8yME1IWgkgCQkoMHgwMDAwVUwpCisjZGVmaW5lIE1NQ19DTEtSVF8xME1IWgkgCQkoMHgwMDAxVUwpCisjZGVmaW5lIE1NQ19DTEtSVF81TUhaCSAgCQkoMHgwMDAyVUwpCisjZGVmaW5lIE1NQ19DTEtSVF8yXzVNSFoJCSgweDAwMDNVTCkKKyNkZWZpbmUgTU1DX0NMS1JUXzFfMjVNSFogICAgICAgCSgweDAwMDRVTCkKKyNkZWZpbmUgTU1DX0NMS1JUXzBfNjI1TUhaICAgICAgCSgweDAwMDVVTCkKKyNkZWZpbmUgTU1DX0NMS1JUXzBfMzEyNU1IWiAgICAgCSgweDAwMDZVTCkKKworLyogTU1DX1NQSSAqLworI2RlZmluZSBNTUNfU1BJX0RJU0FCTEUJIAkJKDB4MDBVTCkKKyNkZWZpbmUgTU1DX1NQSV9FTgkgIAkJKDB4MDFVTCkKKyNkZWZpbmUgTU1DX1NQSV9DU19FTgkgICAJCSgweDAxVUwgPDwgMikKKyNkZWZpbmUgTU1DX1NQSV9DU19BRERSRVNTICAgICAgCSgweDAxVUwgPDwgMykKKyNkZWZpbmUgTU1DX1NQSV9DUkNfT04JICAJCSgweDAxVUwgPDwgMSkKKworLyogTU1DX0NNREFUICovCisjZGVmaW5lIE1NQ19DTURBVF9NTUNfRE1BX0VOCQkoMHgwMDAxVUwgPDwgNykKKyNkZWZpbmUgTU1DX0NNREFUX0lOSVQJICAJCSgweDAwMDFVTCA8PCA2KQorI2RlZmluZSBNTUNfQ01EQVRfQlVTWQkgIAkJKDB4MDAwMVVMIDw8IDUpCisjZGVmaW5lIE1NQ19DTURBVF9TVFJFQU0JCSgweDAwMDFVTCA8PCA0KQorI2RlZmluZSBNTUNfQ01EQVRfQkxPQ0sJIAkJKDB4MDAwMFVMIDw8IDQpCisjZGVmaW5lIE1NQ19DTURBVF9XUklURQkgCQkoMHgwMDAxVUwgPDwgMykKKyNkZWZpbmUgTU1DX0NNREFUX1JFQUQJICAJCSgweDAwMDBVTCA8PCAzKQorI2RlZmluZSBNTUNfQ01EQVRfREFUQV9FTiAgICAgICAJKDB4MDAwMVVMIDw8IDIpCisjZGVmaW5lIE1NQ19DTURBVF9SMQkgICAgCQkoMHgwMDAxVUwpCisjZGVmaW5lIE1NQ19DTURBVF9SMgkgICAgCQkoMHgwMDAyVUwpCisjZGVmaW5lIE1NQ19DTURBVF9SMwkgICAgCQkoMHgwMDAzVUwpCisKKy8qIE1NQ19SRVNUTyAqLworI2RlZmluZSBNTUNfUkVTX1RPX01BWAkgIAkJKDB4MDA3ZlVMKSAvKiBbNjowXSAqLworCisvKiBNTUNfUkRUTyAqLworI2RlZmluZSBNTUNfUkVBRF9UT19NQVgJIAkJKDB4MGZmZmZVTCkgLyogWzE1OjBdICovCisKKy8qIE1NQ19CTEtMRU4gKi8KKyNkZWZpbmUgTU1DX0JMS19MRU5fTUFYCSAJCSgweDAzZmZVTCkgLyogWzk6MF0gKi8KKworLyogTU1DX1BSVEJVRiAqLworI2RlZmluZSBNTUNfUFJUQlVGX0JVRl9QQVJUX0ZVTEwgICAgICAgCSgweDAxVUwpCisjZGVmaW5lIE1NQ19QUlRCVUZfQlVGX0ZVTEwJCSgweDAwVUwpCisKKy8qIE1NQ19JX01BU0sgKi8KKyNkZWZpbmUgTU1DX0lfTUFTS19UWEZJRk9fV1JfUkVRCSgweDAxVUwgPDwgNikKKyNkZWZpbmUgTU1DX0lfTUFTS19SWEZJRk9fUkRfUkVRCSgweDAxVUwgPDwgNSkKKyNkZWZpbmUgTU1DX0lfTUFTS19DTEtfSVNfT0ZGCSAgIAkoMHgwMVVMIDw8IDQpCisjZGVmaW5lIE1NQ19JX01BU0tfU1RPUF9DTUQJIAkoMHgwMVVMIDw8IDMpCisjZGVmaW5lIE1NQ19JX01BU0tfRU5EX0NNRF9SRVMJICAJKDB4MDFVTCA8PCAyKQorI2RlZmluZSBNTUNfSV9NQVNLX1BSR19ET05FCSAJKDB4MDFVTCA8PCAxKQorI2RlZmluZSBNTUNfSV9NQVNLX0RBVEFfVFJBTl9ET05FICAgICAgICgweDAxVUwpCisjZGVmaW5lIE1NQ19JX01BU0tfQUxMCSAgICAgIAkJKDB4MDdmVUwpCisKKworLyogTU1DX0lfUkVHICovCisjZGVmaW5lIE1NQ19JX1JFR19UWEZJRk9fV1JfUkVRICAgICAJKDB4MDFVTCA8PCA2KQorI2RlZmluZSBNTUNfSV9SRUdfUlhGSUZPX1JEX1JFUSAgICAgCSgweDAxVUwgPDwgNSkKKyNkZWZpbmUgTU1DX0lfUkVHX0NMS19JU19PRkYJCSgweDAxVUwgPDwgNCkKKyNkZWZpbmUgTU1DX0lfUkVHX1NUT1BfQ01EICAgICAgCSgweDAxVUwgPDwgMykKKyNkZWZpbmUgTU1DX0lfUkVHX0VORF9DTURfUkVTICAgICAgIAkoMHgwMVVMIDw8IDIpCisjZGVmaW5lIE1NQ19JX1JFR19QUkdfRE9ORSAgICAgIAkoMHgwMVVMIDw8IDEpCisjZGVmaW5lIE1NQ19JX1JFR19EQVRBX1RSQU5fRE9ORSAgICAJKDB4MDFVTCkKKyNkZWZpbmUgTU1DX0lfUkVHX0FMTAkgICAJCSgweDAwN2ZVTCkKKworLyogTU1DX0NNRCAqLworI2RlZmluZSBNTUNfQ01EX0lOREVYX01BWCAgICAgICAJKDB4MDA2ZlVMKSAgLyogWzU6MF0gKi8KKyNkZWZpbmUgQ01EKHgpICAoeCkKKworI2RlZmluZSBNTUNfREVGQVVMVF9SQ0EJCQkxCisKKyNkZWZpbmUgTU1DX0JMT0NLX1NJWkUJCQk1MTIKKyNkZWZpbmUgTU1DX0NNRF9SRVNFVAkJCTAKKyNkZWZpbmUgTU1DX0NNRF9TRU5EX09QX0NPTkQJCTEKKyNkZWZpbmUgTU1DX0NNRF9BTExfU0VORF9DSUQgCQkyCisjZGVmaW5lIE1NQ19DTURfU0VUX1JDQQkJCTMKKyNkZWZpbmUgTU1DX0NNRF9TRU5EX0NTRCAJCTkKKyNkZWZpbmUgTU1DX0NNRF9TRU5EX0NJRCAJCTEwCisjZGVmaW5lIE1NQ19DTURfU0VORF9TVEFUVVMJCTEzCisjZGVmaW5lIE1NQ19DTURfU0VUX0JMT0NLTEVOCQkxNgorI2RlZmluZSBNTUNfQ01EX1JFQURfQkxPQ0sJCTE3CisjZGVmaW5lIE1NQ19DTURfUkRfQkxLX01VTFRJCQkxOAorI2RlZmluZSBNTUNfQ01EX1dSSVRFX0JMT0NLCQkyNAorCisjZGVmaW5lIE1NQ19NQVhfQkxPQ0tfU0laRQkJNTEyCisKKyNkZWZpbmUgTU1DX1IxX0lETEVfU1RBVEUJCTB4MDEKKyNkZWZpbmUgTU1DX1IxX0VSQVNFX1NUQVRFCQkweDAyCisjZGVmaW5lIE1NQ19SMV9JTExFR0FMX0NNRAkJMHgwNAorI2RlZmluZSBNTUNfUjFfQ09NX0NSQ19FUlIJCTB4MDgKKyNkZWZpbmUgTU1DX1IxX0VSQVNFX1NFUV9FUlIJCTB4MDEKKyNkZWZpbmUgTU1DX1IxX0FERFJfRVJSCQkJMHgwMgorI2RlZmluZSBNTUNfUjFfUEFSQU1fRVJSCQkweDA0CisKKyNkZWZpbmUgTU1DX1IxQl9XUF9FUkFTRV9TS0lQCQkweDAwMDIKKyNkZWZpbmUgTU1DX1IxQl9FUlIJCQkweDAwMDQKKyNkZWZpbmUgTU1DX1IxQl9DQ19FUlIJCQkweDAwMDgKKyNkZWZpbmUgTU1DX1IxQl9DQVJEX0VDQ19FUlIJCTB4MDAxMAorI2RlZmluZSBNTUNfUjFCX1dQX1ZJT0xBVElPTgkJMHgwMDIwCisjZGVmaW5lIE1NQ19SMUJfRVJBU0VfUEFSQU0JCTB4MDA0MAorI2RlZmluZSBNTUNfUjFCX09PUgkJCTB4MDA4MAorI2RlZmluZSBNTUNfUjFCX0lETEVfU1RBVEUJCTB4MDEwMAorI2RlZmluZSBNTUNfUjFCX0VSQVNFX1JFU0VUCQkweDAyMDAKKyNkZWZpbmUgTU1DX1IxQl9JTExFR0FMX0NNRAkJMHgwNDAwCisjZGVmaW5lIE1NQ19SMUJfQ09NX0NSQ19FUlIJCTB4MDgwMAorI2RlZmluZSBNTUNfUjFCX0VSQVNFX1NFUV9FUlIJCTB4MTAwMAorI2RlZmluZSBNTUNfUjFCX0FERFJfRVJSCQkweDIwMDAKKyNkZWZpbmUgTU1DX1IxQl9QQVJBTV9FUlIJCTB4NDAwMAorCit0eXBlZGVmIHN0cnVjdCBtbWNfY2lkIHsKKy8qIEZJWE1FOiBCWVRFX09SREVSICovCisJdW5zaWduZWQgY2hhciB5ZWFyOjQsCisJCW1vbnRoOjQ7CisJdW5zaWduZWQgY2hhciBzblszXTsKKwl1bnNpZ25lZCBjaGFyIGZ3cmV2OjQsCisJCWh3cmV2OjQ7CisJdW5zaWduZWQgY2hhciBuYW1lWzZdOworCXVuc2lnbmVkIGNoYXIgaWRbM107Cit9IG1tY19jaWRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbW1jX2NzZAoreworCXVuc2lnbmVkIGNoYXIJZWNjOjIsCisJCWZpbGVfZm9ybWF0OjIsCisJCXRtcF93cml0ZV9wcm90ZWN0OjEsCisJCXBlcm1fd3JpdGVfcHJvdGVjdDoxLAorCQljb3B5OjEsCisJCWZpbGVfZm9ybWF0X2dycDoxOworCXVuc2lnbmVkIGxvbmcgaW50IGNvbnRlbnRfcHJvdF9hcHA6MSwKKwkJcnN2ZDM6NCwKKwkJd3JpdGVfYmxfcGFydGlhbDoxLAorCQl3cml0ZV9ibF9sZW46NCwKKwkJcjJ3X2ZhY3RvcjozLAorCQlkZWZhdWx0X2VjYzoyLAorCQl3cF9ncnBfZW5hYmxlOjEsCisJCXdwX2dycF9zaXplOjUsCisJCWVyYXNlX2dycF9tdWx0OjUsCisJCWVyYXNlX2dycF9zaXplOjUsCisJCWNfc2l6ZV9tdWx0MTozLAorCQl2ZGRfd19jdXJyX21heDozLAorCQl2ZGRfd19jdXJyX21pbjozLAorCQl2ZGRfcl9jdXJyX21heDozLAorCQl2ZGRfcl9jdXJyX21pbjozLAorCQljX3NpemU6MTIsCisJCXJzdmQyOjIsCisJCWRzcl9pbXA6MSwKKwkJcmVhZF9ibGtfbWlzYWxpZ246MSwKKwkJd3JpdGVfYmxrX21pc2FsaWduOjEsCisJCXJlYWRfYmxfcGFydGlhbDoxOworCisJdW5zaWduZWQgc2hvcnQJcmVhZF9ibF9sZW46NCwKKwkJY2NjOjEyOworCXVuc2lnbmVkIGNoYXIJdHJhbl9zcGVlZDsKKwl1bnNpZ25lZCBjaGFyCW5zYWM7CisJdW5zaWduZWQgY2hhcgl0YWFjOworCXVuc2lnbmVkIGNoYXIJcnN2ZDE6MiwKKyAgCQlzcGVjX3ZlcnM6NCwKKwkJY3NkX3N0cnVjdHVyZToyOworfSBtbWNfY3NkX3Q7CisKKworI2VuZGlmIC8qIF9fTU1DX1BYQV9QX0hfXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9tdXguaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwMWM3MwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbXV4LmgKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYtMjAwOAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogU3llZCBNb2hhbW1lZCBLaGFzaW0gPHgwa2hhc2ltQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfTVVYX0hfCisjZGVmaW5lIF9NVVhfSF8KKworLyoKKyAqIElFTiAgLSBJbnB1dCBFbmFibGUKKyAqIElESVMgLSBJbnB1dCBEaXNhYmxlCisgKiBQVEQgIC0gUHVsbCB0eXBlIERvd24KKyAqIFBUVSAgLSBQdWxsIHR5cGUgVXAKKyAqIERJUyAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGluYWN0aXZlCisgKiBFTiAgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBhY3RpdmUKKyAqIE0wICAgLSBNb2RlIDAKKyAqLworCisjZGVmaW5lIElFTgkoMSA8PCA4KQorCisjZGVmaW5lIElESVMJKDAgPDwgOCkKKyNkZWZpbmUgUFRVCSgxIDw8IDQpCisjZGVmaW5lIFBURAkoMCA8PCA0KQorI2RlZmluZSBFTgkoMSA8PCAzKQorI2RlZmluZSBESVMJKDAgPDwgMykKKworI2RlZmluZSBNMAkwCisjZGVmaW5lIE0xCTEKKyNkZWZpbmUgTTIJMgorI2RlZmluZSBNMwkzCisjZGVmaW5lIE00CTQKKyNkZWZpbmUgTTUJNQorI2RlZmluZSBNNgk2CisjZGVmaW5lIE03CTcKKworLyoKKyAqIFRvIGdldCB0aGUgYWN0dWFsIGFkZHJlc3MgdGhlIG9mZnNldCBoYXMgdG8gYWRkZWQKKyAqIHdpdGggT01BUDM0WFhfQ1RSTF9CQVNFIHRvIGdldCB0aGUgYWN0dWFsIGFkZHJlc3MKKyAqLworCisvKlNEUkMqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMAkJMHgwMDMwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QxCQkweDAwMzIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDIJCTB4MDAzNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMwkJMHgwMDM2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0Q0CQkweDAwMzgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDUJCTB4MDAzQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19ENgkJMHgwMDNDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0Q3CQkweDAwM0UKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDgJCTB4MDA0MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EOQkJMHgwMDQyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QxMAkweDAwNDQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDExCTB4MDA0NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMTIJMHgwMDQ4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QxMwkweDAwNEEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDE0CTB4MDA0QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMTUJMHgwMDRFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QxNgkweDAwNTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDE3CTB4MDA1MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMTgJMHgwMDU0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QxOQkweDAwNTYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDIwCTB4MDA1OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMjEJMHgwMDVBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QyMgkweDAwNUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDIzCTB4MDA1RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMjQJMHgwMDYwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QyNQkweDAwNjIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDI2CTB4MDA2NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMjcJMHgwMDY2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QyOAkweDAwNjgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDI5CTB4MDA2QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMzAJMHgwMDZDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QzMQkweDAwNkUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfQ0xLCTB4MDA3MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EUVMwCTB4MDA3MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EUVMxCTB4MDA3NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EUVMyCTB4MDA3NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EUVMzCTB4MDA3OAorLypHUE1DKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfQTEJCTB4MDA3QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19BMgkJMHgwMDdDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0EzCQkweDAwN0UKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfQTQJCTB4MDA4MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19BNQkJMHgwMDgyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0E2CQkweDAwODQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfQTcJCTB4MDA4NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19BOAkJMHgwMDg4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0E5CQkweDAwOEEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfQTEwCTB4MDA4QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19EMAkJMHgwMDhFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0QxCQkweDAwOTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDIJCTB4MDA5MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19EMwkJMHgwMDk0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0Q0CQkweDAwOTYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDUJCTB4MDA5OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19ENgkJMHgwMDlBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0Q3CQkweDAwOUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDgJCTB4MDA5RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19EOQkJMHgwMEEwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0QxMAkweDAwQTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDExCTB4MDBBNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19EMTIJMHgwMEE2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0QxMwkweDAwQTgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDE0CTB4MDBBQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19EMTUJMHgwMEFDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05DUzAJMHgwMEFFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05DUzEJMHgwMEIwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05DUzIJMHgwMEIyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05DUzMJMHgwMEI0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05DUzQJMHgwMEI2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05DUzUJMHgwMEI4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05DUzYJMHgwMEJBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05DUzcJMHgwMEJDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0NMSwkweDAwQkUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTkFEVl9BTEUJMHgwMEMwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05PRQkweDAwQzIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTldFCTB4MDBDNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OQkUwX0NMRQkweDAwQzYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTkJFMQkweDAwQzgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTldQCTB4MDBDQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19XQUlUMAkweDAwQ0MKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfV0FJVDEJMHgwMENFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX1dBSVQyCTB4MDBEMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19XQUlUMwkweDAwRDIKKy8qRFNTKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19QQ0xLCTB4MDBENAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0hTWU5DCTB4MDBENgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX1ZTWU5DCTB4MDBEOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0FDQklBUwkweDAwREEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMAkweDAwREMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMQkweDAwREUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMgkweDAwRTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMwkweDAwRTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBNAkweDAwRTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBNQkweDAwRTYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBNgkweDAwRTgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBNwkweDAwRUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBOAkweDAwRUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBOQkweDAwRUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTAJMHgwMEYwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTExCTB4MDBGMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEExMgkweDAwRjQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTMJMHgwMEY2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTE0CTB4MDBGOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEExNQkweDAwRkEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTYJMHgwMEZDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTE3CTB4MDBGRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEExOAkweDAxMDAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTkJMHgwMTAyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTIwCTB4MDEwNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEEyMQkweDAxMDYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMjIJMHgwMTA4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTIzCTB4MDEwQQorLypDQU1FUkEqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0hTCQkweDAxMEMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9WUwkJMHgwMTBFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fWENMS0EJMHgwMTEwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fUENMSwkweDAxMTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9GTEQJCTB4MDExNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0QwCQkweDAxMTYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9EMQkJMHgwMTE4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRDIJCTB4MDExQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0QzCQkweDAxMUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9ENAkJMHgwMTFFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRDUJCTB4MDEyMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0Q2CQkweDAxMjIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9ENwkJMHgwMTI0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRDgJCTB4MDEyNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0Q5CQkweDAxMjgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9EMTAJCTB4MDEyQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0QxMQkJMHgwMTJDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fWENMS0IJMHgwMTJFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fV0VOCQkweDAxMzAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9TVFJPQkUJMHgwMTMyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DU0kyX0RYMAkweDAxMzQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NTSTJfRFkwCTB4MDEzNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ1NJMl9EWDEJMHgwMTM4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DU0kyX0RZMQkweDAxM0EKKy8qQXVkaW8gSW50ZXJmYWNlICovCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDJfRlNYCTB4MDEzQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AyX0NMS1gJMHgwMTNFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDJfRFIJMHgwMTQwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDJfRFgJMHgwMTQyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMxX0NMSwkweDAxNDQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzFfQ01ECTB4MDE0NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMV9EQVQwCTB4MDE0OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMV9EQVQxCTB4MDE0QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMV9EQVQyCTB4MDE0QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMV9EQVQzCTB4MDE0RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMV9EQVQ0CTB4MDE1MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMV9EQVQ1CTB4MDE1MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMV9EQVQ2CTB4MDE1NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMV9EQVQ3CTB4MDE1NgorLypXaXJlbGVzcyBMQU4gKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzJfQ0xLCTB4MDE1OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMl9DTUQJMHgwMTVBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMyX0RBVDAJMHgwMTVDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMyX0RBVDEJMHgwMTVFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMyX0RBVDIJMHgwMTYwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMyX0RBVDMJMHgwMTYyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMyX0RBVDQJMHgwMTY0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMyX0RBVDUJMHgwMTY2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMyX0RBVDYJMHgwMTY4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMyX0RBVDcJMHgwMTZBCisvKkJsdWV0b290aCovCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDNfRFgJMHgwMTZDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDNfRFIJMHgwMTZFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDNfQ0xLWAkweDAxNzAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQM19GU1gJMHgwMTcyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMl9DVFMJMHgwMTc0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMl9SVFMJMHgwMTc2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMl9UWAkweDAxNzgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQyX1JYCTB4MDE3QQorLypNb2RlbSBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQxX1RYCTB4MDE3QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDFfUlRTCTB4MDE3RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDFfQ1RTCTB4MDE4MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDFfUlgJMHgwMTgyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDRfQ0xLWAkweDAxODQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQNF9EUgkweDAxODYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQNF9EWAkweDAxODgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQNF9GU1gJMHgwMThBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDFfQ0xLUgkweDAxOEMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQMV9GU1IJMHgwMThFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDFfRFgJMHgwMTkwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDFfRFIJMHgwMTkyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUF9DTEtTCTB4MDE5NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AxX0ZTWAkweDAxOTYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQMV9DTEtYCTB4MDE5OAorLypTZXJpYWwgSW50ZXJmYWNlKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQzX0NUU19SQ1RYCTB4MDE5QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDNfUlRTX1NECTB4MDE5QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDNfUlhfSVJSWAkweDAxOUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQzX1RYX0lSVFgJMHgwMUEwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IU1VTQjBfQ0xLCTB4MDFBMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSFNVU0IwX1NUUAkweDAxQTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hTVVNCMF9ESVIJMHgwMUE2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IU1VTQjBfTlhUCTB4MDFBOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSFNVU0IwX0RBVEEwCTB4MDFBQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSFNVU0IwX0RBVEExCTB4MDFBQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSFNVU0IwX0RBVEEyCTB4MDFBRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSFNVU0IwX0RBVEEzCTB4MDFCMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSFNVU0IwX0RBVEE0CTB4MDFCMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSFNVU0IwX0RBVEE1CTB4MDFCNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSFNVU0IwX0RBVEE2CTB4MDFCNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSFNVU0IwX0RBVEE3CTB4MDFCOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSTJDMV9TQ0wJMHgwMUJBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9JMkMxX1NEQQkweDAxQkMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0kyQzJfU0NMCTB4MDFCRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSTJDMl9TREEJMHgwMUMwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9JMkMzX1NDTAkweDAxQzIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0kyQzNfU0RBCTB4MDFDNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSTJDNF9TQ0wJMHgwQTAwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9JMkM0X1NEQQkweDBBMDIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hEUV9TSU8JCTB4MDFDNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNTUEkxX0NMSwkweDAxQzgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DU1BJMV9TSU1PCTB4MDFDQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNTUEkxX1NPTUkJMHgwMUNDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ1NQSTFfQ1MwCTB4MDFDRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNTUEkxX0NTMQkweDAxRDAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DU1BJMV9DUzIJMHgwMUQyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ1NQSTFfQ1MzCTB4MDFENAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNTUEkyX0NMSwkweDAxRDYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DU1BJMl9TSU1PCTB4MDFEOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNTUEkyX1NPTUkJMHgwMURBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ1NQSTJfQ1MwCTB4MDFEQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNTUEkyX0NTMQkweDAxREUKKy8qQ29udHJvbCBhbmQgZGVidWcgKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU18zMksJCTB4MEEwNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTX0NMS1JFUQkweDBBMDYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU19OSVJRCTB4MDFFMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTX0JPT1QwCTB4MEEwQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTX0JPT1QxCTB4MEEwQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTX0JPT1QyCTB4MEEwRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTX0JPT1QzCTB4MEExMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTX0JPT1Q0CTB4MEExMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTX0JPT1Q1CTB4MEExNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTX0JPT1Q2CTB4MEExNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTX09GRl9NT0RFCTB4MEExOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTX0NMS09VVDEJMHgwQTFBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfQ0xLT1VUMgkweDAxRTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0pUQUdfblRSU1QJMHgwQTFDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9KVEFHX1RDSwkweDBBMUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0pUQUdfVE1TCTB4MEEyMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSlRBR19UREkJMHgwQTIyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9KVEFHX0VNVTAJMHgwQTI0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9KVEFHX0VNVTEJMHgwQTI2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfQ0xLCQkweDBBMjgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19DVEwJCTB4MEEyQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QwCQkweDBBMkMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMQkJMHgwQTJFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDIJCTB4MEEzMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QzCQkweDBBMzIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19ENAkJMHgwQTM0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDUJCTB4MEEzNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0Q2CQkweDBBMzgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19ENwkJMHgwQTNBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDgJCTB4MEEzQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0Q5CQkweDBBM0UKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMTAJCTB4MEE0MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxMQkJMHgwQTQyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDEyCQkweDBBNDQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMTMJCTB4MEE0NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxNAkJMHgwQTQ4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDE1CQkweDBBNEEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19DTEtfRVMyCTB4MDVEOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0NUTF9FUzIJMHgwNURBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDBfRVMyCTB4MDVEQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxX0VTMgkweDA1REUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMl9FUzIJMHgwNUUwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDNfRVMyCTB4MDVFMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0Q0X0VTMgkweDA1RTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19ENV9FUzIJMHgwNUU2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDZfRVMyCTB4MDVFOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0Q3X0VTMgkweDA1RUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EOF9FUzIJMHgwNUVDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDlfRVMyCTB4MDVFRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxMF9FUzIJMHgwNUYwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDExX0VTMgkweDA1RjIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMTJfRVMyCTB4MDVGNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxM19FUzIJMHgwNUY2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDE0X0VTMgkweDA1RjgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMTVfRVMyCTB4MDVGQQorLypEaWUgdG8gRGllICovCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDAJMHgwMUU0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDEJMHgwMUU2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDIJMHgwMUU4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDMJMHgwMUVBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDQJMHgwMUVDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDUJMHgwMUVFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDYJMHgwMUYwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDcJMHgwMUYyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDgJMHgwMUY0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDkJMHgwMUY2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDEwCTB4MDFGOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQxMQkweDAxRkEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMTIJMHgwMUZDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDEzCTB4MDFGRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQxNAkweDAyMDAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMTUJMHgwMjAyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDE2CTB4MDIwNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQxNwkweDAyMDYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMTgJMHgwMjA4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDE5CTB4MDIwQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQyMAkweDAyMEMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMjEJMHgwMjBFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDIyCTB4MDIxMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQyMwkweDAyMTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMjQJMHgwMjE0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDI1CTB4MDIxNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQyNgkweDAyMTgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMjcJMHgwMjFBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDI4CTB4MDIxQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQyOQkweDAyMUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMzAJMHgwMjIwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDMxCTB4MDIyMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQzMgkweDAyMjQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMzMJMHgwMjI2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDM0CTB4MDIyOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQzNQkweDAyMkEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMzYJMHgwMjJDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfQ0xLMjZNSQkweDAyMkUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9OUkVTUFdST04JMHgwMjMwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTlJFU1dBUk0JMHgwMjMyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfQVJNOU5JUlEJMHgwMjM0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfVU1BMlA2RklRCTB4MDIzNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX1NQSU5UCTB4MDIzOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX0ZSSU5UCTB4MDIzQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX0RNQVJFUTAJMHgwMjNDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfRE1BUkVRMQkweDAyM0UKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9ETUFSRVEyCTB4MDI0MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX0RNQVJFUTMJMHgwMjQyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTjNHVFJTVAkweDAyNDQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9OM0dUREkJMHgwMjQ2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTjNHVERPCTB4MDI0OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX04zR1RNUwkweDAyNEEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9OM0dUQ0sJMHgwMjRDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTjNHUlRDSwkweDAyNEUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NU1REQlkJMHgwMjUwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfU1dBS0VVUAkweDBBNEMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9JRExFUkVRCTB4MDI1MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX0lETEVBQ0sJMHgwMjU0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTVdSSVRFCTB4MDI1NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX1NXUklURQkweDAyNTgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NUkVBRAkweDAyNUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9TUkVBRAkweDAyNUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQlVTRkxBRwkweDAyNUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9TQlVTRkxBRwkweDAyNjAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfQ0tFMAkweDAyNjIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfQ0tFMQkweDAyNjQKKworI2RlZmluZSBNVVhfVkFMKE9GRlNFVCxWQUxVRSlcCisJd3JpdGV3KChWQUxVRSksIE9NQVAzNFhYX0NUUkxfQkFTRSArIChPRkZTRVQpKTsKKworI2RlZmluZQlDUCh4KQkoQ09OVFJPTF9QQURDT05GXyMjeCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL29tYXAzLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL29tYXAzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzOTJjYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvb21hcDMuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICogU3llZCBNb2hhbW1lZCBLaGFzaW0gPHgwa2hhc2ltQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9PTUFQM19TWVNfSF8KKyNkZWZpbmUgX09NQVAzX1NZU19IXworCisjaW5jbHVkZSA8YXNtL2FyY2gvc2l6ZXMuaD4KKworLyoKKyAqIE9NQVAzIHNwZWNpZmljIFNlY3Rpb24KKyAqLworCisvKiBTdHVmZiBvbiBMMyBJbnRlcmNvbm5lY3QgKi8KKyNkZWZpbmUgU01YX0FQRV9CQVNFCQkJMHg2ODAwMDAwMAorCisvKiBMMyBGaXJld2FsbCAqLworI2RlZmluZSBBX1JFUUlORk9QRVJNMAkJKFNNWF9BUEVfQkFTRSArIDB4MDUwNDgpCisjZGVmaW5lIEFfUkVBRFBFUk0wCQkoU01YX0FQRV9CQVNFICsgMHgwNTA1MCkKKyNkZWZpbmUgQV9XUklURVBFUk0wCQkoU01YX0FQRV9CQVNFICsgMHgwNTA1OCkKKworLyogR1BNQyAqLworI2RlZmluZSBPTUFQMzRYWF9HUE1DX0JBU0UJCSgweDZFMDAwMDAwKQorCisvKiBTTVMgKi8KKyNkZWZpbmUgT01BUDM0WFhfU01TX0JBU0UJCTB4NkMwMDAwMDAKKworLyogU0RSQyAqLworI2RlZmluZSBPTUFQMzRYWF9TRFJDX0JBU0UJCTB4NkQwMDAwMDAKKworLyoKKyAqIEw0IFBlcmlwaGVyYWxzIC0gTDQgV2FrZXVwIGFuZCBMNCBDb3JlIG5vdworICovCisjZGVmaW5lIE9NQVAzNFhYX0NPUkVfTDRfSU9fQkFTRQkweDQ4MDAwMDAwCisKKyNkZWZpbmUgT01BUDM0WFhfV0FLRVVQX0w0X0lPX0JBU0UJMHg0ODMwMDAwMAorCisjZGVmaW5lIE9NQVAzNFhYX0w0X1BFUgkJCTB4NDkwMDAwMDAKKworI2RlZmluZSBPTUFQMzRYWF9MNF9JT19CQVNFCQlPTUFQMzRYWF9DT1JFX0w0X0lPX0JBU0UKKworLyogQ09OVFJPTCAqLworI2RlZmluZSBPTUFQMzRYWF9DVFJMX0JBU0UJCShPTUFQMzRYWF9MNF9JT19CQVNFKzB4MjAwMCkKKworLyogVEFQIGluZm9ybWF0aW9uICBkb250IGtub3cgZm9yIDM0MzAqLworI2RlZmluZSBPTUFQMzRYWF9UQVBfQkFTRQkJKDB4NDkwMDAwMDApIC8qZ2l2aW5nIHNvbWUganVuayBmb3IgdmlydGlvICovCisKKy8qIFVBUlQgKi8KKyNkZWZpbmUgT01BUDM0WFhfVUFSVDEJCQkoT01BUDM0WFhfTDRfSU9fQkFTRSsweDZhMDAwKQorI2RlZmluZSBPTUFQMzRYWF9VQVJUMgkJCShPTUFQMzRYWF9MNF9JT19CQVNFKzB4NmMwMDApCisjZGVmaW5lIE9NQVAzNFhYX1VBUlQzCQkJKE9NQVAzNFhYX0w0X1BFUisweDIwMDAwKQorCisvKiBHZW5lcmFsIFB1cnBvc2UgVGltZXJzICovCisjZGVmaW5lIE9NQVAzNFhYX0dQVDEJCQkweDQ4MzE4MDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDIJCQkweDQ5MDMyMDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDMJCQkweDQ5MDM0MDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDQJCQkweDQ5MDM2MDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDUJCQkweDQ5MDM4MDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDYJCQkweDQ5MDNBMDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDcJCQkweDQ5MDNDMDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDgJCQkweDQ5MDNFMDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDkJCQkweDQ5MDQwMDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDEwCQkJMHg0ODA4NjAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQxMQkJCTB4NDgwODgwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUMTIJCQkweDQ4MzA0MDAwCisKKy8qIFdhdGNoRG9nIFRpbWVycyAoMSBzZWN1cmUsIDMgR1ApICovCisjZGVmaW5lIFdEMV9CQVNFCQkJKDB4NDgzMEMwMDApCisjZGVmaW5lIFdEMl9CQVNFCQkJKDB4NDgzMTQwMDApCisjZGVmaW5lIFdEM19CQVNFCQkJKDB4NDkwMzAwMDApCisKKy8qIDMyS1RJTUVSICovCisjZGVmaW5lIFNZTkNfMzJLVElNRVJfQkFTRQkJKDB4NDgzMjAwMDApCisjZGVmaW5lIFMzMktfQ1IJCQkJKFNZTkNfMzJLVElNRVJfQkFTRSsweDEwKQorCisvKgorICogU0RQMzQzMCBzcGVjaWZpYyBTZWN0aW9uCisgKi8KKworLyoKKyAqICBUaGUgMzQzeCdzIGNoaXAgc2VsZWN0cyBhcmUgcHJvZ3JhbW1hYmxlLiAgVGhlIG1hc2sgUk9NCisgKiAgZG9lcyBjb25maWd1cmUgQ1MwIHRvIDB4MDgwMDAwMDAgYmVmb3JlIGRpc3BhdGNoLiAgU28sIGlmCisgKiAgeW91IHdhbnQgeW91ciBjb2RlIHRvIGxpdmUgYmVsb3cgdGhhdCBhZGRyZXNzLCB5b3UgaGF2ZSB0bworICogIGJlIHByZXBhcmVkIHRvIGp1bXAgdGhvdWdoIGhvb3BzLCB0byByZXNldCB0aGUgYmFzZSBhZGRyZXNzLgorICogIFNhbWUgYXMgaW4gU0RQMzQzMAorICovCisvKiBiYXNlIGFkZHJlc3MgZm9yIGluZGlyZWN0IHZlY3RvcnMgKGludGVybmFsIGJvb3QgbW9kZSkgKi8KKyNkZWZpbmUgU1JBTV9PRkZTRVQwCQkJMHg0MDAwMDAwMAorI2RlZmluZSBTUkFNX09GRlNFVDEJCQkweDAwMjAwMDAwCisjZGVmaW5lIFNSQU1fT0ZGU0VUMgkJCTB4MDAwMEY4MDAKKyNkZWZpbmUgU1JBTV9WRUNUX0NPREUJCQkoU1JBTV9PRkZTRVQwfFNSQU1fT0ZGU0VUMXxTUkFNX09GRlNFVDIpCisKKyNkZWZpbmUgTE9XX0xFVkVMX1NSQU1fU1RBQ0sJCTB4NDAyMEZGRkMKKworLyoKKyAqIFRPRE86IEFyZSB0aGV5IHJlcXVpcmVkIGZvciBBTTM1MTc/CisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR18zNDMwU0RQKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQM0VWTSkKKy8qIEZQR0Egb24gRGVidWcgYm9hcmQuKi8KKyNkZWZpbmUgRVRIX0NPTlRST0xfUkVHCQkJKERFQlVHX0JBU0UrMHgzMGIpCisjZGVmaW5lIExBTl9SRVNFVF9SRUdJU1RFUgkJKERFQlVHX0JBU0UrMHgxYykKKworI2RlZmluZSBESVBfU1dJVENIX0lOUFVUX1JFRzIJCShERUJVR19CQVNFKzB4NjApCisjZGVmaW5lIExFRF9SRUdJU1RFUgkJCShERUJVR19CQVNFKzB4NDApCisjZGVmaW5lIEZQR0FfUkVWX1JFR0lTVEVSCQkoREVCVUdfQkFTRSsweDEwKQorI2RlZmluZSBFRVBST01fTUFJTl9CUkQJCQkoREVCVUdfQkFTRSsweDEwMDAwKzB4MTgwMCkKKyNkZWZpbmUgRUVQUk9NX0NPTk5fQlJECQkJKERFQlVHX0JBU0UrMHgxMDAwMCsweDE5MDApCisjZGVmaW5lIEVFUFJPTV9VSV9CUkQJCQkoREVCVUdfQkFTRSsweDEwMDAwKzB4MUEwMCkKKyNkZWZpbmUgRUVQUk9NX01DQU1fQlJECQkJKERFQlVHX0JBU0UrMHgxMDAwMCsweDFCMDApCisjZGVmaW5lIEVOSEFOQ0VEX1VJX0VFX05BTUUJCSI3NTAtMjA3NSIKKyNlbmRpZgorCisjZW5kaWYgIC8qIF9PTUFQMzQzMF9TWVNfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvb21hcDM0MzAuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvb21hcDM0MzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmNkZTYzCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9vbWFwMzQzMC5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKiBTeWVkIE1vaGFtbWVkIEtoYXNpbSA8eDBraGFzaW1AdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX09NQVAzNDMwX1NZU19IXworI2RlZmluZSBfT01BUDM0MzBfU1lTX0hfCisKKyNpbmNsdWRlIDxhc20vYXJjaC9zaXplcy5oPgorCisvKgorICogMzQzMCBzcGVjaWZpYyBTZWN0aW9uCisgKi8KKworLyogU3R1ZmYgb24gTDMgSW50ZXJjb25uZWN0ICovCisjZGVmaW5lIFNNWF9BUEVfQkFTRQkJCTB4NjgwMDAwMDAKKworLyogTDMgRmlyZXdhbGwgKi8KKyNkZWZpbmUgQV9SRVFJTkZPUEVSTTAJCShTTVhfQVBFX0JBU0UgKyAweDA1MDQ4KQorI2RlZmluZSBBX1JFQURQRVJNMAkJKFNNWF9BUEVfQkFTRSArIDB4MDUwNTApCisjZGVmaW5lIEFfV1JJVEVQRVJNMAkJKFNNWF9BUEVfQkFTRSArIDB4MDUwNTgpCisKKy8qIEdQTUMgKi8KKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19CQVNFCQkoMHg2RTAwMDAwMCkKKworLyogU01TICovCisjZGVmaW5lIE9NQVAzNFhYX1NNU19CQVNFCQkweDZDMDAwMDAwCisKKy8qIFNEUkMgKi8KKyNkZWZpbmUgT01BUDM0WFhfU0RSQ19CQVNFCQkweDZEMDAwMDAwCisKKy8qCisgKiBMNCBQZXJpcGhlcmFscyAtIEw0IFdha2V1cCBhbmQgTDQgQ29yZSBub3cKKyAqLworI2RlZmluZSBPTUFQMzRYWF9DT1JFX0w0X0lPX0JBU0UJMHg0ODAwMDAwMAorCisjZGVmaW5lIE9NQVAzNFhYX1dBS0VVUF9MNF9JT19CQVNFCTB4NDgzMDAwMDAKKworI2RlZmluZSBPTUFQMzRYWF9MNF9QRVIJCQkweDQ5MDAwMDAwCisKKyNkZWZpbmUgT01BUDM0WFhfTDRfSU9fQkFTRQkJT01BUDM0WFhfQ09SRV9MNF9JT19CQVNFCisKKy8qIENPTlRST0wgKi8KKyNkZWZpbmUgT01BUDM0WFhfQ1RSTF9CQVNFCQkoT01BUDM0WFhfTDRfSU9fQkFTRSsweDIwMDApCisKKy8qIFRBUCBpbmZvcm1hdGlvbiAgZG9udCBrbm93IGZvciAzNDMwKi8KKyNkZWZpbmUgT01BUDM0WFhfVEFQX0JBU0UJCSgweDQ5MDAwMDAwKSAvKmdpdmluZyBzb21lIGp1bmsgZm9yIHZpcnRpbyAqLworCisvKiBVQVJUICovCisjZGVmaW5lIE9NQVAzNFhYX1VBUlQxCQkJKE9NQVAzNFhYX0w0X0lPX0JBU0UrMHg2YTAwMCkKKyNkZWZpbmUgT01BUDM0WFhfVUFSVDIJCQkoT01BUDM0WFhfTDRfSU9fQkFTRSsweDZjMDAwKQorI2RlZmluZSBPTUFQMzRYWF9VQVJUMwkJCShPTUFQMzRYWF9MNF9QRVIrMHgyMDAwMCkKKworLyogR2VuZXJhbCBQdXJwb3NlIFRpbWVycyAqLworI2RlZmluZSBPTUFQMzRYWF9HUFQxCQkJMHg0ODMxODAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQyCQkJMHg0OTAzMjAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQzCQkJMHg0OTAzNDAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQ0CQkJMHg0OTAzNjAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQ1CQkJMHg0OTAzODAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQ2CQkJMHg0OTAzQTAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQ3CQkJMHg0OTAzQzAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQ4CQkJMHg0OTAzRTAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQ5CQkJMHg0OTA0MDAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQxMAkJCTB4NDgwODYwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUMTEJCQkweDQ4MDg4MDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDEyCQkJMHg0ODMwNDAwMAorCisvKiBXYXRjaERvZyBUaW1lcnMgKDEgc2VjdXJlLCAzIEdQKSAqLworI2RlZmluZSBXRDFfQkFTRQkJCSgweDQ4MzBDMDAwKQorI2RlZmluZSBXRDJfQkFTRQkJCSgweDQ4MzE0MDAwKQorI2RlZmluZSBXRDNfQkFTRQkJCSgweDQ5MDMwMDAwKQorCisvKiAzMktUSU1FUiAqLworI2RlZmluZSBTWU5DXzMyS1RJTUVSX0JBU0UJCSgweDQ4MzIwMDAwKQorI2RlZmluZSBTMzJLX0NSCQkJCShTWU5DXzMyS1RJTUVSX0JBU0UrMHgxMCkKKworLyoKKyAqIFNEUDM0MzAgc3BlY2lmaWMgU2VjdGlvbgorICovCisKKy8qCisgKiAgVGhlIDM0M3gncyBjaGlwIHNlbGVjdHMgYXJlIHByb2dyYW1tYWJsZS4gIFRoZSBtYXNrIFJPTQorICogIGRvZXMgY29uZmlndXJlIENTMCB0byAweDA4MDAwMDAwIGJlZm9yZSBkaXNwYXRjaC4gIFNvLCBpZgorICogIHlvdSB3YW50IHlvdXIgY29kZSB0byBsaXZlIGJlbG93IHRoYXQgYWRkcmVzcywgeW91IGhhdmUgdG8KKyAqICBiZSBwcmVwYXJlZCB0byBqdW1wIHRob3VnaCBob29wcywgdG8gcmVzZXQgdGhlIGJhc2UgYWRkcmVzcy4KKyAqICBTYW1lIGFzIGluIFNEUDM0MzAKKyAqLworI2lmZGVmIENPTkZJR19PTUFQMzRYWAorLyogYmFzZSBhZGRyZXNzIGZvciBpbmRpcmVjdCB2ZWN0b3JzIChpbnRlcm5hbCBib290IG1vZGUpICovCisjZGVmaW5lIFNSQU1fT0ZGU0VUMAkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgU1JBTV9PRkZTRVQxCQkJMHgwMDIwMDAwMAorI2RlZmluZSBTUkFNX09GRlNFVDIJCQkweDAwMDBGODAwCisjZGVmaW5lIFNSQU1fVkVDVF9DT0RFCQkJKFNSQU1fT0ZGU0VUMHxTUkFNX09GRlNFVDF8U1JBTV9PRkZTRVQyKQorCisjZGVmaW5lIExPV19MRVZFTF9TUkFNX1NUQUNLCQkweDQwMjBGRkZDCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzM0MzBTRFApIHx8IGRlZmluZWQoQ09ORklHX09NQVAzRVZNKQorLyogRlBHQSBvbiBEZWJ1ZyBib2FyZC4qLworI2RlZmluZSBFVEhfQ09OVFJPTF9SRUcJCQkoREVCVUdfQkFTRSsweDMwYikKKyNkZWZpbmUgTEFOX1JFU0VUX1JFR0lTVEVSCQkoREVCVUdfQkFTRSsweDFjKQorCisjZGVmaW5lIERJUF9TV0lUQ0hfSU5QVVRfUkVHMgkJKERFQlVHX0JBU0UrMHg2MCkKKyNkZWZpbmUgTEVEX1JFR0lTVEVSCQkJKERFQlVHX0JBU0UrMHg0MCkKKyNkZWZpbmUgRlBHQV9SRVZfUkVHSVNURVIJCShERUJVR19CQVNFKzB4MTApCisjZGVmaW5lIEVFUFJPTV9NQUlOX0JSRAkJCShERUJVR19CQVNFKzB4MTAwMDArMHgxODAwKQorI2RlZmluZSBFRVBST01fQ09OTl9CUkQJCQkoREVCVUdfQkFTRSsweDEwMDAwKzB4MTkwMCkKKyNkZWZpbmUgRUVQUk9NX1VJX0JSRAkJCShERUJVR19CQVNFKzB4MTAwMDArMHgxQTAwKQorI2RlZmluZSBFRVBST01fTUNBTV9CUkQJCQkoREVCVUdfQkFTRSsweDEwMDAwKzB4MUIwMCkKKyNkZWZpbmUgRU5IQU5DRURfVUlfRUVfTkFNRQkJIjc1MC0yMDc1IgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChDT05GSUdfQU0zNTE3RVZNKSB8fCBkZWZpbmVkIChDT05GSUdfQU0zNTE3VEVCKQorLyogRU1JRiA0IHJlcGxhY2VzIFNEUkMgaW4gQU0zNTE3IGZvciBERFIgKi8KKyNkZWZpbmUgRU1JRjRfTU9EX0lECQkJMHgwMAorI2RlZmluZSBFTUlGNF9TVEFUVVMJCQkweDA0CisjZGVmaW5lIEVNSUY0X1NEUl9DT05GSUcJCTB4MDgKKyNkZWZpbmUgRU1JRjRfTFBERFIyX0NPTkZJRgkJMHgwQworI2RlZmluZSBFTUlGNF9TRFJfUkVGX0NUUkwJCTB4MTAKKyNkZWZpbmUgRU1JRjRfU0RSX1JFRl9DVFJMX1NIRFcJCTB4MTQKKyNkZWZpbmUgRU1JRjRfU0RSX1RJTTEJCQkweDE4CisjZGVmaW5lIEVNSUY0X1NEUl9USU0xX1NIRFcJCTB4MUMKKyNkZWZpbmUgRU1JRjRfU0RSX1RJTTIgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIEVNSUY0X1NEUl9USU0yX1NIRFcgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBFTUlGNF9TRFJfVElNMyAgICAgICAgICAgICAgICAgIDB4MjgKKyNkZWZpbmUgRU1JRjRfU0RSX1RJTTNfU0hEVyAgICAgICAgICAgICAweDJDCisjZGVmaW5lIEVNSUY0X0xQRERSMl9OVk1fVElNCQkweDMwCisjZGVmaW5lIEVNSUY0X0xQRERSMl9OVk1fVElNX1NIRFcJMHgzNAorI2RlZmluZSBFTUlGNF9QV1JfTUdNVF9DVFJMCQkweDM4CisjZGVmaW5lIEVNSUY0X1BXUl9NR01UX0NUUkxfU0hEVwkweDNDCisjZGVmaW5lIEVNSUY0X0xQRERSMl9SRUdfREFUQQkJMHg0MAorI2RlZmluZSBFTUlGNF9MUEREUjJfUkVHX0NGRwkJMHg1MAorI2RlZmluZSBFTUlGNF9PQ1BfQ09ORklHCQkweDU0CisjZGVmaW5lIEVNSUY0X09DUF9DRkdfVkFMMQkJMHg1OAorI2RlZmluZSBFTUlGNF9PQ1BfQ0ZHX1ZBTDIJCTB4NUMKKyNkZWZpbmUgRU1JRjRfUEVSRl9DTlQxCQkJMHg4MAorI2RlZmluZSBFTUlGNF9QRVJGX0NOVDIJCQkweDg0CisjZGVmaW5lIEVNSUY0X1BFUkZfQ05UX0NGRwkJMHg4OAorI2RlZmluZSBFTUlGNF9QRVJGX0NOVF9TRUwJCTB4OEMKKyNkZWZpbmUgRU1JRjRfUEVSRl9DTlRfVElNCQkweDkwCisjZGVmaW5lIEVNSUY0X0lSUV9FT0kJCQkweEEwCisjZGVmaW5lIEVNSUY0X0lSUVNUU19SQVcJCTB4QTQKKyNkZWZpbmUgRU1JRjRfSVJRU1RTCQkJMHhBQworI2RlZmluZSBFTUlGNF9JUlFFTl9TRVQJCQkweEI0CisjZGVmaW5lIEVNSUY0X0lSUUVOX0NMUgkJCTB4QkMKKyNkZWZpbmUgRU1JRjRfRERSX1BIWV9DVFJMMQkJMHhFNAorI2RlZmluZSBFTUlGNF9ERFJfUEhZX0NUUkwxX1NIRFcJMHhFOAorI2RlZmluZSBFTUlGNF9ERFJfUEhZX0NUUkwyCQkweEVDCisjZW5kaWYKKworI2VuZGlmICAvKiBfT01BUDM0MzBfU1lTX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3ByY20uaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvcHJjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMGZkYWUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3ByY20uaApAQCAtMCwwICsxLDc0IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyByZWdpc3RlciBhbmQgcmVnaXN0ZXIgZmllbGQgY29uc3RhbnRzIGFuZAorICogICAgICBtYWNyb3MgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBPcGVuIE11bHRpbWVkaWEgQXBwbGljYXRpb24KKyAqICAgICAgUGxhdGZvcm0gKE9NQVApIDMgUG93ZXIsIFJlc2V0IGFuZCBDbG9jayBNYW5hZ2VtZW50IChQUkNNKQorICogICAgICBtb2R1bGUuCisgKi8KKworI2lmbmRlZiBfT01BUDNfUFJDTV9ICisjZGVmaW5lIF9PTUFQM19QUkNNX0gKKworI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKworI2RlZmluZSBQUkNNX0JBU0UJCQkJCQkweDQ4MDAwMDAwCisKKyNkZWZpbmUgUFJDTV9DTV9CQVNFCQkJCQkJKFBSQ01fQkFTRSArIDB4MDAwMDQwMDApCisKKyNkZWZpbmUgUFJDTV9QUk1fQkFTRQkJCQkJCShQUkNNX0JBU0UgKyAweDAwMzA2MDAwKQorCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9CQVNFCQkJCQkoUFJDTV9QUk1fQkFTRSArIDB4MDAwMDBEMDApCisKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS1NFTAkJCQkJCShQUkNNX1BSTV9DQ1JfQkFTRSArIDB4MDAwMDAwNDApCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9TVEFSVAkJMAorI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfQklUUwkJMworI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfTUFTSwkJQVJNX1JFR19WQUwoMCwgQVJNX1JFR19NQVNLKFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9CSVRTKSkKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX0VOQ09ERSh2KQlBUk1fUkVHX1ZBTF9FTkNPREUoMCwgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX01BU0ssIHYpCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9ERUNPREUodikJQVJNX1JFR19WQUxfREVDT0RFKDAsIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9NQVNLLCB2KQorI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTJfMF9NSFoJCTB4MAorI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTNfMF9NSFoJCTB4MQorI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFoJCTB4MgorI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMjZfMF9NSFoJCTB4MworI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMzhfNF9NSFoJCTB4NAorI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTZfOF9NSFoJCTB4NQorCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtPVVRfQ1RSTAkJCQkoUFJDTV9QUk1fQ0NSX0JBU0UgKyAweDAwMDAwMDcwKQorCisjZGVmaW5lIFBSQ01fUFJNX0dSX0JBU0UJCQkJCShQUkNNX1BSTV9CQVNFICsgMHgwMDAwMTIwMCkKKworI2RlZmluZQlQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTAkJCQkJKFBSQ01fUFJNX0dSX0JBU0UgKyAweDAwMDAwMDcwKQorI2RlZmluZSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfU1RBUlQJCTYKKyNkZWZpbmUgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JJVFMJCTIKKyNkZWZpbmUgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX01BU0sJCUFSTV9SRUdfVkFMKDAsIEFSTV9SRUdfTUFTSyhQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQklUUykpCisjZGVmaW5lIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9FTkNPREUodikJQVJNX1JFR19WQUxfRU5DT0RFKDAsIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9NQVNLLCB2KQorI2RlZmluZSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfREVDT0RFKHYpCUFSTV9SRUdfVkFMX0RFQ09ERSgwLCBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfTUFTSywgdikKKyNkZWZpbmUgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzEJCQkxCisjZGVmaW5lIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8yCQkJMgorCisjZGVmaW5lIFBSQ01fU1JfQkFTRQkJCQkJKFBSQ01fQkFTRSArIDB4MDAwQzkwMDApCisKKyNkZWZpbmUgUFJNX0NMS1NFTCAgICAgICAgICAgUFJDTV9QUk1fQ0NSX0NMS1NFTAorI2RlZmluZSBQUk1fUlNUQ1RSTCAgICAgICAgICAweDQ4MzA3MjUwCisjZGVmaW5lIFBSTV9DTEtTUkNfQ1RSTCAgICAgIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMCisKKyNlbmRpZiAvKiBfT01BUDNfUFJDTV9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3Jldi5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9yZXYuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMGU5NWQ0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9yZXYuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAKKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqIFN5ZWQgTW9oYW1tZWQgS2hhc2ltIDx4MGtoYXNpbUB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfT01BUDM0WFhfUkVWX0hfCisjZGVmaW5lIF9PTUFQMzRYWF9SRVZfSF8KKworI2RlZmluZSBDREJfRERSX0NPTUJPICAgICAgICAgICAgICAgICAgIC8qIGNvbWJvIHBhcnQgb24gY3B1IGRhdWdodGVyIGNhcmQgKi8KKyNkZWZpbmUgQ0RCX0REUl9JUERCICAgICAgICAgICAgICAgICAgICAvKiAyeDE2IHBhcnRzIG9uIGRhdWdodGVyIGNhcmQgKi8KKworI2RlZmluZSBERFJfMTAwCQkxMDAgICAgICAgICAgICAgLyogdHlwZSBmb3VuZCBvbiBtb3N0IG1lbSBkLWJvYXJkcyAqLworI2RlZmluZSBERFJfMTExCQkxMTEgICAgICAgICAgICAgLyogc29tZSBjb21ibyBwYXJ0cyAqLworI2RlZmluZSBERFJfMTMzCQkxMzMgICAgICAgICAgICAgLyogbW9zdCBjb21ibywgc29tZSBtZW0gZC1ib2FyZHMgKi8KKyNkZWZpbmUgRERSXzE2NQkJMTY1ICAgICAgICAgICAgIC8qIGZ1dHVyZSBwYXJ0cyAqLworCisjZGVmaW5lIENQVV8zNDMwCTB4MzQzMAorCisjZGVmaW5lIENQVV8zNDMwX0VTMQkxCisjZGVmaW5lIENQVV8zNDMwX0VTMgkxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zZHJjLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3NkcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzUyMDFjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zZHJjLmgKQEAgLTAsMCArMSwzNjYgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHJlZ2lzdGVyIGFuZCByZWdpc3RlciBmaWVsZCBjb25zdGFudHMgYW5kCisgKiAgICAgIG1hY3JvcyBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIE9wZW4gTXVsdGltZWRpYSBBcHBsaWNhdGlvbgorICogICAgICBQbGF0Zm9ybSAoT01BUCkgMyBTRFJBTSBDb250cm9sbGVyIChTRFJDKS4KKyAqLworCisjaWZuZGVmIF9PTUFQM19TRFJDX0gKKyNkZWZpbmUgX09NQVAzX1NEUkNfSAorCisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorCisvKgorICogU0RSQU0gQ29udHJvbGxlciBSZXZpc2lvbgorICovCisjZGVmaW5lIFNEUkNfUkVWSVNJT05fUkVWX01BU0sJCQkJQVJNX1JFR19WQUwoMCwgMHhGRikKKyNkZWZpbmUgU0RSQ19SRVZJU0lPTl9SRVZfTUFKT1JfTUFTSwkJQVJNX1JFR19WQUwoNCwgMHhGKQorI2RlZmluZSBTRFJDX1JFVklTSU9OX1JFVl9NSU5PUl9NQVNLCQlBUk1fUkVHX1ZBTCgwLCAweEYpCisjZGVmaW5lIFNEUkNfUkVWSVNJT05fUkVWX01BSk9SX0RFQ09ERSh4KQlBUk1fUkVHX1ZBTF9ERUNPREUoNCwgU0RSQ19SRVZJU0lPTl9SRVZfTUFKT1JfTUFTSywgeCkKKyNkZWZpbmUgU0RSQ19SRVZJU0lPTl9SRVZfTUlOT1JfREVDT0RFKHgpCUFSTV9SRUdfVkFMX0RFQ09ERSgwLCBTRFJDX1JFVklTSU9OX1JFVl9NSU5PUl9NQVNLKSwgeCkKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgU3lzdGVtIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBTRFJDX1NZU0NPTkZJR19OT01FTU9SWU1SU19ESVNBQkxFCUFSTV9SRUdfVkFMKDgsIDApCisjZGVmaW5lIFNEUkNfU1lTQ09ORklHX05PTUVNT1JZTVJTX0VOQUJMRQlBUk1fUkVHX1ZBTCg4LCAxKQorI2RlZmluZSBTRFJDX1NZU0NPTkZJR19JRExFTU9ERV9TTUFSVAkJQVJNX1JFR19WQUwoMywgMHgyKQorI2RlZmluZSBTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfQ0xFQVIJCUFSTV9SRUdfVkFMKDEsIDB4MCkKKyNkZWZpbmUgU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX1NFVAkJQVJNX1JFR19WQUwoMSwgMHgxKQorCisvKgorICogU0RSQU0gQ29udHJvbGxlciBTeXN0ZW0gU3RhdHVzCisgKi8KKyNkZWZpbmUgU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FCQkJQVJNX1JFR19WQUwoMCwgMSkKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgQ2hpcCBTZWxlY3QgQ29uZmlndXJhdGlvbgorICovCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIE11bHRpcGxleGluZworICovCisjZGVmaW5lIFNEUkNfU0hBUklOR19MT0NLX09GRgkJCQlBUk1fUkVHX1ZBTCgzMCwgMCkKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0xPQ0tfT04JCQkJQVJNX1JFR19WQUwoMzAsIDEpCisjZGVmaW5lIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfTUFTSwkJCUFSTV9SRUdfVkFMKDEyLCAweDcpCisjZGVmaW5lIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfRU5DT0RFKHYpCUFSTV9SRUdfVkFMX0VOQ09ERSgxMiwgU0RSQ19TSEFSSU5HX0NTMU1VWENGR19NQVNLLCB2KQorI2RlZmluZSBTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHX0RFQ09ERSh2KQlBUk1fUkVHX1ZBTF9ERUNPREUoMTIsIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0NTMU1VWENGR18zMl9CSVRfMzFfMAkJMHgwCisjZGVmaW5lIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfMTZfQklUXzMxXzE2CQkweDIKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0NTMU1VWENGR18xNl9CSVRfMTZfMAkJMHgzCisjZGVmaW5lIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfTUFTSwkJCUFSTV9SRUdfVkFMKDksIDB4NykKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0NTME1VWENGR19FTkNPREUodikJQVJNX1JFR19WQUxfRU5DT0RFKDksIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0NTME1VWENGR19ERUNPREUodikJQVJNX1JFR19WQUxfREVDT0RFKDksIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfTUFTSyksIHYpCisjZGVmaW5lIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfMzJfQklUXzMxXzAJCTB4MAorI2RlZmluZSBTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHXzE2X0JJVF8zMV8xNgkJMHgyCisjZGVmaW5lIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfMTZfQklUXzE2XzAJCTB4MworI2RlZmluZSBTRFJDX1NIQVJJTkdfU0RSQ1RSSVNUQVRFX09OCQlBUk1fUkVHX1ZBTCg4LCAwKQorI2RlZmluZSBTRFJDX1NIQVJJTkdfU0RSQ1RSSVNUQVRFX09GRgkJQVJNX1JFR19WQUwoOCwgMSkKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgRXJyb3IgQWRkcmVzcworICovCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIEVycm9yIFR5cGUKKyAqLworCisvKgorICogU0RSQU0gQ29udHJvbGxlciBERFIgQSBGaW5lIFR1bmluZyBDb250cm9sCisgKi8KKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfRklYRURfREVMQVlfTUFTSwkJQVJNX1JFR19WQUwoMjQsIDB4RkYpCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX0ZJWEVEX0RFTEFZX0VOQ09ERSh2KQlBUk1fUkVHX1ZBTF9FTkNPREUoMjQsIFNEUkNfRExMQV9DVFJMX0ZJWEVEX0RFTEFZX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX0ZJWEVEX0RFTEFZX0RFQ09ERSh2KQlBUk1fUkVHX1ZBTF9ERUNPREUoMjQsIFNEUkNfRExMQV9DVFJMX0ZJWEVEX0RFTEFZX01BU0ssIHYpCisKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfSU5JVF9MQVRfTUFTSwkJQVJNX1JFR19WQUwoMTYsIDB4RkYpCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX0lOSVRfTEFUX0VOQ09ERSh2KQlBUk1fUkVHX1ZBTF9FTkNPREUoMTYsIFNEUkNfRExMQV9DVFJMX0lOSVRfTEFUX01BU0ssIHYgLyAyKQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9JTklUX0xBVF9ERUNPREUodikJKEFSTV9SRUdfVkFMX0RFQ09ERSgxNiwgU0RSQ19ETExBX0NUUkxfSU5JVF9MQVRfTUFTSywgdikgKiAyKQorCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9NQVNLCUFSTV9SRUdfVkFMKDUsIDB4MykKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX0VOQ09ERSh2KQlBUk1fUkVHX1ZBTF9FTkNPREUoNSwgU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9ERUNPREUodikJQVJNX1JFR19WQUxfREVDT0RFKDUsIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9NQVNLLCB2KQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfUFdECQkJMHgwCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9JRExFCQkweDEKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX0lHTk9SRQkJMHgyCisKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfSURMRV9ESVNBQkxFCQkJQVJNX1JFR19WQUwoNCwgMCkKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfSURMRV9FTkFCTEUJCQlBUk1fUkVHX1ZBTCg0LCAxKQorCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX0RMTF9ESVNBQkxFCQkJQVJNX1JFR19WQUwoMywgMCkKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfRExMX0VOQUJMRQkJCUFSTV9SRUdfVkFMKDMsIDEpCisKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfTE9DS19UUkFDS0lOR0RFTEFZCUFSTV9SRUdfVkFMKDIsIDApCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX0xPQ0tfRklYRURERUxBWQkJQVJNX1JFR19WQUwoMiwgMSkKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgRERSIEEgRmluZSBUdW5pbmcgU3RhdHVzCisgKi8KKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgUG93ZXIgTWFuYWdlbWVudCBQb2xpY3kKKyAqLworCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX1dBS0VVUF9ERUxBWUVECQlBUk1fUkVHX1ZBTCgyNiwgMCkKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfV0FLRVVQX0lNTUVECQkJQVJNX1JFR19WQUwoMjYsIDEpCisKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfQVVUT0NPVU5UX01BU0sJCUFSTV9SRUdfVkFMKDgsIDB4RkZGRikKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfQVVUT0NPVU5UX0VOQ09ERSh2KQlBUk1fUkVHX1ZBTF9FTkNPREUoOCwgU0RSQ19QT1dFUl9SRUdfQVVUT0NPVU5UX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX0FVVE9DT1VOVF9ERUNPREUodikJQVJNX1JFR19WQUxfREVDT0RFKDgsIFNEUkNfUE9XRVJfUkVHX0FVVE9DT1VOVF9NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX1JTVF9ESVNBQkxFCUFSTV9SRUdfVkFMKDcsIDApCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fUlNUX0VOQUJMRQlBUk1fUkVHX1ZBTCg3LCAxKQorCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fSURMRV9ESVNBQkxFCUFSTV9SRUdfVkFMKDYsIDApCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fSURMRV9FTkFCTEUJQVJNX1JFR19WQUwoNiwgMSkKKworI2RlZmluZSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX01BU0sJCQlBUk1fUkVHX1ZBTCg0LCAweDMpCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfRU5DT0RFKHYpCUFSTV9SRUdfVkFMX0VOQ09ERSg0LCBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfREVDT0RFKHYpCUFSTV9SRUdfVkFMX0RFQ09ERSg0LCBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX01BU0spLCB2KQorI2RlZmluZSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX05PTkUJCQkJMHgwCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfU0VMRl9HQVRFCQkweDEKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9TRUxGX1JFRlJFU0gJCTB4MgorCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX0VYVENMS0RJU19PTgkJCUFSTV9SRUdfVkFMKDMsIDEpCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX0VYVENMS0RJU19PTgkJCUFSTV9SRUdfVkFMKDMsIDEpCisKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfUFdEX0RJU0FCTEUJCQlBUk1fUkVHX1ZBTCgyLCAwKQorI2RlZmluZSBTRFJDX1BPV0VSX1JFR19QV0RfRU5BQkxFCQkJQVJNX1JFR19WQUwoMiwgMSkKKworI2RlZmluZSBTRFJDX1BPV0VSX1JFR19QQUdFUE9MSUNZX0hQSEIJCUFSTV9SRUdfVkFMKDAsIDEpCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIE1lbW9yeSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgU0RSQ19NQ0ZHX0xPQ0tTVEFUVVNfUlcJCQkJQVJNX1JFR19WQUwoMzAsIDApCisjZGVmaW5lIFNEUkNfTUNGR19MT0NLU1RBVFVTX1JPCQkJCUFSTV9SRUdfVkFMKDMwLCAxKQorCisjZGVmaW5lIFNEUkNfTUNGR19SQVNXSURUSF9NQVNLCQkJCUFSTV9SRUdfVkFMKDI0LCAweDcpCisjZGVmaW5lIFNEUkNfTUNGR19SQVNXSURUSF9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgyNCwgU0RSQ19NQ0ZHX1JBU1dJRFRIX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTUNGR19SQVNXSURUSF9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgyNCwgU0RSQ19NQ0ZHX1JBU1dJRFRIX01BU0spLCB2KQorI2RlZmluZSBTRFJDX01DRkdfUkFTV0lEVEhfMTFfQklUUwkJCQkweDAKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBU1dJRFRIXzEyX0JJVFMJCQkJMHgxCisjZGVmaW5lIFNEUkNfTUNGR19SQVNXSURUSF8xM19CSVRTCQkJCTB4MgorI2RlZmluZSBTRFJDX01DRkdfUkFTV0lEVEhfMTRfQklUUwkJCQkweDMKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBU1dJRFRIXzE1X0JJVFMJCQkJMHg0CisjZGVmaW5lIFNEUkNfTUNGR19SQVNXSURUSF8xNl9CSVRTCQkJCTB4NQorI2RlZmluZSBTRFJDX01DRkdfUkFTV0lEVEhfMTdfQklUUwkJCQkweDYKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBU1dJRFRIXzE4X0JJVFMJCQkJMHg3CisKKyNkZWZpbmUgU0RSQ19NQ0ZHX0NBU1dJRFRIX01BU0sJCQkJQVJNX1JFR19WQUwoMjAsIDB4NykKKyNkZWZpbmUgU0RSQ19NQ0ZHX0NBU1dJRFRIX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDIwLCBTRFJDX01DRkdfQ0FTV0lEVEhfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NQ0ZHX0NBU1dJRFRIX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDIwLCBTRFJDX01DRkdfQ0FTV0lEVEhfTUFTSyksIHYpCisjZGVmaW5lIFNEUkNfTUNGR19DQVNXSURUSF81X0JJVFMJCQkJMHgwCisjZGVmaW5lIFNEUkNfTUNGR19DQVNXSURUSF82X0JJVFMJCQkJMHgxCisjZGVmaW5lIFNEUkNfTUNGR19DQVNXSURUSF83X0JJVFMJCQkJMHgyCisjZGVmaW5lIFNEUkNfTUNGR19DQVNXSURUSF84X0JJVFMJCQkJMHgzCisjZGVmaW5lIFNEUkNfTUNGR19DQVNXSURUSF85X0JJVFMJCQkJMHg0CisjZGVmaW5lIFNEUkNfTUNGR19DQVNXSURUSF8xMF9CSVRTCQkJCTB4NQorI2RlZmluZSBTRFJDX01DRkdfQ0FTV0lEVEhfMTFfQklUUwkJCQkweDYKKyNkZWZpbmUgU0RSQ19NQ0ZHX0NBU1dJRFRIXzEyX0JJVFMJCQkJMHg3CisKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfTUFTSwkJCQlBUk1fUkVHX1ZBTCgyMCwgMHgxRikKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfRU5DT0RFKHYpCQkJQVJNX1JFR19WQUxfRU5DT0RFKDIwLCBTRFJDX01DRkdfQUREUk1VWF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9ERUNPREUodikJCQlBUk1fUkVHX1ZBTF9ERUNPREUoMjAsIFNEUkNfTUNGR19BRERSTVVYX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8xICAgCQkJMHgwCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8yICAJCQkweDEKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzMgIAkJCTB4MgorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfNCAgCQkJMHgzCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV81ICAJCQkweDQKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzYJCQkJMHg1CisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV83CQkJCTB4NgorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfOAkJCQkweDcKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzkgICAJCQkweDgKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzEwICAJCQkweDkKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzExICAJCQkweEEKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzEyIAkJCTB4QgorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMTMgIAkJCTB4QworI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMTQJCQkJMHhECisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8xNQkJCQkweEUKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzE2CQkJCTB4RgorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMjMgIAkJCTB4MTYKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzI0ICAJCQkweDE3CisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8yNSAJCQkweDE4CisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8yNiAgCQkJMHgxOQorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMjcJCQkJMHgxQQorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMjgJCQkJMHgxQgorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMjkJCQkJMHgxQworCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYTEVHQUNZX0ZJWEVECQlBUk1fUkVHX1ZBTCgxOSwgMCkKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhMRUdBQ1lfRkxFWElCTEUJQVJNX1JFR19WQUwoMTksIDEpCisKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBTVNJWkVfTUFTSwkJCQlBUk1fUkVHX1ZBTCg4LCAweDNGRikKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBTVNJWkVfRU5DT0RFKHYpCQkJQVJNX1JFR19WQUxfRU5DT0RFKDgsIFNEUkNfTUNGR19SQU1TSVpFX01BU0ssICgodikgLyAyKSkKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBTVNJWkVfREVDT0RFKHYpCQkJKEFSTV9SRUdfVkFMX0RFQ09ERSg4LCBTRFJDX01DRkdfUkFNU0laRV9NQVNLLCB2KSAqIDIpCisKKyNkZWZpbmUgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX01BU0sJCUFSTV9SRUdfVkFMKDYsIDB4MykKKyNkZWZpbmUgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX0VOQ09ERSh2KQlBUk1fUkVHX1ZBTF9FTkNPREUoNiwgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9ERUNPREUodikJQVJNX1JFR19WQUxfREVDT0RFKDYsIFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9NQVNLKSwgdikKKyNkZWZpbmUgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX0JfUl9DCQkJMHgwCisjZGVmaW5lIFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9CMV9SX0IwX0MJCTB4MQorI2RlZmluZSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fUl9CX0MJCQkweDIKKworI2RlZmluZSBTRFJDX01DRkdfQjMyTk9UMTZfT0ZGCQkJCUFSTV9SRUdfVkFMKDQsIDApCisjZGVmaW5lIFNEUkNfTUNGR19CMzJOT1QxNl9PTgkJCQlBUk1fUkVHX1ZBTCg0LCAxKQorCisjZGVmaW5lIFNEUkNfTUNGR19ERUVQUERfVU5TVVBQT1JURUQJCUFSTV9SRUdfVkFMKDMsIDApCisjZGVmaW5lCVNEUkNfTUNGR19ERUVQUERfU1VQUE9SVEVECQkJQVJNX1JFR19WQUwoMywgMSkKKworI2RlZmluZSBTRFJDX01DRkdfRERSVFlQRV9NQVNLCQkJCUFSTV9SRUdfVkFMKDIsIDB4MSkKKyNkZWZpbmUgU0RSQ19NQ0ZHX0REUlRZUEVfRU5DT0RFKHYpCQkJQVJNX1JFR19WQUxfRU5DT0RFKDIsIFNEUkNfTUNGR19ERFJUWVBFX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTUNGR19ERFJUWVBFX0RFQ09ERSh2KQkJCUFSTV9SRUdfVkFMX0RFQ09ERSgyLCBTRFJDX01DRkdfRERSVFlQRV9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01DRkdfRERSVFlQRV9NT0JJTEVfRERSCQkJMAorCisjZGVmaW5lIFNEUkNfTUNGR19SQU1UWVBFX01BU0sJCQkJQVJNX1JFR19WQUwoMCwgMHgzKQorI2RlZmluZSBTRFJDX01DRkdfUkFNVFlQRV9FTkNPREUodikJCQlBUk1fUkVHX1ZBTF9FTkNPREUoMCwgU0RSQ19NQ0ZHX1JBTVRZUEVfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBTVRZUEVfREVDT0RFKHYpCQkJQVJNX1JFR19WQUxfREVDT0RFKDAsIFNEUkNfTUNGR19SQU1UWVBFX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTUNGR19SQU1UWVBFX1NEUgkJCQkJMHgwCisjZGVmaW5lIFNEUkNfTUNGR19SQU1UWVBFX0REUgkJCQkJMHgxCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIEREUiBNb2RlIFJlZ2lzdGVyIChDb3JyZXNwb25kcyAxOjEgdy8gSkVERUMgTW9kZQorICogUmVnaXN0ZXIpCisgKi8KKworI2RlZmluZSBTRFJDX01SX1pFUk9fMQkJCQkJCUFSTV9SRUdfVkFMKDEwLCAwKQorCisjZGVmaW5lIFNEUkNfTVJfV0JTVF9FTkFCTEUJCQkJCUFSTV9SRUdfVkFMKDksIDApCisjZGVmaW5lIFNEUkNfTVJfV0JTVF9ESVNBQkxFCQkJCUFSTV9SRUdfVkFMKDksIDEpCisKKyNkZWZpbmUgU0RSQ19NUl9aRVJPXzAJCQkJCQlBUk1fUkVHX1ZBTCg3LCAwKQorCisjZGVmaW5lIFNEUkNfTVJfQ0FTTF9NQVNLCQkJCQlBUk1fUkVHX1ZBTCg0LCAweDcpCisjZGVmaW5lIFNEUkNfTVJfQ0FTTF9FTkNPREUodikJCQkJQVJNX1JFR19WQUxfRU5DT0RFKDQsIFNEUkNfTVJfQ0FTTF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01SX0NBU0xfREVDT0RFKHYpCQkJCUFSTV9SRUdfVkFMX0RFQ09ERSg0LCBTRFJDX01SX0NBU0xfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NUl9DQVNMXzEJCQkJCQkJMHgxCisjZGVmaW5lIFNEUkNfTVJfQ0FTTF8yCQkJCQkJCTB4MgorI2RlZmluZSBTRFJDX01SX0NBU0xfMwkJCQkJCQkweDMKKyNkZWZpbmUgU0RSQ19NUl9DQVNMXzQJCQkJCQkJMHg0CisjZGVmaW5lIFNEUkNfTVJfQ0FTTF81CQkJCQkJCTB4NQorCisjZGVmaW5lIFNEUkNfTVJfU0lMX1NFUklBTAkJCQkJQVJNX1JFR19WQUwoMywgMCkKKyNkZWZpbmUgU0RSQ19NUl9TSUxfSU5URVJMRUFWRUQJCQkJQVJNX1JFR19WQUwoMywgMSkKKworI2RlZmluZSBTRFJDX01SX0JMX01BU0sJCQkJCQlBUk1fUkVHX1ZBTCgwLCAweDcpCisjZGVmaW5lIFNEUkNfTVJfQkxfRU5DT0RFKHYpCQkJCUFSTV9SRUdfVkFMX0VOQ09ERSgwLCBTRFJDX01SX0JMX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTVJfQkxfREVDT0RFKHYpCQkJCUFSTV9SRUdfVkFMX0RFQ09ERSgwLCBTRFJDX01SX0JMX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTVJfQkxfMQkJCQkJCQkweDAKKyNkZWZpbmUgU0RSQ19NUl9CTF8yCQkJCQkJCTB4MQorI2RlZmluZSBTRFJDX01SX0JMXzQJCQkJCQkJMHgyCisjZGVmaW5lIFNEUkNfTVJfQkxfOAkJCQkJCQkweDMKKyNkZWZpbmUgU0RSQ19NUl9CTF9GVUxMX1BBR0UJCQkJCTB4NworCisvKgorICogU0RSQU0gQ29udHJvbGxlciBERFIgRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciAoQ29ycmVzcG9uZHMgMToxIHcvCisgKiBKRURFQyBNb2RlIFJlZ2lzdGVyKQorICovCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIEFDIFRpbWluZyBDb250cm9sIEEKKyAqLworI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSRkNfTUFTSwkJCUFSTV9SRUdfVkFMKDI3LCAweDFGKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSRkNfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMjcsIFNEUkNfQUNUSU1fQ1RSTEFfVFJGQ19NQVNLLCB2KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSRkNfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMjcsIFNEUkNfQUNUSU1fQ1RSTEFfVFJGQ19NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSQ19NQVNLCQkJQVJNX1JFR19WQUwoMjIsIDB4MUYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJDX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDIyLCBTRFJDX0FDVElNX0NUUkxBX1RSQ19NQVNLLCB2KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSQ19ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgyMiwgU0RSQ19BQ1RJTV9DVFJMQV9UUkNfTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUkFTX01BU0sJCQlBUk1fUkVHX1ZBTCgxOCwgMHhGKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSQVNfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMTgsIFNEUkNfQUNUSU1fQ1RSTEFfVFJBU19NQVNLLCB2KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSQVNfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMTgsIFNEUkNfQUNUSU1fQ1RSTEFfVFJBU19NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSUF9NQVNLCQkJQVJNX1JFR19WQUwoMTUsIDB4NykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUlBfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMTUsIFNEUkNfQUNUSU1fQ1RSTEFfVFJQX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJQX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDE1LCBTRFJDX0FDVElNX0NUUkxBX1RSUF9NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSQ0RfTUFTSwkJCUFSTV9SRUdfVkFMKDEyLCAweDcpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJDRF9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgxMiwgU0RSQ19BQ1RJTV9DVFJMQV9UUkNEX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJDRF9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgxMiwgU0RSQ19BQ1RJTV9DVFJMQV9UUkNEX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJSRF9NQVNLCQkJQVJNX1JFR19WQUwoOSwgMHg3KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSUkRfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoOSwgU0RSQ19BQ1RJTV9DVFJMQV9UUlJEX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJSRF9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSg5LCBTRFJDX0FDVElNX0NUUkxBX1RSUkRfTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9URFBMX01BU0sJCQlBUk1fUkVHX1ZBTCg2LCAweDcpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVERQTF9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSg2LCBTRFJDX0FDVElNX0NUUkxBX1REUExfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9URFBMX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDYsIFNEUkNfQUNUSU1fQ1RSTEFfVERQTF9NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1REQUxfTUFTSwkJCUFSTV9SRUdfVkFMKDAsIDB4MUYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVERBTF9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgwLCBTRFJDX0FDVElNX0NUUkxBX1REQUxfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UREFMX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDAsIFNEUkNfQUNUSU1fQ1RSTEFfVERBTF9NQVNLKSwgdikKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgQUMgVGltaW5nIENvbnRyb2wgQgorICovCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfVFdUUl9NQVNLCQkJQVJNX1JFR19WQUwoMTYsIDB4MykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl9UV1RSX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDE2LCBTRFJDX0FDVElNX0NUUkxCX1RXVFJfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl9UV1RSX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDE2LCBTRFJDX0FDVElNX0NUUkxCX1RXVFJfTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFX01BU0sJCQlBUk1fUkVHX1ZBTCgxMiwgMHg3KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCX1RDS0VfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMTIsIFNEUkNfQUNUSU1fQ1RSTEJfVENLRV9NQVNLLCB2KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCX1RDS0VfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMTIsIFNEUkNfQUNUSU1fQ1RSTEJfVENLRV9NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCX1RYUF9NQVNLCQkJQVJNX1JFR19WQUwoOCwgMHg3KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCX1RYUF9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSg4LCBTRFJDX0FDVElNX0NUUkxCX1RYUF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCX1RYUF9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSg4LCBTRFJDX0FDVElNX0NUUkxCX1RYUF9NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCX1RYU1JfTUFTSwkJCUFSTV9SRUdfVkFMKDAsIDB4RkYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfVFhTUl9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgwLCBTRFJDX0FDVElNX0NUUkxCX1RYU1JfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl9UWFNSX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDAsIFNEUkNfQUNUSU1fQ1RSTEJfVFhTUl9NQVNLKSwgdikKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgQXV0b3JlZnJlc2ggQ29udHJvbAorICovCisjZGVmaW5lIFNEUkNfUkZSX0NUUkxfQVJDVl9NQVNLCQkJCUFSTV9SRUdfVkFMKDgsIDB4RkZGRikKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTF9BUkNWX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDgsIFNEUkNfUkZSX0NUUkxfQVJDVl9NQVNLLCB2KQorI2RlZmluZSBTRFJDX1JGUl9DVFJMX0FSQ1ZfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoOCwgU0RSQ19SRlJfQ1RSTF9BUkNWX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfUkZSX0NUUkxfQVJFX01BU0sJCQkJQVJNX1JFR19WQUwoMCwgMHgzKQorI2RlZmluZSBTRFJDX1JGUl9DVFJMX0FSRV9FTkNPREUodikJCQlBUk1fUkVHX1ZBTF9FTkNPREUoMCwgU0RSQ19SRlJfQ1RSTF9BUkVfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTF9BUkVfREVDT0RFKHYpCQkJQVJNX1JFR19WQUxfREVDT0RFKDAsIFNEUkNfUkZSX0NUUkxfQVJFX01BU0spLCB2KQorI2RlZmluZSBTRFJDX1JGUl9DVFJMX0FSRV9ESVNBQkxFRAkJCQkweDAKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTF9BUkVfMV9BUkNWCQkJCTB4MQorI2RlZmluZSBTRFJDX1JGUl9DVFJMX0FSRV80X0FSQ1YJCQkJMHgyCisjZGVmaW5lIFNEUkNfUkZSX0NUUkxfQVJFXzhfQVJDVgkJCQkweDMKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgTWFudWFsIENvbnRyb2wKKyAqLworI2RlZmluZSBTRFJDX01BTlVBTF9DTURQQVJBTV9NQVNLCQkJQVJNX1JFR19WQUwoMTYsIDB4RkZGRikKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EUEFSQU1fRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMTYsIFNEUkNfTUFOVUFMX0NNRFBBUkFNX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRFBBUkFNX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDE2LCBTRFJDX01BTlVBTF9DTURQQVJBTV9NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX01BTlVBTF9DTURDT0RFX01BU0sJCQlBUk1fUkVHX1ZBTCgwLCAweDcpCisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMCwgU0RSQ19NQU5VQUxfQ01EQ09ERV9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01BTlVBTF9DTURDT0RFX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDAsIFNEUkNfTUFOVUFMX0NNRENPREVfTUFTSyksIHYpCisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRENPREVfTk9QCQkJCQkweDAKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EQ09ERV9QUkVDSEFSR0VfQUxMCQkweDEKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSAkJCTB4MgorI2RlZmluZSBTRFJDX01BTlVBTF9DTURDT0RFX0VOVEVSX1BXRAkJCTB4MworI2RlZmluZSBTRFJDX01BTlVBTF9DTURDT0RFX0VYSVRfUFdECQkJMHg0CisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRENPREVfRU5URVJfU0VMRlJFRlJFU0gJMHg1CisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRENPREVfRVhJVF9TRUxGUkVGUkVTSAkweDYKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EQ09ERV9TRVRfQ0tFX0hJR0gJCTB4NworI2RlZmluZSBTRFJDX01BTlVBTF9DTURDT0RFX1NFVF9DS0VfTE9XCQkJMHg4CisKKyNlbmRpZiAvKiBfT01BUDNfU0RSQ19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3NpemVzLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3NpemVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiYTE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc2l6ZXMuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcJIFVTQQorICovCisvKiAgU2l6ZSBkZWZpbnRpb25zCisgKiAgQ29weXJpZ2h0IChDKSBBUk0gTGltaXRlZCAxOTk4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpZm5kZWYgX19zaXplc19oCisjZGVmaW5lIF9fc2l6ZXNfaAkJCTEKKworLyogaGFuZHkgc2l6ZXMgKi8KKyNkZWZpbmUgU1pfMUsJCQkJMHgwMDAwMDQwMAorI2RlZmluZSBTWl80SwkJCQkweDAwMDAxMDAwCisjZGVmaW5lIFNaXzhLCQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgU1pfMTZLCQkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgU1pfMzJLCQkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgU1pfNjRLCQkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgU1pfMTI4SwkJCQkweDAwMDIwMDAwCisjZGVmaW5lIFNaXzI1NksJCQkJMHgwMDA0MDAwMAorI2RlZmluZSBTWl81MTJLCQkJCTB4MDAwODAwMDAKKworI2RlZmluZSBTWl8xTQkJCQkweDAwMTAwMDAwCisjZGVmaW5lIFNaXzJNCQkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgU1pfNE0JCQkJMHgwMDQwMDAwMAorI2RlZmluZSBTWl84TQkJCQkweDAwODAwMDAwCisjZGVmaW5lIFNaXzE2TQkJCQkweDAxMDAwMDAwCisjZGVmaW5lIFNaXzMxTQkJCQkweDAxRjAwMDAwCisjZGVmaW5lIFNaXzMyTQkJCQkweDAyMDAwMDAwCisjZGVmaW5lIFNaXzY0TQkJCQkweDA0MDAwMDAwCisjZGVmaW5lIFNaXzEyOE0JCQkJMHgwODAwMDAwMAorI2RlZmluZSBTWl8yNTZNCQkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgU1pfNTEyTQkJCQkweDIwMDAwMDAwCisKKyNkZWZpbmUgU1pfMUcJCQkJMHg0MDAwMDAwMAorI2RlZmluZSBTWl8yRwkJCQkweDgwMDAwMDAwCisKKyNlbmRpZgkvKiBfX3NpemVzX2ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc3lzX2luZm8uaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc3lzX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWE1ZGQwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zeXNfaW5mby5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9PTUFQMzRYWF9TWVNfSU5GT19IXworI2RlZmluZSBfT01BUDM0WFhfU1lTX0lORk9fSF8KKworI2RlZmluZSBYRFJfUE9QCQk1ICAgICAgLyogcGFja2FnZSBvbiBwYWNrYWdlIHBhcnQgKi8KKyNkZWZpbmUgU0RSX0RJU0NSRVRFCTQgICAgICAvKiAxMjhNIG1lbW9yeSBTRFIgbW9kdWxlKi8KKyNkZWZpbmUgRERSX1NUQUNLRUQJMyAgICAgIC8qIHN0YWNrZWQgcGFydCBvbiAyNDIyICovCisjZGVmaW5lIEREUl9DT01CTwkyICAgICAgLyogY29tYm8gcGFydCBvbiBjcHUgZGF1Z2h0ZXIgY2FyZCAobWVuYWxhZXVzKSAqLworI2RlZmluZSBERFJfRElTQ1JFVEUJMSAgICAgIC8qIDJ4MTYgcGFydHMgb24gZGF1Z2h0ZXIgY2FyZCAqLworCisjZGVmaW5lIEREUl8xMDAJCTEwMCAgICAvKiB0eXBlIGZvdW5kIG9uIG1vc3QgbWVtIGQtYm9hcmRzICovCisjZGVmaW5lIEREUl8xMTEJCTExMSAgICAvKiBzb21lIGNvbWJvIHBhcnRzICovCisjZGVmaW5lIEREUl8xMzMJCTEzMyAgICAvKiBtb3N0IGNvbWJvLCBzb21lIG1lbSBkLWJvYXJkcyAqLworI2RlZmluZSBERFJfMTY1CQkxNjUgICAgLyogZnV0dXJlIHBhcnRzICovCisKKyNkZWZpbmUgQ1BVXzM0MzAJMHgzNDMwCisKKy8qIDM0M3ggcmVhbCBoYXJkd2FyZToKKyAqICBFUzEgICAgID0gcmV2IDAKKyAqLworCisvKiAzNDN4IGNvZGUgZGVmaW5lczoKKyAqIEVTMSAgICAgPSAwKzEgPSAxCisgKiBFUzEgICAgID0gMSsxID0gMQorICovCisjZGVmaW5lIENQVV8zNDMwX0VTMQkJMQorI2RlZmluZSBDUFVfMzQzMF9FUzIJCTIKKworLyoKKyAqIEhhd2tleWUgdmFsdWVzCisgKi8KKyNkZWZpbmUgSEFXS0VZRV9PTUFQMzRYWCAgICAgICAgMHhiN2FlCisjZGVmaW5lIEhBV0tFWUVfQU0zNVhYICAgICAgICAgIDB4Yjg2OAorI2RlZmluZSBIQVdLRVlFX09NQVAzNlhYICAgICAgICAweGI4OTEKKworI2RlZmluZSBIQVdLRVlFX1NISUZUICAgICAgICAgICAxMgorCisvKgorICogRGVmaW5lIENQVSBmYW1pbGllcworICovCisjZGVmaW5lIENQVV9PTUFQMzRYWCAgICAgICAgICAgIDB4MzQwMCAgLyogT01BUDM0eHgvT01BUDM1IGRldmljZXMgKi8KKyNkZWZpbmUgQ1BVX0FNMzVYWCAgICAgICAgICAgICAgMHgzNTAwICAvKiBBTTM1eHggZGV2aWNlcyAgICAgICAgICAqLworI2RlZmluZSBDUFVfT01BUDM2WFggICAgICAgICAgICAweDM2MDAgIC8qIE9NQVAzNnh4IGRldmljZXMgICAgICAgICovCisKKy8qIEN1cnJlbnRseSBWaXJ0aW8gbW9kZWxzIHRoaXMgb25lICovCisjZGVmaW5lIENQVV8zNDMwX0NISVBJRAkJMHgwQjY4QTAwMAorCisjZGVmaW5lIEdQTUNfTVVYRUQJCTEKKyNkZWZpbmUgR1BNQ19OT05NVVhFRAkJMAorCisjZGVmaW5lIFRZUEVfTkFORAkJMHg4MDAJLyogYml0IHBvcyBmb3IgbmFuZCBpbiBncG1jIHJlZyAqLworI2RlZmluZSBUWVBFX05PUgkJMHgwMDAKKyNkZWZpbmUgVFlQRV9PTkVOQU5ECQkweDgwMAorCisjZGVmaW5lIFdJRFRIXzhCSVQJCTB4MDAwMAorI2RlZmluZSBXSURUSF8xNkJJVAkJMHgxMDAwCS8qIGJpdCBwb3MgZm9yIDE2IGJpdCBpbiBncG1jICovCisKKyNkZWZpbmUgSTJDX01FTkVMQVVTCQkweDcyCS8qIGkyYyBpZCBmb3IgY29tcGFuaW9uIGNoaXAgKi8KKyNkZWZpbmUgSTJDX1RSSVRPTjIJCTB4NEIJLyogYWRkcmVzIG9mIHBvd2VyIGdyb3VwICovCisKKyNkZWZpbmUgQk9PVF9GQVNUX1hJUAkJMHgxZgorCisvKiBTRFAgZGVmaW5pdGlvbnMgYWNjb3JkaW5nIHRvIEZQR0EgUmV2LiBJcyB0aGlzIE9LPz8gKi8KKyNkZWZpbmUgU0RQXzM0MzBfVjEJCTB4MQorI2RlZmluZSBTRFBfMzQzMF9WMgkJMHgyCisKKyNkZWZpbmUgQk9BUkRfMzQzMF9MQUJSQURPUgkweDgwCisjZGVmaW5lIEJPQVJEXzM0MzBfTEFCUkFET1JfVjEJMHgxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zeXNfcHJvdG8uaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc3lzX3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwZmIyMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc3lzX3Byb3RvLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIC9QVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICAqLworI2lmbmRlZiBfT01BUDM0WFhfU1lTX1BST1RPX0hfCisjZGVmaW5lIF9PTUFQMzRYWF9TWVNfUFJPVE9fSF8KKwordm9pZCBwcmNtX2luaXQodm9pZCk7Cit2b2lkIHBlcl9jbG9ja3NfZW5hYmxlKHZvaWQpOworCit2b2lkIG1lbWlmX2luaXQodm9pZCk7Cit2b2lkIHNkcmNfaW5pdCh2b2lkKTsKK3ZvaWQgZG9fc2RyY19pbml0KHUzMix1MzIpOwordm9pZCBncG1jX2luaXQodm9pZCk7CisKK3ZvaWQgZXRoZXJfaW5pdCh2b2lkKTsKK3ZvaWQgd2F0Y2hkb2dfaW5pdCh2b2lkKTsKK3ZvaWQgc2V0X211eGNvbmZfcmVncyh2b2lkKTsKK3UzMiBpc19jcHVfZmFtaWx5KHZvaWQpOwordTMyIGdldF9jcHVfdHlwZSh2b2lkKTsKK3UzMiBnZXRfY3B1X3Jldih2b2lkKTsKK3UzMiBjcHVfaXNfMzQxMCh2b2lkKTsKK3UzMiBnZXRfbWVtX3R5cGUodm9pZCk7Cit1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCk7Cit1MzIgZ2V0X2dwbWMwX2Jhc2Uodm9pZCk7Cit1MzIgaXNfZ3BtY19tdXhlZCh2b2lkKTsKK3UzMiBnZXRfZ3BtYzBfdHlwZSh2b2lkKTsKK3UzMiBnZXRfZ3BtYzBfd2lkdGgodm9pZCk7Cit1MzIgZ2V0X2JvYXJkX3R5cGUodm9pZCk7Cit2b2lkIGRpc3BsYXlfYm9hcmRfaW5mbyh1MzIpOwordm9pZCB1cGRhdGVfbXV4KHUzMix1MzIpOwordTMyIGdldF9zZHJfY3Nfc2l6ZSh1MzIgb2Zmc2V0KTsKK3UzMiBydW5uaW5nX2luX3NkcmFtKHZvaWQpOwordTMyIHJ1bm5pbmdfaW5fc3JhbSh2b2lkKTsKK3UzMiBydW5uaW5nX2luX2ZsYXNoKHZvaWQpOwordTMyIHJ1bm5pbmdfZnJvbV9pbnRlcm5hbF9ib290KHZvaWQpOwordTMyIGdldF9kZXZpY2VfdHlwZSh2b2lkKTsKKwordm9pZCBzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSk7Cit1MzIgd2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpOwordm9pZCBzZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXRvbWljLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTllNGI3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2F0b21pYy5oCisgKgorICogIENvcHlyaWdodCAoYykgMTk5NiBSdXNzZWxsIEtpbmcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ2hhbmdlbG9nOgorICogICAyNy0wNi0xOTk2CVJNSwlDcmVhdGVkCisgKiAgIDEzLTA0LTE5OTcJUk1LCU1hZGUgZnVuY3Rpb25zIGF0b21pYyEKKyAqICAgMDctMTItMTk5NwlSTUsJVXBncmFkZWQgZm9yIHYyLjEuCisgKiAgIDI2LTA4LTE5OTgJUEpCCUFkZGVkICNpZmRlZiBfX0tFUk5FTF9fCisgKi8KKyNpZm5kZWYgX19BU01fQVJNX0FUT01JQ19ICisjZGVmaW5lIF9fQVNNX0FSTV9BVE9NSUNfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfU01QCisjZXJyb3IgU01QIG5vdCBzdXBwb3J0ZWQKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworCisjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxhc20vcHJvYy9zeXN0ZW0uaD4KKworI2RlZmluZSBhdG9taWNfcmVhZCh2KQkoKHYpLT5jb3VudGVyKQorI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJKCgodiktPmNvdW50ZXIpID0gKGkpKQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgdm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl2LT5jb3VudGVyICs9IGk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgdm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl2LT5jb3VudGVyIC09IGk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2luYyh2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXYtPmNvdW50ZXIgKz0gMTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfZGVjKHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdi0+Y291bnRlciAtPSAxOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2RlY19hbmRfdGVzdCh2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB2YWw7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdmFsID0gdi0+Y291bnRlcjsKKwl2LT5jb3VudGVyID0gdmFsIC09IDE7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHZhbCA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfYWRkX25lZ2F0aXZlKGludCBpLCB2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB2YWw7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdmFsID0gdi0+Y291bnRlcjsKKwl2LT5jb3VudGVyID0gdmFsICs9IGk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHZhbCA8IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfY2xlYXJfbWFzayh1bnNpZ25lZCBsb25nIG1hc2ssIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkqYWRkciAmPSB+bWFzazsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qIEF0b21pYyBvcGVyYXRpb25zIGFyZSBhbHJlYWR5IHNlcmlhbGl6aW5nIG9uIEFSTSAqLworI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfZGVjKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpCWJhcnJpZXIoKQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMzQ4OWYxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYnl0ZW9yZGVyLmgKKyAqCisgKiBBUk0gRW5kaWFuLW5lc3MuICBJbiBsaXR0bGUgZW5kaWFuIG1vZGUsIHRoZSBkYXRhIGJ1cyBpcyBjb25uZWN0ZWQgc3VjaAorICogdGhhdCBieXRlIGFjY2Vzc2VzIGFwcGVhciBhczoKKyAqICAwID0gZDAuLi5kNywgMSA9IGQ4Li4uZDE1LCAyID0gZDE2Li4uZDIzLCAzID0gZDI0Li4uZDMxCisgKiBhbmQgd29yZCBhY2Nlc3NlcyAoZGF0YSBvciBpbnN0cnVjdGlvbikgYXBwZWFyIGFzOgorICogIGQwLi4uZDMxCisgKgorICogV2hlbiBpbiBiaWcgZW5kaWFuIG1vZGUsIGJ5dGUgYWNjZXNzZXMgYXBwZWFyIGFzOgorICogIDAgPSBkMjQuLi5kMzEsIDEgPSBkMTYuLi5kMjMsIDIgPSBkOC4uLmQxNSwgMyA9IGQwLi4uZDcKKyAqIGFuZCB3b3JkIGFjY2Vzc2VzIChkYXRhIG9yIGluc3RydWN0aW9uKSBhcHBlYXIgYXM6CisgKiAgZDAuLi5kMzEKKyAqLworI2lmbmRlZiBfX0FTTV9BUk1fQllURU9SREVSX0gKKyNkZWZpbmUgX19BU01fQVJNX0JZVEVPUkRFUl9ICisKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCisjICBkZWZpbmUgX19CWVRFT1JERVJfSEFTX1U2NF9fCisjICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworI2VuZGlmCisKKyNpZmRlZiBfX0FSTUVCX18KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vY29uZmlnLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGY5OGY5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vY29uZmlnLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9BU01fQ09ORklHX0hfCisjZGVmaW5lIF9BU01fQ09ORklHX0hfCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vaW8uaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxNTE4ZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2lvLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zOgorICogIDE2LVNlcC0xOTk2CVJNSwlJbmxpbmVkIHRoZSBpbngvb3V0eCBmdW5jdGlvbnMgJiBvcHRpbWlzZWQgZm9yIGJvdGgKKyAqCQkJY29uc3RhbnQgYWRkcmVzc2VzIGFuZCB2YXJpYWJsZSBhZGRyZXNzZXMuCisgKiAgMDQtRGVjLTE5OTcJUk1LCU1vdmVkIGEgbG90IG9mIHRoaXMgc3R1ZmYgdG8gdGhlIG5ldyBhcmNoaXRlY3R1cmUKKyAqCQkJc3BlY2lmaWMgSU8gaGVhZGVyIGZpbGVzLgorICogIDI3LU1hci0xOTk5CVBKQglTZWNvbmQgcGFyYW1ldGVyIG9mIG1lbWNweV90b2lvIGlzIGNvbnN0Li4KKyAqICAwNC1BcHItMTk5OQlQSkIJQWRkZWQgY2hlY2tfc2lnbmF0dXJlLgorICogIDEyLURlYy0xOTk5CVJNSwlNb3JlIGNsZWFudXBzCisgKiAgMTgtSnVuLTIwMDAgUk1LCVJlbW92ZWQgdmlydF90b18qIGFuZCBmcmllbmRzIGRlZmluaXRpb25zCisgKi8KKyNpZm5kZWYgX19BU01fQVJNX0lPX0gKKyNkZWZpbmUgX19BU01fQVJNX0lPX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KKyNpZiAwCS8qIFhYWCMjI1hYWCAqLworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjZW5kaWYJLyogWFhYIyMjWFhYICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeW5jKHZvaWQpCit7Cit9CisKKy8qCisgKiBHaXZlbiBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIGEgbGVuZ3RoLCByZXR1cm4gYSB2aXJ0dWFsIGFkZHJlc3MKKyAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBtZW1vcnkgcmFuZ2Ugd2l0aCB0aGUgY2FjaGluZworICogcHJvcGVydGllcyBzcGVjaWZpZWQgYnkgImZsYWdzIi4KKyAqLworI2RlZmluZSBNQVBfTk9DQUNIRQkoMCkKKyNkZWZpbmUgTUFQX1dSQ09NQklORQkoMCkKKyNkZWZpbmUgTUFQX1dSQkFDSwkoMCkKKyNkZWZpbmUgTUFQX1dSVEhST1VHSAkoMCkKKworc3RhdGljIGlubGluZSB2b2lkICoKK21hcF9waHlzbWVtKHBoeXNfYWRkcl90IHBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gKHZvaWQgKilwYWRkcjsKK30KKworLyoKKyAqIFRha2UgZG93biBhIG1hcHBpbmcgc2V0IHVwIGJ5IG1hcF9waHlzbWVtKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bm1hcF9waHlzbWVtKHZvaWQgKnZhZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCit9CisKK3N0YXRpYyBpbmxpbmUgcGh5c19hZGRyX3QgdmlydF90b19waHlzKHZvaWQgKiB2YWRkcikKK3sKKwlyZXR1cm4gKHBoeXNfYWRkcl90KSh2YWRkcik7Cit9CisKKy8qCisgKiBHZW5lcmljIHZpcnR1YWwgcmVhZC93cml0ZS4gIE5vdGUgdGhhdCB3ZSBkb24ndCBzdXBwb3J0IGhhbGYtd29yZAorICogcmVhZC93cml0ZXMuICBXZSBkZWZpbmUgX19hcmNoXypbYmxdIGhlcmUsIGFuZCBsZWF2ZSBfX2FyY2hfKncKKyAqIHRvIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29kZS4KKyAqLworI2RlZmluZSBfX2FyY2hfZ2V0YihhKQkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoYSkpCisjZGVmaW5lIF9fYXJjaF9nZXR3KGEpCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoYSkpCisjZGVmaW5lIF9fYXJjaF9nZXRsKGEpCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGEpKQorCisjZGVmaW5lIF9fYXJjaF9wdXRiKHYsYSkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoYSkgPSAodikpCisjZGVmaW5lIF9fYXJjaF9wdXR3KHYsYSkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKGEpID0gKHYpKQorI2RlZmluZSBfX2FyY2hfcHV0bCh2LGEpCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYSkgPSAodikpCisKK2V4dGVybiBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZXNiKHVuc2lnbmVkIGludCBhZGRyLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgYnl0ZWxlbikKK3sKKwl1aW50OF90ICpidWYgPSAodWludDhfdCAqKWRhdGE7CisJd2hpbGUoYnl0ZWxlbi0tKQorCQlfX2FyY2hfcHV0YigqYnVmKyssIGFkZHIpOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgX19yYXdfd3JpdGVzdyh1bnNpZ25lZCBpbnQgYWRkciwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IHdvcmRsZW4pCit7CisJdWludDE2X3QgKmJ1ZiA9ICh1aW50MTZfdCAqKWRhdGE7CisJd2hpbGUod29yZGxlbi0tKQorCQlfX2FyY2hfcHV0dygqYnVmKyssIGFkZHIpOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgX19yYXdfd3JpdGVzbCh1bnNpZ25lZCBpbnQgYWRkciwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxvbmdsZW4pCit7CisJdWludDMyX3QgKmJ1ZiA9ICh1aW50MzJfdCAqKWRhdGE7CisJd2hpbGUobG9uZ2xlbi0tKQorCQlfX2FyY2hfcHV0bCgqYnVmKyssIGFkZHIpOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgX19yYXdfcmVhZHNiKHVuc2lnbmVkIGludCBhZGRyLCB2b2lkICpkYXRhLCBpbnQgYnl0ZWxlbikKK3sKKwl1aW50OF90ICpidWYgPSAodWludDhfdCAqKWRhdGE7CisJd2hpbGUoYnl0ZWxlbi0tKQorCQkqYnVmKysgPSBfX2FyY2hfZ2V0YihhZGRyKTsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIF9fcmF3X3JlYWRzdyh1bnNpZ25lZCBpbnQgYWRkciwgdm9pZCAqZGF0YSwgaW50IHdvcmRsZW4pCit7CisJdWludDE2X3QgKmJ1ZiA9ICh1aW50MTZfdCAqKWRhdGE7CisJd2hpbGUod29yZGxlbi0tKQorCQkqYnVmKysgPSBfX2FyY2hfZ2V0dyhhZGRyKTsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIF9fcmF3X3JlYWRzbCh1bnNpZ25lZCBpbnQgYWRkciwgdm9pZCAqZGF0YSwgaW50IGxvbmdsZW4pCit7CisJdWludDMyX3QgKmJ1ZiA9ICh1aW50MzJfdCAqKWRhdGE7CisJd2hpbGUobG9uZ2xlbi0tKQorCQkqYnVmKysgPSBfX2FyY2hfZ2V0bChhZGRyKTsKK30KKworI2RlZmluZSBfX3Jhd193cml0ZWIodixhKQkJX19hcmNoX3B1dGIodixhKQorI2RlZmluZSBfX3Jhd193cml0ZXcodixhKQkJX19hcmNoX3B1dHcodixhKQorI2RlZmluZSBfX3Jhd193cml0ZWwodixhKQkJX19hcmNoX3B1dGwodixhKQorCisjZGVmaW5lIF9fcmF3X3JlYWRiKGEpCQkJX19hcmNoX2dldGIoYSkKKyNkZWZpbmUgX19yYXdfcmVhZHcoYSkJCQlfX2FyY2hfZ2V0dyhhKQorI2RlZmluZSBfX3Jhd19yZWFkbChhKQkJCV9fYXJjaF9nZXRsKGEpCisKKyNkZWZpbmUgd3JpdGViKHYsYSkJCQlfX2FyY2hfcHV0Yih2LGEpCisjZGVmaW5lIHdyaXRldyh2LGEpCQkJX19hcmNoX3B1dHcodixhKQorI2RlZmluZSB3cml0ZWwodixhKQkJCV9fYXJjaF9wdXRsKHYsYSkKKworI2RlZmluZSByZWFkYihhKQkJCV9fYXJjaF9nZXRiKGEpCisjZGVmaW5lIHJlYWR3KGEpCQkJX19hcmNoX2dldHcoYSkKKyNkZWZpbmUgcmVhZGwoYSkJCQlfX2FyY2hfZ2V0bChhKQorCisvKgorICogVGhlIGNvbXBpbGVyIHNlZW1zIHRvIGJlIGluY2FwYWJsZSBvZiBvcHRpbWlzaW5nIGNvbnN0YW50cworICogcHJvcGVybHkuICBTcGVsbCBpdCBvdXQgdG8gdGhlIGNvbXBpbGVyIGluIHNvbWUgY2FzZXMuCisgKiBUaGVzZSBhcmUgb25seSB2YWxpZCBmb3Igc21hbGwgdmFsdWVzIG9mICJvZmYiICg8IDE8PDEyKQorICovCisjZGVmaW5lIF9fcmF3X2Jhc2Vfd3JpdGViKHZhbCxiYXNlLG9mZikJX19hcmNoX2Jhc2VfcHV0Yih2YWwsYmFzZSxvZmYpCisjZGVmaW5lIF9fcmF3X2Jhc2Vfd3JpdGV3KHZhbCxiYXNlLG9mZikJX19hcmNoX2Jhc2VfcHV0dyh2YWwsYmFzZSxvZmYpCisjZGVmaW5lIF9fcmF3X2Jhc2Vfd3JpdGVsKHZhbCxiYXNlLG9mZikJX19hcmNoX2Jhc2VfcHV0bCh2YWwsYmFzZSxvZmYpCisKKyNkZWZpbmUgX19yYXdfYmFzZV9yZWFkYihiYXNlLG9mZikJX19hcmNoX2Jhc2VfZ2V0YihiYXNlLG9mZikKKyNkZWZpbmUgX19yYXdfYmFzZV9yZWFkdyhiYXNlLG9mZikJX19hcmNoX2Jhc2VfZ2V0dyhiYXNlLG9mZikKKyNkZWZpbmUgX19yYXdfYmFzZV9yZWFkbChiYXNlLG9mZikJX19hcmNoX2Jhc2VfZ2V0bChiYXNlLG9mZikKKworLyoKKyAqIENsZWFyIGFuZCBzZXQgYml0cyBpbiBvbmUgc2hvdC4gVGhlc2UgbWFjcm9zIGNhbiBiZSB1c2VkIHRvIGNsZWFyIGFuZAorICogc2V0IG11bHRpcGxlIGJpdHMgaW4gYSByZWdpc3RlciB1c2luZyBhIHNpbmdsZSBjYWxsLiBUaGVzZSBtYWNyb3MgY2FuCisgKiBhbHNvIGJlIHVzZWQgdG8gc2V0IGEgbXVsdGlwbGUtYml0IGJpdCBwYXR0ZXJuIHVzaW5nIGEgbWFzaywgYnkKKyAqIHNwZWNpZnlpbmcgdGhlIG1hc2sgaW4gdGhlICdjbGVhcicgcGFyYW1ldGVyIGFuZCB0aGUgbmV3IGJpdCBwYXR0ZXJuCisgKiBpbiB0aGUgJ3NldCcgcGFyYW1ldGVyLgorICovCisKKyNkZWZpbmUgb3V0X2FyY2godHlwZSxlbmRpYW4sYSx2KQlfX3Jhd193cml0ZSMjdHlwZShjcHVfdG9fIyNlbmRpYW4odiksYSkKKyNkZWZpbmUgaW5fYXJjaCh0eXBlLGVuZGlhbixhKQkJZW5kaWFuIyNfdG9fY3B1KF9fcmF3X3JlYWQjI3R5cGUoYSkpCisKKyNkZWZpbmUgb3V0X2xlMzIoYSx2KQlvdXRfYXJjaChsLGxlMzIsYSx2KQorI2RlZmluZSBvdXRfbGUxNihhLHYpCW91dF9hcmNoKHcsbGUxNixhLHYpCisKKyNkZWZpbmUgaW5fbGUzMihhKQlpbl9hcmNoKGwsbGUzMixhKQorI2RlZmluZSBpbl9sZTE2KGEpCWluX2FyY2godyxsZTE2LGEpCisKKyNkZWZpbmUgb3V0X2JlMzIoYSx2KQlvdXRfYXJjaChsLGJlMzIsYSx2KQorI2RlZmluZSBvdXRfYmUxNihhLHYpCW91dF9hcmNoKHcsYmUxNixhLHYpCisKKyNkZWZpbmUgaW5fYmUzMihhKQlpbl9hcmNoKGwsYmUzMixhKQorI2RlZmluZSBpbl9iZTE2KGEpCWluX2FyY2godyxiZTE2LGEpCisKKyNkZWZpbmUgb3V0XzgoYSx2KQlfX3Jhd193cml0ZWIodixhKQorI2RlZmluZSBpbl84KGEpCQlfX3Jhd19yZWFkYihhKQorCisjZGVmaW5lIGNscmJpdHModHlwZSwgYWRkciwgY2xlYXIpIFwKKwlvdXRfIyN0eXBlKChhZGRyKSwgaW5fIyN0eXBlKGFkZHIpICYgfihjbGVhcikpCisKKyNkZWZpbmUgc2V0Yml0cyh0eXBlLCBhZGRyLCBzZXQpIFwKKwlvdXRfIyN0eXBlKChhZGRyKSwgaW5fIyN0eXBlKGFkZHIpIHwgKHNldCkpCisKKyNkZWZpbmUgY2xyc2V0Yml0cyh0eXBlLCBhZGRyLCBjbGVhciwgc2V0KSBcCisJb3V0XyMjdHlwZSgoYWRkciksIChpbl8jI3R5cGUoYWRkcikgJiB+KGNsZWFyKSkgfCAoc2V0KSkKKworI2RlZmluZSBjbHJiaXRzX2JlMzIoYWRkciwgY2xlYXIpIGNscmJpdHMoYmUzMiwgYWRkciwgY2xlYXIpCisjZGVmaW5lIHNldGJpdHNfYmUzMihhZGRyLCBzZXQpIHNldGJpdHMoYmUzMiwgYWRkciwgc2V0KQorI2RlZmluZSBjbHJzZXRiaXRzX2JlMzIoYWRkciwgY2xlYXIsIHNldCkgY2xyc2V0Yml0cyhiZTMyLCBhZGRyLCBjbGVhciwgc2V0KQorCisjZGVmaW5lIGNscmJpdHNfbGUzMihhZGRyLCBjbGVhcikgY2xyYml0cyhsZTMyLCBhZGRyLCBjbGVhcikKKyNkZWZpbmUgc2V0Yml0c19sZTMyKGFkZHIsIHNldCkgc2V0Yml0cyhsZTMyLCBhZGRyLCBzZXQpCisjZGVmaW5lIGNscnNldGJpdHNfbGUzMihhZGRyLCBjbGVhciwgc2V0KSBjbHJzZXRiaXRzKGxlMzIsIGFkZHIsIGNsZWFyLCBzZXQpCisKKyNkZWZpbmUgY2xyYml0c19iZTE2KGFkZHIsIGNsZWFyKSBjbHJiaXRzKGJlMTYsIGFkZHIsIGNsZWFyKQorI2RlZmluZSBzZXRiaXRzX2JlMTYoYWRkciwgc2V0KSBzZXRiaXRzKGJlMTYsIGFkZHIsIHNldCkKKyNkZWZpbmUgY2xyc2V0Yml0c19iZTE2KGFkZHIsIGNsZWFyLCBzZXQpIGNscnNldGJpdHMoYmUxNiwgYWRkciwgY2xlYXIsIHNldCkKKworI2RlZmluZSBjbHJiaXRzX2xlMTYoYWRkciwgY2xlYXIpIGNscmJpdHMobGUxNiwgYWRkciwgY2xlYXIpCisjZGVmaW5lIHNldGJpdHNfbGUxNihhZGRyLCBzZXQpIHNldGJpdHMobGUxNiwgYWRkciwgc2V0KQorI2RlZmluZSBjbHJzZXRiaXRzX2xlMTYoYWRkciwgY2xlYXIsIHNldCkgY2xyc2V0Yml0cyhsZTE2LCBhZGRyLCBjbGVhciwgc2V0KQorCisjZGVmaW5lIGNscmJpdHNfOChhZGRyLCBjbGVhcikgY2xyYml0cyg4LCBhZGRyLCBjbGVhcikKKyNkZWZpbmUgc2V0Yml0c184KGFkZHIsIHNldCkgc2V0Yml0cyg4LCBhZGRyLCBzZXQpCisjZGVmaW5lIGNscnNldGJpdHNfOChhZGRyLCBjbGVhciwgc2V0KSBjbHJzZXRiaXRzKDgsIGFkZHIsIGNsZWFyLCBzZXQpCisKKy8qCisgKiBOb3csIHBpY2sgdXAgdGhlIG1hY2hpbmUtZGVmaW5lZCBJTyBkZWZpbml0aW9ucworICovCisjaWYgMAkvKiBYWFgjIyNYWFggKi8KKyNpbmNsdWRlIDxhc20vYXJjaC9pby5oPgorI2VuZGlmCS8qIFhYWCMjI1hYWCAqLworCisvKgorICogIElPIHBvcnQgYWNjZXNzIHByaW1pdGl2ZXMKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhlIEFSTSBkb2Vzbid0IGhhdmUgc3BlY2lhbCBJTyBhY2Nlc3MgaW5zdHJ1Y3Rpb25zOyBhbGwgSU8gaXMgbWVtb3J5CisgKiBtYXBwZWQuICBOb3RlIHRoYXQgdGhlc2UgYXJlIGRlZmluZWQgdG8gcGVyZm9ybSBsaXR0bGUgZW5kaWFuIGFjY2Vzc2VzCisgKiBvbmx5LiAgVGhlaXIgcHJpbWFyeSBwdXJwb3NlIGlzIHRvIGFjY2VzcyBQQ0kgYW5kIElTQSBwZXJpcGhlcmFscy4KKyAqCisgKiBOb3RlIHRoYXQgZm9yIGEgYmlnIGVuZGlhbiBtYWNoaW5lLCB0aGlzIGltcGxpZXMgdGhhdCB0aGUgZm9sbG93aW5nCisgKiBiaWcgZW5kaWFuIG1vZGUgY29ubmVjdGl2aXR5IGlzIGluIHBsYWNlLCBhcyBkZXNjcmliZWQgYnkgbnVtZXJvdXMKKyAqIEFSTSBkb2N1bWVudHM6CisgKgorICogICAgUENJOiAgRDAtRDcgICBEOC1EMTUgRDE2LUQyMyBEMjQtRDMxCisgKiAgICBBUk06IEQyNC1EMzEgRDE2LUQyMyAgRDgtRDE1ICBEMC1ENworICoKKyAqIFRoZSBtYWNoaW5lIHNwZWNpZmljIGlvLmggaW5jbHVkZSBkZWZpbmVzIF9faW8gdG8gdHJhbnNsYXRlIGFuICJJTyIKKyAqIGFkZHJlc3MgdG8gYSBtZW1vcnkgYWRkcmVzcy4KKyAqCisgKiBOb3RlIHRoYXQgd2UgcHJldmVudCBHQ0MgcmUtb3JkZXJpbmcgb3IgY2FjaGluZyB2YWx1ZXMgaW4gZXhwcmVzc2lvbnMKKyAqIGJ5IGludHJvZHVjaW5nIHNlcXVlbmNlIHBvaW50cyBpbnRvIHRoZSBpbiooKSBkZWZpbml0aW9ucy4gIE5vdGUgdGhhdAorICogX19yYXdfKiBkbyBub3QgZ3VhcmFudGVlIHRoaXMgYmVoYXZpb3VyLgorICoKKyAqIFRoZSB7aW4sb3V0fVtid2xdIG1hY3JvcyBhcmUgZm9yIGVtdWxhdGluZyB4ODYtc3R5bGUgUENJL0lTQSBJTyBzcGFjZS4KKyAqLworI2lmZGVmIF9faW8KKyNkZWZpbmUgb3V0Yih2LHApCQkJX19yYXdfd3JpdGViKHYsX19pbyhwKSkKKyNkZWZpbmUgb3V0dyh2LHApCQkJX19yYXdfd3JpdGV3KGNwdV90b19sZTE2KHYpLF9faW8ocCkpCisjZGVmaW5lIG91dGwodixwKQkJCV9fcmF3X3dyaXRlbChjcHVfdG9fbGUzMih2KSxfX2lvKHApKQorCisjZGVmaW5lIGluYihwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gX19yYXdfcmVhZGIoX19pbyhwKSk7IF9fdjsgfSkKKyNkZWZpbmUgaW53KHApCSh7IHVuc2lnbmVkIGludCBfX3YgPSBsZTE2X3RvX2NwdShfX3Jhd19yZWFkdyhfX2lvKHApKSk7IF9fdjsgfSkKKyNkZWZpbmUgaW5sKHApCSh7IHVuc2lnbmVkIGludCBfX3YgPSBsZTMyX3RvX2NwdShfX3Jhd19yZWFkbChfX2lvKHApKSk7IF9fdjsgfSkKKworI2RlZmluZSBvdXRzYihwLGQsbCkJCQlfX3Jhd193cml0ZXNiKF9faW8ocCksZCxsKQorI2RlZmluZSBvdXRzdyhwLGQsbCkJCQlfX3Jhd193cml0ZXN3KF9faW8ocCksZCxsKQorI2RlZmluZSBvdXRzbChwLGQsbCkJCQlfX3Jhd193cml0ZXNsKF9faW8ocCksZCxsKQorCisjZGVmaW5lIGluc2IocCxkLGwpCQkJX19yYXdfcmVhZHNiKF9faW8ocCksZCxsKQorI2RlZmluZSBpbnN3KHAsZCxsKQkJCV9fcmF3X3JlYWRzdyhfX2lvKHApLGQsbCkKKyNkZWZpbmUgaW5zbChwLGQsbCkJCQlfX3Jhd19yZWFkc2woX19pbyhwKSxkLGwpCisjZW5kaWYKKworI2RlZmluZSBvdXRiX3AodmFsLHBvcnQpCQlvdXRiKCh2YWwpLChwb3J0KSkKKyNkZWZpbmUgb3V0d19wKHZhbCxwb3J0KQkJb3V0dygodmFsKSwocG9ydCkpCisjZGVmaW5lIG91dGxfcCh2YWwscG9ydCkJCW91dGwoKHZhbCksKHBvcnQpKQorI2RlZmluZSBpbmJfcChwb3J0KQkJCWluYigocG9ydCkpCisjZGVmaW5lIGlud19wKHBvcnQpCQkJaW53KChwb3J0KSkKKyNkZWZpbmUgaW5sX3AocG9ydCkJCQlpbmwoKHBvcnQpKQorCisjZGVmaW5lIG91dHNiX3AocG9ydCxmcm9tLGxlbikJCW91dHNiKHBvcnQsZnJvbSxsZW4pCisjZGVmaW5lIG91dHN3X3AocG9ydCxmcm9tLGxlbikJCW91dHN3KHBvcnQsZnJvbSxsZW4pCisjZGVmaW5lIG91dHNsX3AocG9ydCxmcm9tLGxlbikJCW91dHNsKHBvcnQsZnJvbSxsZW4pCisjZGVmaW5lIGluc2JfcChwb3J0LHRvLGxlbikJCWluc2IocG9ydCx0byxsZW4pCisjZGVmaW5lIGluc3dfcChwb3J0LHRvLGxlbikJCWluc3cocG9ydCx0byxsZW4pCisjZGVmaW5lIGluc2xfcChwb3J0LHRvLGxlbikJCWluc2wocG9ydCx0byxsZW4pCisKKy8qCisgKiBpb3JlbWFwIGFuZCBmcmllbmRzLgorICoKKyAqIGlvcmVtYXAgdGFrZXMgYSBQQ0kgbWVtb3J5IGFkZHJlc3MsIGFzIHNwZWNpZmllZCBpbgorICogbGludXgvRG9jdW1lbnRhdGlvbi9JTy1tYXBwaW5nLnR4dC4gIElmIHlvdSB3YW50IGEKKyAqIHBoeXNpY2FsIGFkZHJlc3MsIHVzZSBfX2lvcmVtYXAgaW5zdGVhZC4KKyAqLworZXh0ZXJuIHZvaWQgKiBfX2lvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB2b2lkIF9faW91bm1hcCh2b2lkICphZGRyKTsKKworLyoKKyAqIEdlbmVyaWMgaW9yZW1hcCBzdXBwb3J0LgorICoKKyAqIERlZmluZToKKyAqICBpb21lbV92YWxpZF9hZGRyKG9mZixzaXplKQorICogIGlvbWVtX3RvX3BoeXMob2ZmKQorICovCisjaWZkZWYgaW9tZW1fdmFsaWRfYWRkcgorI2RlZmluZSBfX2FyY2hfaW9yZW1hcChvZmYsc3osbm9jYWNoZSkJCQkJCVwKKyAoewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF9vZmYgPSAob2ZmKSwgX3NpemUgPSAoc3opOwkJCVwKKwl2b2lkICpfcmV0ID0gKHZvaWQgKikwOwkJCQkJCVwKKwlpZiAoaW9tZW1fdmFsaWRfYWRkcihfb2ZmLCBfc2l6ZSkpCQkJCVwKKwkJX3JldCA9IF9faW9yZW1hcChpb21lbV90b19waHlzKF9vZmYpLF9zaXplLG5vY2FjaGUpOwlcCisJX3JldDsJCQkJCQkJCVwKKyB9KQorCisjZGVmaW5lIF9fYXJjaF9pb3VubWFwIF9faW91bm1hcAorI2VuZGlmCisKKyNkZWZpbmUgaW9yZW1hcChvZmYsc3opCQkJX19hcmNoX2lvcmVtYXAoKG9mZiksKHN6KSwwKQorI2RlZmluZSBpb3JlbWFwX25vY2FjaGUob2ZmLHN6KQkJX19hcmNoX2lvcmVtYXAoKG9mZiksKHN6KSwxKQorI2RlZmluZSBpb3VubWFwKF9hZGRyKQkJCV9fYXJjaF9pb3VubWFwKF9hZGRyKQorCisvKgorICogRE1BLWNvbnNpc3RlbnQgbWFwcGluZyBmdW5jdGlvbnMuICBUaGVzZSBhbGxvY2F0ZS9mcmVlIGEgcmVnaW9uIG9mCisgKiB1bmNhY2hlZCwgdW53cml0ZS1idWZmZXJlZCBtYXBwZWQgbWVtb3J5IHNwYWNlIGZvciB1c2Ugd2l0aCBETUEKKyAqIGRldmljZXMuICBUaGlzIGlzIHRoZSAiZ2VuZXJpYyIgdmVyc2lvbi4gIFRoZSBQQ0kgc3BlY2lmaWMgdmVyc2lvbgorICogaXMgaW4gcGNpLmgKKyAqLworZXh0ZXJuIHZvaWQgKmNvbnNpc3RlbnRfYWxsb2MoaW50IGdmcCwgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmhhbmRsZSk7CitleHRlcm4gdm9pZCBjb25zaXN0ZW50X2ZyZWUodm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90IGhhbmRsZSk7CitleHRlcm4gdm9pZCBjb25zaXN0ZW50X3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLCBpbnQgcncpOworCisvKgorICogU3RyaW5nIHZlcnNpb24gb2YgSU8gbWVtb3J5IGFjY2VzcyBvcHM6CisgKi8KK2V4dGVybiB2b2lkIF9tZW1jcHlfZnJvbWlvKHZvaWQgKiwgdW5zaWduZWQgbG9uZywgc2l6ZV90KTsKK2V4dGVybiB2b2lkIF9tZW1jcHlfdG9pbyh1bnNpZ25lZCBsb25nLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitleHRlcm4gdm9pZCBfbWVtc2V0X2lvKHVuc2lnbmVkIGxvbmcsIGludCwgc2l6ZV90KTsKKworZXh0ZXJuIHZvaWQgX19yZWFkd3JpdGVfYnVnKGNvbnN0IGNoYXIgKmZuKTsKKworLyoKKyAqIElmIHRoaXMgYXJjaGl0ZWN0dXJlIGhhcyBQQ0kgbWVtb3J5IElPLCB0aGVuIGRlZmluZSB0aGUgcmVhZC93cml0ZQorICogbWFjcm9zLiAgVGhlc2Ugc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBjb29raWUgcGFzc2VkIGZyb20KKyAqIGlvcmVtYXAuCisgKi8KKyNpZmRlZiBfX21lbV9wY2kKKworI2RlZmluZSByZWFkYihjKSAoeyB1bnNpZ25lZCBpbnQgX192ID0gX19yYXdfcmVhZGIoX19tZW1fcGNpKGMpKTsgX192OyB9KQorI2RlZmluZSByZWFkdyhjKSAoeyB1bnNpZ25lZCBpbnQgX192ID0gbGUxNl90b19jcHUoX19yYXdfcmVhZHcoX19tZW1fcGNpKGMpKSk7IF9fdjsgfSkKKyNkZWZpbmUgcmVhZGwoYykgKHsgdW5zaWduZWQgaW50IF9fdiA9IGxlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKF9fbWVtX3BjaShjKSkpOyBfX3Y7IH0pCisKKyNkZWZpbmUgd3JpdGViKHYsYykJCV9fcmF3X3dyaXRlYih2LF9fbWVtX3BjaShjKSkKKyNkZWZpbmUgd3JpdGV3KHYsYykJCV9fcmF3X3dyaXRldyhjcHVfdG9fbGUxNih2KSxfX21lbV9wY2koYykpCisjZGVmaW5lIHdyaXRlbCh2LGMpCQlfX3Jhd193cml0ZWwoY3B1X3RvX2xlMzIodiksX19tZW1fcGNpKGMpKQorCisjZGVmaW5lIG1lbXNldF9pbyhjLHYsbCkJCV9tZW1zZXRfaW8oX19tZW1fcGNpKGMpLCh2KSwobCkpCisjZGVmaW5lIG1lbWNweV9mcm9taW8oYSxjLGwpCQlfbWVtY3B5X2Zyb21pbygoYSksX19tZW1fcGNpKGMpLChsKSkKKyNkZWZpbmUgbWVtY3B5X3RvaW8oYyxhLGwpCQlfbWVtY3B5X3RvaW8oX19tZW1fcGNpKGMpLChhKSwobCkpCisKKyNkZWZpbmUgZXRoX2lvX2NvcHlfYW5kX3N1bShzLGMsbCxiKSBcCisJCQkJZXRoX2NvcHlfYW5kX3N1bSgocyksX19tZW1fcGNpKGMpLChsKSwoYikpCisKK3N0YXRpYyBpbmxpbmUgaW50CitjaGVja19zaWduYXR1cmUodW5zaWduZWQgbG9uZyBpb19hZGRyLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsCisJCWludCBsZW5ndGgpCit7CisJaW50IHJldHZhbCA9IDA7CisJZG8geworCQlpZiAocmVhZGIoaW9fYWRkcikgIT0gKnNpZ25hdHVyZSkKKwkJCWdvdG8gb3V0OworCQlpb19hZGRyKys7CisJCXNpZ25hdHVyZSsrOworCQlsZW5ndGgtLTsKKwl9IHdoaWxlIChsZW5ndGgpOworCXJldHZhbCA9IDE7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworI2VsaWYgIWRlZmluZWQocmVhZGIpCisKKyNkZWZpbmUgcmVhZGIoYWRkcikJCQkoX19yZWFkd3JpdGVfYnVnKCJyZWFkYiIpLDApCisjZGVmaW5lIHJlYWR3KGFkZHIpCQkJKF9fcmVhZHdyaXRlX2J1ZygicmVhZHciKSwwKQorI2RlZmluZSByZWFkbChhZGRyKQkJCShfX3JlYWR3cml0ZV9idWcoInJlYWRsIiksMCkKKyNkZWZpbmUgd3JpdGViKHYsYWRkcikJCQlfX3JlYWR3cml0ZV9idWcoIndyaXRlYiIpCisjZGVmaW5lIHdyaXRldyh2LGFkZHIpCQkJX19yZWFkd3JpdGVfYnVnKCJ3cml0ZXciKQorI2RlZmluZSB3cml0ZWwodixhZGRyKQkJCV9fcmVhZHdyaXRlX2J1Zygid3JpdGVsIikKKworI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKGEsYixjLGQpCV9fcmVhZHdyaXRlX2J1ZygiZXRoX2lvX2NvcHlfYW5kX3N1bSIpCisKKyNkZWZpbmUgY2hlY2tfc2lnbmF0dXJlKGlvLHNpZyxsZW4pCSgwKQorCisjZW5kaWYJLyogX19tZW1fcGNpICovCisKKy8qCisgKiBJZiB0aGlzIGFyY2hpdGVjdHVyZSBoYXMgSVNBIElPLCB0aGVuIGRlZmluZSB0aGUgaXNhX3JlYWQvaXNhX3dyaXRlCisgKiBtYWNyb3MuCisgKi8KKyNpZmRlZiBfX21lbV9pc2EKKworI2RlZmluZSBpc2FfcmVhZGIoYWRkcikJCQlfX3Jhd19yZWFkYihfX21lbV9pc2EoYWRkcikpCisjZGVmaW5lIGlzYV9yZWFkdyhhZGRyKQkJCV9fcmF3X3JlYWR3KF9fbWVtX2lzYShhZGRyKSkKKyNkZWZpbmUgaXNhX3JlYWRsKGFkZHIpCQkJX19yYXdfcmVhZGwoX19tZW1faXNhKGFkZHIpKQorI2RlZmluZSBpc2Ffd3JpdGViKHZhbCxhZGRyKQkJX19yYXdfd3JpdGViKHZhbCxfX21lbV9pc2EoYWRkcikpCisjZGVmaW5lIGlzYV93cml0ZXcodmFsLGFkZHIpCQlfX3Jhd193cml0ZXcodmFsLF9fbWVtX2lzYShhZGRyKSkKKyNkZWZpbmUgaXNhX3dyaXRlbCh2YWwsYWRkcikJCV9fcmF3X3dyaXRlbCh2YWwsX19tZW1faXNhKGFkZHIpKQorI2RlZmluZSBpc2FfbWVtc2V0X2lvKGEsYixjKQkJX21lbXNldF9pbyhfX21lbV9pc2EoYSksKGIpLChjKSkKKyNkZWZpbmUgaXNhX21lbWNweV9mcm9taW8oYSxiLGMpCV9tZW1jcHlfZnJvbWlvKChhKSxfX21lbV9pc2EoYiksKGMpKQorI2RlZmluZSBpc2FfbWVtY3B5X3RvaW8oYSxiLGMpCQlfbWVtY3B5X3RvaW8oX19tZW1faXNhKChhKSksKGIpLChjKSkKKworI2RlZmluZSBpc2FfZXRoX2lvX2NvcHlfYW5kX3N1bShhLGIsYyxkKSBcCisJCQkJZXRoX2NvcHlfYW5kX3N1bSgoYSksX19tZW1faXNhKGIpLChjKSwoZCkpCisKK3N0YXRpYyBpbmxpbmUgaW50Citpc2FfY2hlY2tfc2lnbmF0dXJlKHVuc2lnbmVkIGxvbmcgaW9fYWRkciwgY29uc3QgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLAorCQkgICAgaW50IGxlbmd0aCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlkbyB7CisJCWlmIChpc2FfcmVhZGIoaW9fYWRkcikgIT0gKnNpZ25hdHVyZSkKKwkJCWdvdG8gb3V0OworCQlpb19hZGRyKys7CisJCXNpZ25hdHVyZSsrOworCQlsZW5ndGgtLTsKKwl9IHdoaWxlIChsZW5ndGgpOworCXJldHZhbCA9IDE7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworI2Vsc2UJLyogX19tZW1faXNhICovCisKKyNkZWZpbmUgaXNhX3JlYWRiKGFkZHIpCQkJKF9fcmVhZHdyaXRlX2J1ZygiaXNhX3JlYWRiIiksMCkKKyNkZWZpbmUgaXNhX3JlYWR3KGFkZHIpCQkJKF9fcmVhZHdyaXRlX2J1ZygiaXNhX3JlYWR3IiksMCkKKyNkZWZpbmUgaXNhX3JlYWRsKGFkZHIpCQkJKF9fcmVhZHdyaXRlX2J1ZygiaXNhX3JlYWRsIiksMCkKKyNkZWZpbmUgaXNhX3dyaXRlYih2YWwsYWRkcikJCV9fcmVhZHdyaXRlX2J1ZygiaXNhX3dyaXRlYiIpCisjZGVmaW5lIGlzYV93cml0ZXcodmFsLGFkZHIpCQlfX3JlYWR3cml0ZV9idWcoImlzYV93cml0ZXciKQorI2RlZmluZSBpc2Ffd3JpdGVsKHZhbCxhZGRyKQkJX19yZWFkd3JpdGVfYnVnKCJpc2Ffd3JpdGVsIikKKyNkZWZpbmUgaXNhX21lbXNldF9pbyhhLGIsYykJCV9fcmVhZHdyaXRlX2J1ZygiaXNhX21lbXNldF9pbyIpCisjZGVmaW5lIGlzYV9tZW1jcHlfZnJvbWlvKGEsYixjKQlfX3JlYWR3cml0ZV9idWcoImlzYV9tZW1jcHlfZnJvbWlvIikKKyNkZWZpbmUgaXNhX21lbWNweV90b2lvKGEsYixjKQkJX19yZWFkd3JpdGVfYnVnKCJpc2FfbWVtY3B5X3RvaW8iKQorCisjZGVmaW5lIGlzYV9ldGhfaW9fY29weV9hbmRfc3VtKGEsYixjLGQpIFwKKwkJCQlfX3JlYWR3cml0ZV9idWcoImlzYV9ldGhfaW9fY29weV9hbmRfc3VtIikKKworI2RlZmluZSBpc2FfY2hlY2tfc2lnbmF0dXJlKGlvLHNpZyxsZW4pCSgwKQorCisjZW5kaWYJLyogX19tZW1faXNhICovCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworI2VuZGlmCS8qIF9fQVNNX0FSTV9JT19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9tZW1vcnkuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL21lbW9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjJhZmQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9tZW1vcnkuaApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vbWVtb3J5LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgTm90ZTogdGhpcyBmaWxlIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgYnkgbm9uLWFzbS8uaCBmaWxlcworICovCisjaWZuZGVmIF9fQVNNX0FSTV9NRU1PUllfSAorI2RlZmluZSBfX0FTTV9BUk1fTUVNT1JZX0gKKworI2lmIDAJLyogWFhYIyMjWFhYICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW1vcnkuaD4KKworLyoKKyAqIFBGTnMgYXJlIHVzZWQgdG8gZGVzY3JpYmUgYW55IHBoeXNpY2FsIHBhZ2U7IHRoaXMgbWVhbnMKKyAqIFBGTiAwID09IHBoeXNpY2FsIGFkZHJlc3MgMC4KKyAqCisgKiBUaGlzIGlzIHRoZSBQRk4gb2YgdGhlIGZpcnN0IFJBTSBwYWdlIGluIHRoZSBrZXJuZWwKKyAqIGRpcmVjdC1tYXBwZWQgdmlldy4gIFdlIGFzc3VtZSB0aGlzIGlzIHRoZSBmaXJzdCBwYWdlCisgKiBvZiBSQU0gaW4gdGhlIG1lbV9tYXAgYXMgd2VsbC4KKyAqLworI2RlZmluZSBQSFlTX1BGTl9PRkZTRVQJKFBIWVNfT0ZGU0VUID4+IFBBR0VfU0hJRlQpCisKKy8qCisgKiBUaGVzZSBhcmUgKm9ubHkqIHZhbGlkIG9uIHRoZSBrZXJuZWwgZGlyZWN0IG1hcHBlZCBSQU0gbWVtb3J5LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmlydF90b19waHlzKHZvaWQgKngpCit7CisJcmV0dXJuIF9fdmlydF90b19waHlzKCh1bnNpZ25lZCBsb25nKSh4KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqcGh5c190b192aXJ0KHVuc2lnbmVkIGxvbmcgeCkKK3sKKwlyZXR1cm4gKHZvaWQgKikoX19waHlzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpKHgpKSk7Cit9CisKKyNkZWZpbmUgX19wYSh4KQkJCV9fdmlydF90b19waHlzKCh1bnNpZ25lZCBsb25nKSh4KSkKKyNkZWZpbmUgX192YSh4KQkJCSgodm9pZCAqKV9fcGh5c190b192aXJ0KCh1bnNpZ25lZCBsb25nKSh4KSkpCisKKy8qCisgKiBWaXJ0dWFsIDwtPiBETUEgdmlldyBtZW1vcnkgYWRkcmVzcyB0cmFuc2xhdGlvbnMKKyAqIEFnYWluLCB0aGVzZSBhcmUgKm9ubHkqIHZhbGlkIG9uIHRoZSBrZXJuZWwgZGlyZWN0IG1hcHBlZCBSQU0KKyAqIG1lbW9yeS4gIFVzZSBvZiB0aGVzZSBpcyAqZGVwcmVjaWF0ZWQqLgorICovCisjZGVmaW5lIHZpcnRfdG9fYnVzKHgpCQkoX192aXJ0X3RvX2J1cygodW5zaWduZWQgbG9uZykoeCkpKQorI2RlZmluZSBidXNfdG9fdmlydCh4KQkJKCh2b2lkICopKF9fYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpKHgpKSkpCisKKy8qCisgKiBDb252ZXJzaW9uIGJldHdlZW4gYSBzdHJ1Y3QgcGFnZSBhbmQgYSBwaHlzaWNhbCBhZGRyZXNzLgorICoKKyAqIE5vdGU6IHdoZW4gY29udmVydGluZyBhbiB1bmtub3duIHBoeXNpY2FsIGFkZHJlc3MgdG8gYQorICogc3RydWN0IHBhZ2UsIHRoZSByZXN1bHRpbmcgcG9pbnRlciBtdXN0IGJlIHZhbGlkYXRlZAorICogdXNpbmcgVkFMSURfUEFHRSgpLiAgSXQgbXVzdCByZXR1cm4gYW4gaW52YWxpZCBzdHJ1Y3QgcGFnZQorICogZm9yIGFueSBwaHlzaWNhbCBhZGRyZXNzIG5vdCBjb3JyZXNwb25kaW5nIHRvIGEgc3lzdGVtCisgKiBSQU0gYWRkcmVzcy4KKyAqCisgKiAgcGFnZV90b19wZm4ocGFnZSkJY29udmVydCBhIHN0cnVjdCBwYWdlICogdG8gYSBQRk4gbnVtYmVyCisgKiAgcGZuX3RvX3BhZ2UocGZuKQljb252ZXJ0IGEgX3ZhbGlkXyBQRk4gbnVtYmVyIHRvIHN0cnVjdCBwYWdlICoKKyAqICBwZm5fdmFsaWQocGZuKQlpbmRpY2F0ZXMgd2hldGhlciBhIFBGTiBudW1iZXIgaXMgdmFsaWQKKyAqCisgKiAgdmlydF90b19wYWdlKGspCWNvbnZlcnQgYSBfdmFsaWRfIHZpcnR1YWwgYWRkcmVzcyB0byBzdHJ1Y3QgcGFnZSAqCisgKiAgdmlydF9hZGRyX3ZhbGlkKGspCWluZGljYXRlcyB3aGV0aGVyIGEgdmlydHVhbCBhZGRyZXNzIGlzIHZhbGlkCisgKi8KKyNpZm5kZWYgQ09ORklHX0RJU0NPTlRJR01FTQorCisjZGVmaW5lIHBhZ2VfdG9fcGZuKHBhZ2UpCSgoKHBhZ2UpIC0gbWVtX21hcCkgKyBQSFlTX1BGTl9PRkZTRVQpCisjZGVmaW5lIHBmbl90b19wYWdlKHBmbikJKChtZW1fbWFwICsgKHBmbikpIC0gUEhZU19QRk5fT0ZGU0VUKQorI2RlZmluZSBwZm5fdmFsaWQocGZuKQkJKChwZm4pID49IFBIWVNfUEZOX09GRlNFVCAmJiAocGZuKSA8IChQSFlTX1BGTl9PRkZTRVQgKyBtYXhfbWFwbnIpKQorCisjZGVmaW5lIHZpcnRfdG9fcGFnZShrYWRkcikJKHBmbl90b19wYWdlKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpKQorI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCSgoa2FkZHIpID49IFBBR0VfT0ZGU0VUICYmIChrYWRkcikgPCAodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSkKKworI2RlZmluZSBQSFlTX1RPX05JRChhZGRyKQkoMCkKKworI2RlZmluZSBWQUxJRF9QQUdFKHBhZ2UpCSgocGFnZSAtIG1lbV9tYXApIDwgbWF4X21hcG5yKQorCisjZWxzZQorCisvKgorICogVGhpcyBpcyBtb3JlIGNvbXBsZXguICBXZSBoYXZlIGEgc2V0IG9mIG1lbV9tYXAgYXJyYXlzIHNwcmVhZAorICogYXJvdW5kIGluIG1lbW9yeS4KKyAqLworI2RlZmluZSBwYWdlX3RvX3BmbihwYWdlKQkJCQkJXAorCSgoKHBhZ2UpIC0gcGFnZV96b25lKHBhZ2UpLT56b25lX21lbV9tYXApCQlcCisJICArIChwYWdlX3pvbmUocGFnZSktPnpvbmVfc3RhcnRfcGFkZHIgPj4gUEFHRV9TSElGVCkpCisKKyNkZWZpbmUgcGZuX3RvX3BhZ2UocGZuKQkJCQkJXAorCShQRk5fVE9fTUFQQkFTRShwZm4pICsgTE9DQUxfTUFQX05SKChwZm4pIDw8IFBBR0VfU0hJRlQpKQorCisjZGVmaW5lIHBmbl92YWxpZChwZm4pCQkJCQkJXAorICAoewkJCQkJCQkJXAorCXVuc2lnbmVkIGludCBub2RlID0gUEZOX1RPX05JRChwZm4pOwkJCVwKKwlzdHJ1Y3QgcGdsaXN0X2RhdGEgKm5kID0gTk9ERV9EQVRBKG5vZGUpOwkJXAorCSgobm9kZSA8IE5SX05PREVTKSAmJgkJCQkJXAorCSAoKHBmbiAtIChuZC0+bm9kZV9zdGFydF9wYWRkciA+PiBQQUdFX1NISUZUKSkgPCBuZC0+bm9kZV9zaXplKSk7XAorICAgfSkKKworI2RlZmluZSB2aXJ0X3RvX3BhZ2Uoa2FkZHIpCQkJCQlcCisJKEFERFJfVE9fTUFQQkFTRShrYWRkcikgKyBMT0NBTF9NQVBfTlIoa2FkZHIpKQorCisjZGVmaW5lIHZpcnRfYWRkcl92YWxpZChrYWRkcikJKEtWQUREUl9UT19OSUQoa2FkZHIpIDwgTlJfTk9ERVMpCisKKy8qCisgKiBDb21tb24gZGlzY29udGlnbWVtIHN0dWZmLgorICogIFBIWVNfVE9fTklEIGlzIHVzZWQgYnkgdGhlIEFSTSBrZXJuZWwvc2V0dXAuYworICovCisjZGVmaW5lIFBIWVNfVE9fTklEKGFkZHIpCVBGTl9UT19OSUQoKGFkZHIpID4+IFBBR0VfU0hJRlQpCisKKy8qCisgKiAyLjQgY29tcGF0aWJpbGl0eQorICoKKyAqIFZBTElEX1BBR0UgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIGlmIGdpdmVuIHBhZ2UgcG9pbnRlciBpcyB2YWxpZC4KKyAqIFRoaXMgYXNzdW1lcyBhbGwgbm9kZSdzIG1lbV9tYXBzIGFyZSBzdG9yZWQgd2l0aGluIHRoZSBub2RlIHRoZXkKKyAqIHJlZmVyIHRvLiAgVGhpcyBpcyBhY3R1YWxseSBpbmhlcmVudGx5IGJ1Z2d5LgorICovCisjZGVmaW5lIFZBTElEX1BBR0UocGFnZSkgXAorKHsgdW5zaWduZWQgaW50IG5vZGUgPSBLVkFERFJfVE9fTklEKHBhZ2UpOyBcCisgICAoKG5vZGUgPCBOUl9OT0RFUykgJiYgXAorICAgICAoKHVuc2lnbmVkKSgocGFnZSkgLSBOT0RFX01FTV9NQVAobm9kZSkpIDwgTk9ERV9EQVRBKG5vZGUpLT5ub2RlX3NpemUpKTsgXAorfSkKKworI2VuZGlmCisKKy8qCisgKiBXZSBzaG91bGQgcmVhbGx5IGVsaW1pbmF0ZSB2aXJ0X3RvX2J1cygpIGhlcmUgLSBpdCdzIGRlcHJlY2lhdGVkLgorICovCisjZGVmaW5lIHBhZ2VfdG9fYnVzKHBhZ2UpCSh2aXJ0X3RvX2J1cyhwYWdlX2FkZHJlc3MocGFnZSkpKQorCisjZW5kaWYJLyogWFhYIyMjWFhYICovCisKKyNlbmRpZgkvKiBfX0FTTV9BUk1fTUVNT1JZX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTI0ODYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL3Bvc2l4X3R5cGVzLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggUnVzc2VsbCBLaW5nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIENoYW5nZWxvZzoKKyAqICAgMjctMDYtMTk5NglSTUsJQ3JlYXRlZAorICovCisjaWZuZGVmIF9fQVJDSF9BUk1fUE9TSVhfVFlQRVNfSAorI2RlZmluZSBfX0FSQ0hfQVJNX1BPU0lYX1RZUEVTX0gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBnZW5lcmFsbHkgdXNlZCBieSB1c2VyLWxldmVsIHNvZnR3YXJlLCBzbyB5b3UgbmVlZCB0bworICogYmUgYSBsaXR0bGUgY2FyZWZ1bCBhYm91dCBuYW1lc3BhY2UgcG9sbHV0aW9uIGV0Yy4gIEFsc28sIHdlIGNhbm5vdAorICogYXNzdW1lIEdDQyBpcyBiZWluZyB1c2VkLgorICovCisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCV9fa2VybmVsX2Rldl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCQlfX2tlcm5lbF9pbm9fdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCV9fa2VybmVsX21vZGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCV9fa2VybmVsX25saW5rX3Q7Cit0eXBlZGVmIGxvbmcJCQlfX2tlcm5lbF9vZmZfdDsKK3R5cGVkZWYgaW50CQkJX19rZXJuZWxfcGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlfX2tlcm5lbF9pcGNfcGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlfX2tlcm5lbF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCV9fa2VybmVsX2dpZF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCV9fa2VybmVsX3NpemVfdDsKK3R5cGVkZWYgaW50CQkJX19rZXJuZWxfc3NpemVfdDsKK3R5cGVkZWYgaW50CQkJX19rZXJuZWxfcHRyZGlmZl90OwordHlwZWRlZiBsb25nCQkJX19rZXJuZWxfdGltZV90OwordHlwZWRlZiBsb25nCQkJX19rZXJuZWxfc3VzZWNvbmRzX3Q7Cit0eXBlZGVmIGxvbmcJCQlfX2tlcm5lbF9jbG9ja190OwordHlwZWRlZiBpbnQJCQlfX2tlcm5lbF9kYWRkcl90OwordHlwZWRlZiBjaGFyICoJCQlfX2tlcm5lbF9jYWRkcl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJX19rZXJuZWxfdWlkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCV9fa2VybmVsX2dpZDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJX19rZXJuZWxfdWlkMzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQlfX2tlcm5lbF9naWQzMl90OworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlfX2tlcm5lbF9vbGRfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlfX2tlcm5lbF9vbGRfZ2lkX3Q7CisKKyNpZmRlZiBfX0dOVUNfXwordHlwZWRlZiBsb25nIGxvbmcJCV9fa2VybmVsX2xvZmZfdDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9fVVNFX0FMTCkKKwlpbnQJdmFsWzJdOworI2Vsc2UgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLworCWludAlfX3ZhbFsyXTsKKyNlbmRpZiAvKiAhZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX1VTRV9BTEwpICovCit9IF9fa2VybmVsX2ZzaWRfdDsKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikKKworI3VuZGVmCV9fRkRfU0VUCisjZGVmaW5lIF9fRkRfU0VUKGZkLCBmZHNldHApIFwKKwkJKCgoZmRfc2V0ICopZmRzZXRwKS0+ZmRzX2JpdHNbZmQgPj4gNV0gfD0gKDE8PChmZCAmIDMxKSkpCisKKyN1bmRlZglfX0ZEX0NMUgorI2RlZmluZSBfX0ZEX0NMUihmZCwgZmRzZXRwKSBcCisJCSgoKGZkX3NldCAqKWZkc2V0cCktPmZkc19iaXRzW2ZkID4+IDVdICY9IH4oMTw8KGZkICYgMzEpKSkKKworI3VuZGVmCV9fRkRfSVNTRVQKKyNkZWZpbmUgX19GRF9JU1NFVChmZCwgZmRzZXRwKSBcCisJCSgoKChmZF9zZXQgKilmZHNldHApLT5mZHNfYml0c1tmZCA+PiA1XSAmICgxPDwoZmQgJiAzMSkpKSAhPSAwKQorCisjdW5kZWYJX19GRF9aRVJPCisjZGVmaW5lIF9fRkRfWkVSTyhmZHNldHApIFwKKwkJKG1lbXNldCAoZmRzZXRwLCAwLCBzaXplb2YgKCooZmRfc2V0ICopZmRzZXRwKSkpCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3NldHVwLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9zZXR1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZGY0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9zZXR1cC5oCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvYXNtL3NldHVwLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgU3RydWN0dXJlIHBhc3NlZCB0byBrZXJuZWwgdG8gdGVsbCBpdCBhYm91dCB0aGUKKyAqICBoYXJkd2FyZSBpdCdzIHJ1bm5pbmcgb24uICBTZWUgbGludXgvRG9jdW1lbnRhdGlvbi9hcm0vU2V0dXAKKyAqICBmb3IgbW9yZSBpbmZvLgorICoKKyAqIE5PVEU6CisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHR3byB3YXlzIHRvIHBhc3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgYm9vdAorICogIGxvYWRlciB0byB0aGUga2VybmVsLiBUaGUgb2xkIHN0cnVjdCBwYXJhbV9zdHJ1Y3QgaXMgZGVwcmVjYXRlZCwKKyAqICBidXQgaXQgd2lsbCBiZSBrZXB0IGluIHRoZSBrZXJuZWwgZm9yIDUgeWVhcnMgZnJvbSBub3cKKyAqICAoMjAwMSkuIFRoaXMgd2lsbCBhbGxvdyBib290IGxvYWRlcnMgdG8gY29udmVydCB0byB0aGUgbmV3IHN0cnVjdAorICogIHRhZyB3YXkuCisgKi8KKyNpZm5kZWYgX19BU01BUk1fU0VUVVBfSAorI2RlZmluZSBfX0FTTUFSTV9TRVRVUF9ICisKKy8qCisgKiBVc2FnZToKKyAqICAtIGRvIG5vdCBnbyBibGluZGx5IGFkZGluZyBmaWVsZHMsIGFkZCB0aGVtIGF0IHRoZSBlbmQKKyAqICAtIHdoZW4gYWRkaW5nIGZpZWxkcywgZG9uJ3QgcmVseSBvbiB0aGUgYWRkcmVzcyB1bnRpbAorICogICAgYSBwYXRjaCBmcm9tIG1lIGhhcyBiZWVuIHJlbGVhc2VkCisgKiAgLSB1bnVzZWQgZmllbGRzIHNob3VsZCBiZSB6ZXJvIChmb3IgZnV0dXJlIGV4cGFuc2lvbikKKyAqICAtIHRoaXMgc3RydWN0dXJlIGlzIHJlbGF0aXZlbHkgc2hvcnQtbGl2ZWQgLSBvbmx5CisgKiAgICBndWFyYW50ZWVkIHRvIGNvbnRhaW4gdXNlZnVsIGRhdGEgaW4gc2V0dXBfYXJjaCgpCisgKi8KKyNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUgMTAyNAorCisvKiBUaGlzIGlzIHRoZSBvbGQgZGVwcmVjYXRlZCB3YXkgdG8gcGFzcyBwYXJhbWV0ZXJzIHRvIHRoZSBrZXJuZWwgKi8KK3N0cnVjdCBwYXJhbV9zdHJ1Y3QgeworICAgIHVuaW9uIHsKKwlzdHJ1Y3QgeworCSAgICB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsJCS8qICAwICovCisJICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7CQkvKiAgNCAqLworCSAgICB1bnNpZ25lZCBsb25nIHJhbWRpc2tfc2l6ZTsJCS8qICA4ICovCisJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiAxMiAqLworI2RlZmluZSBGTEFHX1JFQURPTkxZCTEKKyNkZWZpbmUgRkxBR19SRExPQUQJNAorI2RlZmluZSBGTEFHX1JEUFJPTVBUCTgKKwkgICAgdW5zaWduZWQgbG9uZyByb290ZGV2OwkJLyogMTYgKi8KKwkgICAgdW5zaWduZWQgbG9uZyB2aWRlb19udW1fY29sczsJLyogMjAgKi8KKwkgICAgdW5zaWduZWQgbG9uZyB2aWRlb19udW1fcm93czsJLyogMjQgKi8KKwkgICAgdW5zaWduZWQgbG9uZyB2aWRlb194OwkJLyogMjggKi8KKwkgICAgdW5zaWduZWQgbG9uZyB2aWRlb195OwkJLyogMzIgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBtZW1jX2NvbnRyb2xfcmVnOwkvKiAzNiAqLworCSAgICB1bnNpZ25lZCBjaGFyIHNvdW5kZGVmYXVsdDsJCS8qIDQwICovCisJICAgIHVuc2lnbmVkIGNoYXIgYWRmc2RyaXZlczsJCS8qIDQxICovCisJICAgIHVuc2lnbmVkIGNoYXIgYnl0ZXNfcGVyX2NoYXJfaDsJLyogNDIgKi8KKwkgICAgdW5zaWduZWQgY2hhciBieXRlc19wZXJfY2hhcl92OwkvKiA0MyAqLworCSAgICB1bnNpZ25lZCBsb25nIHBhZ2VzX2luX2JhbmtbNF07CS8qIDQ0ICovCisJICAgIHVuc2lnbmVkIGxvbmcgcGFnZXNfaW5fdnJhbTsJLyogNjAgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBpbml0cmRfc3RhcnQ7CQkvKiA2NCAqLworCSAgICB1bnNpZ25lZCBsb25nIGluaXRyZF9zaXplOwkJLyogNjggKi8KKwkgICAgdW5zaWduZWQgbG9uZyByZF9zdGFydDsJCS8qIDcyICovCisJICAgIHVuc2lnbmVkIGxvbmcgc3lzdGVtX3JldjsJCS8qIDc2ICovCisJICAgIHVuc2lnbmVkIGxvbmcgc3lzdGVtX3NlcmlhbF9sb3c7CS8qIDgwICovCisJICAgIHVuc2lnbmVkIGxvbmcgc3lzdGVtX3NlcmlhbF9oaWdoOwkvKiA4NCAqLworCSAgICB1bnNpZ25lZCBsb25nIG1lbV9mY2xrXzIxMjg1OyAgICAgICAvKiA4OCAqLworCX0gczsKKwljaGFyIHVudXNlZFsyNTZdOworICAgIH0gdTE7CisgICAgdW5pb24geworCWNoYXIgcGF0aHNbOF1bMTI4XTsKKwlzdHJ1Y3QgeworCSAgICB1bnNpZ25lZCBsb25nIG1hZ2ljOworCSAgICBjaGFyIG5bMTAyNCAtIHNpemVvZih1bnNpZ25lZCBsb25nKV07CisJfSBzOworICAgIH0gdTI7CisgICAgY2hhciBjb21tYW5kbGluZVtDT01NQU5EX0xJTkVfU0laRV07Cit9OworCisKKy8qCisgKiBUaGUgbmV3IHdheSBvZiBwYXNzaW5nIGluZm9ybWF0aW9uOiBhIGxpc3Qgb2YgdGFnZ2VkIGVudHJpZXMKKyAqLworCisvKiBUaGUgbGlzdCBlbmRzIHdpdGggYW4gQVRBR19OT05FIG5vZGUuICovCisjZGVmaW5lIEFUQUdfTk9ORQkweDAwMDAwMDAwCisKK3N0cnVjdCB0YWdfaGVhZGVyIHsKKwl1MzIgc2l6ZTsKKwl1MzIgdGFnOworfTsKKworLyogVGhlIGxpc3QgbXVzdCBzdGFydCB3aXRoIGFuIEFUQUdfQ09SRSBub2RlICovCisjZGVmaW5lIEFUQUdfQ09SRQkweDU0NDEwMDAxCisKK3N0cnVjdCB0YWdfY29yZSB7CisJdTMyIGZsYWdzOwkJLyogYml0IDAgPSByZWFkLW9ubHkgKi8KKwl1MzIgcGFnZXNpemU7CisJdTMyIHJvb3RkZXY7Cit9OworCisvKiBpdCBpcyBhbGxvd2VkIHRvIGhhdmUgbXVsdGlwbGUgQVRBR19NRU0gbm9kZXMgKi8KKyNkZWZpbmUgQVRBR19NRU0JMHg1NDQxMDAwMgorCitzdHJ1Y3QgdGFnX21lbTMyIHsKKwl1MzIJc2l6ZTsKKwl1MzIJc3RhcnQ7CS8qIHBoeXNpY2FsIHN0YXJ0IGFkZHJlc3MgKi8KK307CisKKy8qIFZHQSB0ZXh0IHR5cGUgZGlzcGxheXMgKi8KKyNkZWZpbmUgQVRBR19WSURFT1RFWFQJMHg1NDQxMDAwMworCitzdHJ1Y3QgdGFnX3ZpZGVvdGV4dCB7CisJdTgJCXg7CisJdTgJCXk7CisJdTE2CQl2aWRlb19wYWdlOworCXU4CQl2aWRlb19tb2RlOworCXU4CQl2aWRlb19jb2xzOworCXUxNgkJdmlkZW9fZWdhX2J4OworCXU4CQl2aWRlb19saW5lczsKKwl1OAkJdmlkZW9faXN2Z2E7CisJdTE2CQl2aWRlb19wb2ludHM7Cit9OworCisvKiBkZXNjcmliZXMgaG93IHRoZSByYW1kaXNrIHdpbGwgYmUgdXNlZCBpbiBrZXJuZWwgKi8KKyNkZWZpbmUgQVRBR19SQU1ESVNLCTB4NTQ0MTAwMDQKKworc3RydWN0IHRhZ19yYW1kaXNrIHsKKwl1MzIgZmxhZ3M7CS8qIGJpdCAwID0gbG9hZCwgYml0IDEgPSBwcm9tcHQgKi8KKwl1MzIgc2l6ZTsJLyogZGVjb21wcmVzc2VkIHJhbWRpc2sgc2l6ZSBpbiBfa2lsb18gYnl0ZXMgKi8KKwl1MzIgc3RhcnQ7CS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGZsb3BweS1iYXNlZCBSQU0gZGlzayBpbWFnZSAqLworfTsKKworLyogZGVzY3JpYmVzIHdoZXJlIHRoZSBjb21wcmVzc2VkIHJhbWRpc2sgaW1hZ2UgbGl2ZXMgKHZpcnR1YWwgYWRkcmVzcykgKi8KKy8qCisgKiB0aGlzIG9uZSBhY2NpZGVudGFsbHkgdXNlZCB2aXJ0dWFsIGFkZHJlc3NlcyAtIGFzIHN1Y2gsCisgKiBpdHMgZGVwcmVjaWF0ZWQuCisgKi8KKyNkZWZpbmUgQVRBR19JTklUUkQJMHg1NDQxMDAwNQorCisvKiBkZXNjcmliZXMgd2hlcmUgdGhlIGNvbXByZXNzZWQgcmFtZGlzayBpbWFnZSBsaXZlcyAocGh5c2ljYWwgYWRkcmVzcykgKi8KKyNkZWZpbmUgQVRBR19JTklUUkQyCTB4NTQ0MjAwMDUKKworc3RydWN0IHRhZ19pbml0cmQgeworCXUzMiBzdGFydDsJLyogcGh5c2ljYWwgc3RhcnQgYWRkcmVzcyAqLworCXUzMiBzaXplOwkvKiBzaXplIG9mIGNvbXByZXNzZWQgcmFtZGlzayBpbWFnZSBpbiBieXRlcyAqLworfTsKKworLyogYm9hcmQgc2VyaWFsIG51bWJlci4gIjY0IGJpdHMgc2hvdWxkIGJlIGVub3VnaCBmb3IgZXZlcnlib2R5IiAqLworI2RlZmluZSBBVEFHX1NFUklBTAkweDU0NDEwMDA2CisKK3N0cnVjdCB0YWdfc2VyaWFsbnIgeworCXUzMiBsb3c7CisJdTMyIGhpZ2g7Cit9OworCisvKiBib2FyZCByZXZpc2lvbiAqLworI2RlZmluZSBBVEFHX1JFVklTSU9OCTB4NTQ0MTAwMDcKKworc3RydWN0IHRhZ19yZXZpc2lvbiB7CisJdTMyIHJldjsKK307CisKKy8qIGluaXRpYWwgdmFsdWVzIGZvciB2ZXNhZmItdHlwZSBmcmFtZWJ1ZmZlcnMuIHNlZSBzdHJ1Y3Qgc2NyZWVuX2luZm8KKyAqIGluIGluY2x1ZGUvbGludXgvdHR5LmgKKyAqLworI2RlZmluZSBBVEFHX1ZJREVPTEZCCTB4NTQ0MTAwMDgKKworc3RydWN0IHRhZ192aWRlb2xmYiB7CisJdTE2CQlsZmJfd2lkdGg7CisJdTE2CQlsZmJfaGVpZ2h0OworCXUxNgkJbGZiX2RlcHRoOworCXUxNgkJbGZiX2xpbmVsZW5ndGg7CisJdTMyCQlsZmJfYmFzZTsKKwl1MzIJCWxmYl9zaXplOworCXU4CQlyZWRfc2l6ZTsKKwl1OAkJcmVkX3BvczsKKwl1OAkJZ3JlZW5fc2l6ZTsKKwl1OAkJZ3JlZW5fcG9zOworCXU4CQlibHVlX3NpemU7CisJdTgJCWJsdWVfcG9zOworCXU4CQlyc3ZkX3NpemU7CisJdTgJCXJzdmRfcG9zOworfTsKKworLyogY29tbWFuZCBsaW5lOiBcMCB0ZXJtaW5hdGVkIHN0cmluZyAqLworI2RlZmluZSBBVEFHX0NNRExJTkUJMHg1NDQxMDAwOQorCitzdHJ1Y3QgdGFnX2NtZGxpbmUgeworCWNoYXIJY21kbGluZVsxXTsJLyogdGhpcyBpcyB0aGUgbWluaW11bSBzaXplICovCit9OworCisvKiBhY29ybiBSaXNjUEMgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgQVRBR19BQ09STgkweDQxMDAwMTAxCisKK3N0cnVjdCB0YWdfYWNvcm4geworCXUzMiBtZW1jX2NvbnRyb2xfcmVnOworCXUzMiB2cmFtX3BhZ2VzOworCXU4IHNvdW5kZGVmYXVsdDsKKwl1OCBhZGZzZHJpdmVzOworfTsKKworLyogZm9vdGJyaWRnZSBtZW1vcnkgY2xvY2ssIHNlZSBhcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvYXJjaC5jICovCisjZGVmaW5lIEFUQUdfTUVNQ0xLCTB4NDEwMDA0MDIKKworc3RydWN0IHRhZ19tZW1jbGsgeworCXUzMiBmbWVtY2xrOworfTsKKworc3RydWN0IHRhZyB7CisJc3RydWN0IHRhZ19oZWFkZXIgaGRyOworCXVuaW9uIHsKKwkJc3RydWN0IHRhZ19jb3JlCQljb3JlOworCQlzdHJ1Y3QgdGFnX21lbTMyCW1lbTsKKwkJc3RydWN0IHRhZ192aWRlb3RleHQJdmlkZW90ZXh0OworCQlzdHJ1Y3QgdGFnX3JhbWRpc2sJcmFtZGlzazsKKwkJc3RydWN0IHRhZ19pbml0cmQJaW5pdHJkOworCQlzdHJ1Y3QgdGFnX3NlcmlhbG5yCXNlcmlhbG5yOworCQlzdHJ1Y3QgdGFnX3JldmlzaW9uCXJldmlzaW9uOworCQlzdHJ1Y3QgdGFnX3ZpZGVvbGZiCXZpZGVvbGZiOworCQlzdHJ1Y3QgdGFnX2NtZGxpbmUJY21kbGluZTsKKworCQkvKgorCQkgKiBBY29ybiBzcGVjaWZpYworCQkgKi8KKwkJc3RydWN0IHRhZ19hY29ybglhY29ybjsKKworCQkvKgorCQkgKiBEQzIxMjg1IHNwZWNpZmljCisJCSAqLworCQlzdHJ1Y3QgdGFnX21lbWNsawltZW1jbGs7CisJfSB1OworfTsKKworc3RydWN0IHRhZ3RhYmxlIHsKKwl1MzIgdGFnOworCWludCAoKnBhcnNlKShjb25zdCBzdHJ1Y3QgdGFnICopOworfTsKKworI2RlZmluZSBfX3RhZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQsIF9fc2VjdGlvbl9fKCIudGFnbGlzdCIpKSkKKyNkZWZpbmUgX190YWd0YWJsZSh0YWcsIGZuKSBcCitzdGF0aWMgc3RydWN0IHRhZ3RhYmxlIF9fdGFndGFibGVfIyNmbiBfX3RhZyA9IHsgdGFnLCBmbiB9CisKKyNkZWZpbmUgdGFnX21lbWJlcl9wcmVzZW50KHRhZyxtZW1iZXIpCQkJCVwKKwkoKHVuc2lnbmVkIGxvbmcpKCYoKHN0cnVjdCB0YWcgKikwTCktPm1lbWJlciArIDEpCVwKKwkJPD0gKHRhZyktPmhkci5zaXplICogNCkKKworI2RlZmluZSB0YWdfbmV4dCh0KQkoKHN0cnVjdCB0YWcgKikoKHUzMiAqKSh0KSArICh0KS0+aGRyLnNpemUpKQorI2RlZmluZSB0YWdfc2l6ZSh0eXBlKQkoKHNpemVvZihzdHJ1Y3QgdGFnX2hlYWRlcikgKyBzaXplb2Yoc3RydWN0IHR5cGUpKSA+PiAyKQorCisjZGVmaW5lIGZvcl9lYWNoX3RhZyh0LGJhc2UpCQlcCisJZm9yICh0ID0gYmFzZTsgdC0+aGRyLnNpemU7IHQgPSB0YWdfbmV4dCh0KSkKKworLyoKKyAqIE1lbW9yeSBtYXAgZGVzY3JpcHRpb24KKyAqLworI2RlZmluZSBOUl9CQU5LUyA4CisKK3N0cnVjdCBtZW1pbmZvIHsKKwlpbnQgbnJfYmFua3M7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydDsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQlpbnQgICAgICAgICAgIG5vZGU7CisJfSBiYW5rW05SX0JBTktTXTsKK307CisKK2V4dGVybiBzdHJ1Y3QgbWVtaW5mbyBtZW1pbmZvOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3NpemVzLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9zaXplcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZDkyY2EKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9zaXplcy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKy8qIERPIE5PVCBFRElUISEgLSB0aGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKyAqICAgICAgICAgICAgICAgICBmcm9tIC5zIGZpbGUgYnkgYXdrIC1mIHMyaC5hd2sKKyAqLworLyogIFNpemUgZGVmaW50aW9ucworICogIENvcHlyaWdodCAoQykgQVJNIExpbWl0ZWQgMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworCisjaWZuZGVmIF9fc2l6ZXNfaAorI2RlZmluZSBfX3NpemVzX2ggICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogaGFuZHkgc2l6ZXMgKi8KKyNkZWZpbmUgU1pfMUsgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFNaXzRLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBTWl84SyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgU1pfMTZLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFNaXzY0SyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBTWl8xMjhLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgU1pfMjU2SyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIFNaXzUxMksgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorCisjZGVmaW5lIFNaXzFNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBTWl8yTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgU1pfNE0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIFNaXzhNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBTWl8xNk0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgU1pfMzJNICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIFNaXzY0TSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBTWl8xMjhNICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgU1pfMjU2TSAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIFNaXzUxMk0gICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorCisjZGVmaW5lIFNaXzFHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBTWl8yRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKworI2VuZGlmCisKKy8qICAgICAgICAgRU5EICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9zdHJpbmcuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZWE1ODIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9zdHJpbmcuaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIF9fQVNNX0FSTV9TVFJJTkdfSAorI2RlZmluZSBfX0FTTV9BUk1fU1RSSU5HX0gKKworLyoKKyAqIFdlIGRvbid0IGRvIGlubGluZSBzdHJpbmcgZnVuY3Rpb25zLCBzaW5jZSB0aGUKKyAqIG9wdGltaXNlZCBpbmxpbmUgYXNtIHZlcnNpb25zIGFyZSBub3Qgc21hbGwuCisgKi8KKworI3VuZGVmIF9fSEFWRV9BUkNIX1NUUlJDSFIKK2V4dGVybiBjaGFyICogc3RycmNocihjb25zdCBjaGFyICogcywgaW50IGMpOworCisjdW5kZWYgX19IQVZFX0FSQ0hfU1RSQ0hSCitleHRlcm4gY2hhciAqIHN0cmNocihjb25zdCBjaGFyICogcywgaW50IGMpOworCisjdW5kZWYgX19IQVZFX0FSQ0hfTUVNQ1BZCitleHRlcm4gdm9pZCAqIG1lbWNweSh2b2lkICosIGNvbnN0IHZvaWQgKiwgX19rZXJuZWxfc2l6ZV90KTsKKworI3VuZGVmIF9fSEFWRV9BUkNIX01FTU1PVkUKK2V4dGVybiB2b2lkICogbWVtbW92ZSh2b2lkICosIGNvbnN0IHZvaWQgKiwgX19rZXJuZWxfc2l6ZV90KTsKKworI3VuZGVmIF9fSEFWRV9BUkNIX01FTUNIUgorZXh0ZXJuIHZvaWQgKiBtZW1jaHIoY29uc3Qgdm9pZCAqLCBpbnQsIF9fa2VybmVsX3NpemVfdCk7CisKKyN1bmRlZiBfX0hBVkVfQVJDSF9NRU1aRVJPCisjdW5kZWYgX19IQVZFX0FSQ0hfTUVNU0VUCitleHRlcm4gdm9pZCAqIG1lbXNldCh2b2lkICosIGludCwgX19rZXJuZWxfc2l6ZV90KTsKKworI2lmIDAKK2V4dGVybiB2b2lkIF9fbWVtemVybyh2b2lkICpwdHIsIF9fa2VybmVsX3NpemVfdCBuKTsKKworI2RlZmluZSBtZW1zZXQocCx2LG4pCQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQlpZiAoKG4pICE9IDApIHsJCQkJCQlcCisJCQlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoKHYpKSAmJiAodikgPT0gMCkJXAorCQkJCV9fbWVtemVybygocCksKG4pKTsJCQlcCisJCQllbHNlCQkJCQkJXAorCQkJCW1lbXNldCgocCksKHYpLChuKSk7CQkJXAorCQl9CQkJCQkJCVwKKwkJKHApOwkJCQkJCQlcCisJfSkKKworI2RlZmluZSBtZW16ZXJvKHAsbikgKHsgaWYgKChuKSAhPSAwKSBfX21lbXplcm8oKHApLChuKSk7IChwKTsgfSkKKyNlbHNlCitleHRlcm4gdm9pZCBtZW16ZXJvKHZvaWQgKnB0ciwgX19rZXJuZWxfc2l6ZV90IG4pOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vdHlwZXMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3OTkyMwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3R5cGVzLmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfX0FTTV9BUk1fVFlQRVNfSAorI2RlZmluZSBfX0FTTV9BUk1fVFlQRVNfSAorCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVtb2RlX3Q7CisKKy8qCisgKiBfX3h4IGlzIG9rOiBpdCBkb2Vzbid0IHBvbGx1dGUgdGhlIFBPU0lYIG5hbWVzcGFjZS4gVXNlIHRoZXNlIGluIHRoZQorICogaGVhZGVyIGZpbGVzIGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UKKyAqLworCit0eXBlZGVmIF9fc2lnbmVkX18gY2hhciBfX3M4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdTg7CisKK3R5cGVkZWYgX19zaWduZWRfXyBzaG9ydCBfX3MxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgX191MTY7CisKK3R5cGVkZWYgX19zaWduZWRfXyBpbnQgX19zMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfX3UzMjsKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykKK3R5cGVkZWYgX19zaWduZWRfXyBsb25nIGxvbmcgX19zNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3U2NDsKKyNlbmRpZgorCisvKgorICogVGhlc2UgYXJlbid0IGV4cG9ydGVkIG91dHNpZGUgdGhlIGtlcm5lbCB0byBhdm9pZCBuYW1lIHNwYWNlIGNsYXNoZXMKKyAqLworI2lmZGVmIF9fS0VSTkVMX18KKwordHlwZWRlZiBzaWduZWQgY2hhciBzODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKKwordHlwZWRlZiBzaWduZWQgc2hvcnQgczE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7CisKK3R5cGVkZWYgc2lnbmVkIGludCBzMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1MzI7CisKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBzNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1NjQ7CisKKyNkZWZpbmUgQklUU19QRVJfTE9ORyAzMgorCisvKiBEbWEgYWRkcmVzc2VzIGFyZSAzMi1iaXRzIHdpZGUuICAqLworCit0eXBlZGVmIHUzMiBkbWFfYWRkcl90OworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcGh5c19zaXplX3Q7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20veC1sb2FkLWFybS5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20veC1sb2FkLWFybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjI2OGUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS94LWxvYWQtYXJtLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBBbGV4IFp1ZXBrZSA8YXp1QHN5c2dvLmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX1hfTE9BRF9BUk1fSF8KKyNkZWZpbmUgX1hfTE9BRF9BUk1fSF8JMQorCisvKiBmb3IgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMsIHNlZSBzdGFydC5TICovCitleHRlcm4gdWxvbmcgX2FybWJvb3Rfc3RhcnQ7CS8qIGNvZGUgc3RhcnQgKi8KK2V4dGVybiB1bG9uZyBfYnNzX3N0YXJ0OwkvKiBjb2RlICsgZGF0YSBlbmQgPT0gQlNTIHN0YXJ0ICovCitleHRlcm4gdWxvbmcgX2Jzc19lbmQ7CQkvKiBCU1MgZW5kICovCisgICAKKyNlbmRpZgkvKiBfWF9MT0FEX0FSTV9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9iY2QuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYmNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0YWE5YwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYmNkLmgKQEAgLTAsMCArMSwyNSBAQAorLyogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byBjb3B5LCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGlzIGNvZGUKKyAqIGluIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIgb3IgbGF0ZXIsCisgKiBhdCB5b3VyIG9wdGlvbi4KKyAqLworCisvKiBpbmxpbmUgZnVuY3Rpb25zIHRvIHRyYW5zbGF0ZSB0by9mcm9tIGJpbmFyeSBhbmQgYmluYXJ5LWNvZGVkIGRlY2ltYWwKKyAqIChmcmVxdWVudGx5IGZvdW5kIGluIFJUQyBjaGlwcykuCisgKi8KKworI2lmbmRlZiBfQkNEX0gKKyNkZWZpbmUgX0JDRF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiY2QyYmluKHU4IHZhbCkKK3sKKwlyZXR1cm4gKCh2YWwpICYgMHgwZikgKyAoKHZhbCkgPj4gNCkgKiAxMDsKK30KKworc3RhdGljIGlubGluZSB1OCBiaW4yYmNkICh1bnNpZ25lZCBpbnQgdmFsKQoreworCXJldHVybiAoKCh2YWwgLyAxMCkgPDwgNCkgfCAodmFsICUgMTApKTsKK30KKworI2VuZGlmIC8qIF9CQ0RfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9ib290bS5oIGIveC1sb2FkZXIvaW5jbHVkZS9ib290bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNWQyNTkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2Jvb3RtLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMCBHcmFudCBFcmlja3NvbiA8bWFyYXRob245NkBnbWFpbC5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmCV9fQk9PVE1fSF9fCisjZGVmaW5lCV9fQk9PVE1fSF9fCisKKyNpbmNsdWRlICJjb21waWxlci5oIgorCisjaW5jbHVkZSA8aW1hZ2UuaD4KKworI2RlZmluZSBCT09UTV9TVEFUVVNfRkFJTFVSRSAwCisjZGVmaW5lIEJPT1RNX1NUQVRVU19TVUNDRVNTIDEKKworI2RlZmluZSBCT09UTV9JTkRFWF9TVEFSVCAgMAorI2RlZmluZSBCT09UTV9JTkRFWF9TVE9QICAtMQorCit0eXBlZGVmIHN0cnVjdCBib290X2V4dGVudCB7CisJdWxvbmcgc3RhcnQ7CisJdWxvbmcgc2l6ZTsKK30gYm9vdF9leHRlbnRfdDsKKwordHlwZWRlZiBpbnQgKCpkZXZpY2VfbG9hZCkodWludDhfdCAqYnVmZmVyLCBpbnQgKmluZGV4KTsKKworc3RhdGljIGlubGluZSBpbnQgYm9vdG1fbG9hZF9zdWNjZXNzZnVsKGludCBzdGF0dXMpCit7CisJcmV0dXJuIChzdGF0dXMgPT0gQk9PVE1fU1RBVFVTX1NVQ0NFU1MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBib290bV9sb2FkX2NvbnRpbnVlKGludCBzdGF0dXMsIGludCBpbmRleCkKK3sKKwlyZXR1cm4gKChzdGF0dXMgIT0gQk9PVE1fU1RBVFVTX1NVQ0NFU1MpICYmIChpbmRleCAhPSBCT09UTV9JTkRFWF9TVE9QKSk7Cit9CisKK2V4dGVybiBpbnQgYm9vdG0oY29uc3QgdWludDhfdCAqYnVmZmVyKTsKK2V4dGVybiBpbnQgYm9vdG1fYmluYXJ5KGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlcik7CisjaWYgZGVmaW5lZChDT05GSUdfQk9PVE1fSU1BR0UpCitleHRlcm4gaW50IGJvb3RtX2ltYWdlKGNvbnN0IGltYWdlX2hlYWRlcl90ICppbWFnZSk7CisjZW5kaWYKKworI2VuZGlmCS8qIF9fQk9PVE1fSF9fICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbW1hbmQuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOTM2YWQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbW1hbmQuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogIERlZmluaXRpb25zIGZvciBDb21tYW5kIFByb2Nlc3NvcgorICovCisjaWZuZGVmIF9fQ09NTUFORF9ICisjZGVmaW5lIF9fQ09NTUFORF9ICisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMCTAKKyNlbmRpZgorCisjaWZuZGVmCV9fQVNTRU1CTFlfXworLyoKKyAqIE1vbml0b3IgQ29tbWFuZCBUYWJsZQorICovCisKK3N0cnVjdCBjbWRfdGJsX3MgeworCWNoYXIJCSpuYW1lOwkJLyogQ29tbWFuZCBOYW1lCQkJKi8KKwlpbnQJCW1heGFyZ3M7CS8qIG1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cwkqLworCWludAkJcmVwZWF0YWJsZTsJLyogYXV0b3JlcGVhdCBhbGxvd2VkPwkJKi8KKwkJCQkJLyogSW1wbGVtZW50YXRpb24gZnVuY3Rpb24JKi8KKwlpbnQJCSgqY21kKShzdHJ1Y3QgY21kX3RibF9zICosIGludCwgaW50LCBjaGFyICpbXSk7CisJY2hhcgkJKnVzYWdlOwkJLyogVXNhZ2UgbWVzc2FnZQkoc2hvcnQpCSovCisjaWZkZWYJQ0ZHX0xPTkdIRUxQCisJY2hhcgkJKmhlbHA7CQkvKiBIZWxwICBtZXNzYWdlCShsb25nKQkqLworI2VuZGlmCisjaWZkZWYgQ09ORklHX0FVVE9fQ09NUExFVEUKKwkvKiBkbyBhdXRvIGNvbXBsZXRpb24gb24gdGhlIGFyZ3VtZW50cyAqLworCWludAkJKCpjb21wbGV0ZSkoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgY2hhciBsYXN0X2NoYXIsIGludCBtYXh2LCBjaGFyICpjbWR2W10pOworI2VuZGlmCit9OworCit0eXBlZGVmIHN0cnVjdCBjbWRfdGJsX3MJY21kX3RibF90OworCitleHRlcm4gY21kX3RibF90ICBfX3VfYm9vdF9jbWRfc3RhcnQ7CitleHRlcm4gY21kX3RibF90ICBfX3VfYm9vdF9jbWRfZW5kOworCisKKy8qIGNvbW1vbi9jb21tYW5kLmMgKi8KK2NtZF90YmxfdCAqZmluZF9jbWQoY29uc3QgY2hhciAqY21kKTsKKworI2lmZGVmIENPTkZJR19BVVRPX0NPTVBMRVRFCitleHRlcm4gdm9pZCBpbnN0YWxsX2F1dG9fY29tcGxldGUodm9pZCk7CitleHRlcm4gaW50IGNtZF9hdXRvX2NvbXBsZXRlKGNvbnN0IGNoYXIgKmNvbnN0IHByb21wdCwgY2hhciAqYnVmLCBpbnQgKm5wLCBpbnQgKmNvbHApOworI2VuZGlmCisKKy8qCisgKiBNb25pdG9yIENvbW1hbmQKKyAqCisgKiBBbGwgY29tbWFuZHMgdXNlIGEgY29tbW9uIGFyZ3VtZW50IGZvcm1hdDoKKyAqCisgKiB2b2lkIGZ1bmN0aW9uIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisgKi8KKwordHlwZWRlZgl2b2lkIAljb21tYW5kX3QgKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOworCisjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCisKKy8qCisgKiBDb21tYW5kIEZsYWdzOgorICovCisjZGVmaW5lIENNRF9GTEFHX1JFUEVBVAkJMHgwMDAxCS8qIHJlcGVhdCBsYXN0IGNvbW1hbmQJCSovCisjZGVmaW5lIENNRF9GTEFHX0JPT1RECQkweDAwMDIJLyogY29tbWFuZCBpcyBmcm9tIGJvb3RkCSovCisKKy8qCisgKiBDb25maWd1cmFibGUgbW9uaXRvciBjb21tYW5kcyBkZWZpbml0aW9ucyBoYXZlIGJlZW4gbW92ZWQKKyAqIHRvIGluY2x1ZGUvY21kX2NvbmZkZWZzLmgKKyAqLworCisKKyNkZWZpbmUgU3RydWN0X1NlY3Rpb24gIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsc2VjdGlvbiAoIi51X2Jvb3RfY21kIikpKQorCisjaWZkZWYgIENGR19MT05HSEVMUAorCisjZGVmaW5lIFVfQk9PVF9DTUQobmFtZSxtYXhhcmdzLHJlcCxjbWQsdXNhZ2UsaGVscCkgXAorY21kX3RibF90IF9fdV9ib290X2NtZF8jI25hbWUgU3RydWN0X1NlY3Rpb24gPSB7I25hbWUsIG1heGFyZ3MsIHJlcCwgY21kLCB1c2FnZSwgaGVscH0KKworI2Vsc2UJLyogbm8gbG9uZyBoZWxwIGluZm8gKi8KKworI2RlZmluZSBVX0JPT1RfQ01EKG5hbWUsbWF4YXJncyxyZXAsY21kLHVzYWdlLGhlbHApIFwKK2NtZF90YmxfdCBfX3VfYm9vdF9jbWRfIyNuYW1lIFN0cnVjdF9TZWN0aW9uID0geyNuYW1lLCBtYXhhcmdzLCByZXAsIGNtZCwgdXNhZ2V9CisKKyNlbmRpZgkvKiBDRkdfTE9OR0hFTFAgKi8KKworI2VuZGlmCS8qIF9fQ09NTUFORF9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbW1vbi5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjE4YWM4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb21tb24uaApAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwOQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09NTU9OX0hfCisjZGVmaW5lIF9fQ09NTU9OX0hfCTEKKworI3VuZGVmCV9MSU5VWF9DT05GSUdfSAorI2RlZmluZSBfTElOVVhfQ09ORklHX0ggMQkvKiBhdm9pZCByZWFkaW5nIExpbnV4IGF1dG9jb25mLmggZmlsZQkqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXwkJLyogcHV0IEMgb25seSBzdHVmZiBpbiB0aGlzIHNlY3Rpb24gKi8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1Y2hhcjsKK3R5cGVkZWYgdm9sYXRpbGUgdW5zaWduZWQgbG9uZwl2dV9sb25nOwordHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCB2dV9zaG9ydDsKK3R5cGVkZWYgdm9sYXRpbGUgdW5zaWduZWQgY2hhcgl2dV9jaGFyOworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmZGVmIENPTkZJR19BUk0KKyNkZWZpbmUgYXNtbGlua2FnZQkvKiBub3RoaW5nICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUk0KKyMgaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjIGluY2x1ZGUgPGFzbS94LWxvYWQtYXJtLmg+CS8qIEFSTSB2ZXJzaW9uIHRvIGJlIGZpeGVkISAqLworI2VuZGlmIC8qIENPTkZJR19BUk0gKi8KKworI2lmZGVmCUNGR19QUklOVEYKKyNkZWZpbmUgcHJpbnRmKGZtdCxhcmdzLi4uKQlzZXJpYWxfcHJpbnRmIChmbXQgLCMjYXJncykKKyNkZWZpbmUgZ2V0YygpIHNlcmlhbF9nZXRjKCkKKyNlbHNlCisjZGVmaW5lIHByaW50ZihmbXQsYXJncy4uLikKKyNkZWZpbmUgZ2V0YygpICcgJworI2VuZGlmCS8qIENGR19QUklOVEYgKi8KKworI2RlZmluZSBEVU1QX1JFRyh0YWcsIHJlZywgdHlwZSwgb3AsIGZvcm1hdCkgZG8gewkJCVwKKyAgICAgICAgcmVnaXN0ZXIgdTMyIF9yZWd2YXIgPSByZWc7CQkJCQkJCVwKKwkJcmVnaXN0ZXIgdHlwZSBfZGF0YXZhciA9IG9wKF9yZWd2YXIpOwkJCQlcCisgICAgICAgIHByaW50ZigiICAgICUtMzBzIEAgMHglMDh4ID0gIiAjZm9ybWF0ICJcbiIsCQlcCisJCQkgICB0YWcsIF9yZWd2YXIsIF9kYXRhdmFyKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERVTVBfUkVHQihtbmVtb25pYykJCQkJCQkJCQlcCisJRFVNUF9SRUcoI21uZW1vbmljLCBtbmVtb25pYywgdTgsIF9fcmF3X3JlYWRiLCAweCUwMngpCisKKyNkZWZpbmUgRFVNUF9SRUdXKG1uZW1vbmljKQkJCQkJCQkJCVwKKwlEVU1QX1JFRygjbW5lbW9uaWMsIG1uZW1vbmljLCB1MTYsIF9fcmF3X3JlYWR3LCAweCUwNHgpCisKKyNkZWZpbmUgRFVNUF9SRUdMKG1uZW1vbmljKQkJCQkJCQkJCVwKKwlEVU1QX1JFRygjbW5lbW9uaWMsIG1uZW1vbmljLCB1MzIsIF9fcmF3X3JlYWRsLCAweCUwOHgpCisKKyNpZmRlZglERUJVRworI2RlZmluZSBkZWJ1ZyhmbXQsYXJncy4uLikJcHJpbnRmIChmbXQgLCMjYXJncykKKyNkZWZpbmUgZGVidWdYKGxldmVsLGZtdCxhcmdzLi4uKSBpZiAoREVCVUc+PWxldmVsKSBwcmludGYoZm10LCMjYXJncyk7CisjZWxzZQorI2RlZmluZSBkZWJ1ZyhmbXQsYXJncy4uLikKKyNkZWZpbmUgZGVidWdYKGxldmVsLGZtdCxhcmdzLi4uKQorI2VuZGlmCS8qIERFQlVHICovCisKKyNkZWZpbmUgZXJyb3IoZm10LCBhcmdzLi4uKSBkbyB7CQkJCQlcCisJCXByaW50ZigiRVJST1I6ICIgZm10ICJcbmF0ICVzOiVkLyVzKClcbiIsCQlcCisJCQkjI2FyZ3MsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwkJXAorfSB3aGlsZSAoMCkKKworI2lmbmRlZiBCVUcKKyNkZWZpbmUgQlVHKCkgZG8geyBcCisJcHJpbnRmKCJCVUc6IGZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgXAorCXBhbmljKCJCVUchIik7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIEJVR19PTihjb25kaXRpb24pIGRvIHsgaWYgKHVubGlrZWx5KChjb25kaXRpb24pIT0wKSkgQlVHKCk7IH0gd2hpbGUoMCkKKyNlbmRpZiAvKiBCVUcgKi8KKworLyoKKyAqIEdlbmVyYWwgUHVycG9zZSBVdGlsaXRpZXMKKyAqLworI2RlZmluZSBtaW4oWCwgWSkJCQkJXAorCSh7IHR5cGVvZiAoWCkgX194ID0gKFgpLCBfX3kgPSAoWSk7CVwKKwkJKF9feCA8IF9feSkgPyBfX3ggOiBfX3k7IH0pCisKKyNkZWZpbmUgbWF4KFgsIFkpCQkJCVwKKwkoeyB0eXBlb2YgKFgpIF9feCA9IChYKSwgX195ID0gKFkpOwlcCisJCShfX3ggPiBfX3kpID8gX194IDogX195OyB9KQorCisjZGVmaW5lIE1JTih4LCB5KSAgbWluKHgsIHkpCisjZGVmaW5lIE1BWCh4LCB5KSAgbWF4KHgsIHkpCisKKworLyoqCisgKiBjb250YWluZXJfb2YgLSBjYXN0IGEgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG91dCB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUKKyAqIEBwdHI6CXRoZSBwb2ludGVyIHRvIHRoZSBtZW1iZXIuCisgKiBAdHlwZToJdGhlIHR5cGUgb2YgdGhlIGNvbnRhaW5lciBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICovCisjZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsJCQlcCisJY29uc3QgdHlwZW9mKCAoKHR5cGUgKikwKS0+bWVtYmVyICkgKl9fbXB0ciA9IChwdHIpOwlcCisJKHR5cGUgKikoIChjaGFyICopX19tcHRyIC0gb2Zmc2V0b2YodHlwZSxtZW1iZXIpICk7fSkKKworLyogKi8KK2ludAlkaXNwbGF5X29wdGlvbnMgKHZvaWQpOwordm9pZAlwcmludF9zaXplKHVuc2lnbmVkIGxvbmcgbG9uZywgY29uc3QgY2hhciAqKTsKK2ludAlwcmludF9idWZmZXIgKHVsb25nIGFkZHIsIHZvaWQqIGRhdGEsIHVpbnQgd2lkdGgsIHVpbnQgY291bnQsIHVpbnQgbGluZWxlbik7CisKKy8qIGJvYXJkLyQoQk9BUkQpLyQoQk9BUkQpLmMgKi8KK2ludCAJYm9hcmRfaW5pdCAodm9pZCk7CitpbnQgCW5hbmRfaW5pdCAodm9pZCk7CitpbnQgICAgIG1tY19ib290ICh1bnNpZ25lZCBjaGFyICpidWYpOwordm9pZAlib2FyZF9oYW5nICh2b2lkKTsKK3ZvaWQgICAgZG9fdXNiKHZvaWQpOworCisKKy8qIGNwdS8kKENQVSkvY3B1LmMgKi8KK2ludCAJY3B1X2luaXQgKHZvaWQpOworI2lmZGVmICBDRkdfVURFTEFZCit2b2lkIAl1ZGVsYXkgKHVuc2lnbmVkIGxvbmcgdXNlYyk7CisjZW5kaWYKKworLyogbmFuZCBkcml2ZXIgKi8KKyNkZWZpbmUgTkFORF9DTURfUkVBRDAJCTAKKyNkZWZpbmUgTkFORF9DTURfUkVBRDEJCTEKKyNkZWZpbmUgTkFORF9DTURfUkVBRE9PQgkweDUwCisjZGVmaW5lIE5BTkRfQ01EX1NUQVRVUwkJMHg3MAorI2RlZmluZSBOQU5EX0NNRF9SRUFESUQJCTB4OTAKKyNkZWZpbmUgTkFORF9DTURfUkVTRVQJCTB4ZmYKKworLyogRXh0ZW5kZWQgQ29tbWFuZHMgZm9yIExhcmdlIHBhZ2UgZGV2aWNlcyAqLworI2RlZmluZSBOQU5EX0NNRF9SRUFEU1RBUlQJMHgzMAorCisvKiBSZXR1cm4gY29kZXMgZm9yIG5hbmQgcmVhZHMgKi8KKyNkZWZpbmUgTkFORF9SRUFEX1NVQ0NFU1MgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTkFORF9SRUFEX1NLSVBQRURfQkFEX0JMT0NLICAgIDEKKyNkZWZpbmUgTkFORF9SRUFEX0VDQ19GQUlMVVJFICAgICAgICAgIDIKKworaW50IAluYW5kX2NoaXAodm9pZCk7CitpbnQgCW5hbmRfcmVhZF9ibG9jayh1Y2hhciAqYnVmLCB1bG9uZyBibG9ja19hZGRyKTsKKworaW50IAlvbmVuYW5kX2NoaXAodm9pZCk7CitpbnQJb25lbmFuZF9yZWFkX2Jsb2NrKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWxvbmcgYmxvY2spOworCisKKyNpZmRlZiBDRkdfUFJJTlRGCisKKy8qIHNlcmlhbCBkcml2ZXIgKi8KK2ludAlzZXJpYWxfaW5pdCAgICh2b2lkKTsKK3ZvaWQJc2VyaWFsX3NldGJyZyAodm9pZCk7Cit2b2lkCXNlcmlhbF9wdXRjICAgKGNvbnN0IGNoYXIpOwordm9pZAlzZXJpYWxfcHV0cyAgIChjb25zdCBjaGFyICopOworaW50CXNlcmlhbF9nZXRjICAgKHZvaWQpOworaW50CXNlcmlhbF90c3RjICAgKHZvaWQpOworCisvKiBsaWIvcHJpbnRmLmMgKi8KK3ZvaWQJc2VyaWFsX3ByaW50ZiAoY29uc3QgY2hhciAqZm10LCAuLi4pOworI2VuZGlmCisKKy8qIGxpYi9jcmMuYyAqLwordm9pZCAJbmFuZF9jYWxjdWxhdGVfZWNjIChjb25zdCB1X2NoYXIgKmRhdCwgdV9jaGFyICplY2NfY29kZSk7CisKKy8qIGxpYi92c3ByaW50Zi5jICovCisKK2ludCAJbmFuZF9jb3JyZWN0X2RhdGEgKHVfY2hhciAqZGF0LCB1X2NoYXIgKnJlYWRfZWNjLCB1X2NoYXIgKmNhbGNfZWNjKTsKKworLyogbGliL2JvYXJkLmMgKi8KK3ZvaWQJaGFuZwkJKHZvaWQpIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOworCisvKiBzdGRvdXQgKi8KK3ZvaWQJcHV0cyhjb25zdCBjaGFyICpzKTsKKworLyoKKyAqIEJvYXJkLXNwZWNpZmljIFBsYXRmb3JtIGNvZGUgY2FuIHJlaW1wbGVtZW50IHNob3dfYm9vdF9wcm9ncmVzcyAoKSBpZiBuZWVkZWQKKyAqLwordm9pZCBzaG93X2Jvb3RfcHJvZ3Jlc3MoaW50IHZhbCk7CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworLyogUHV0IG9ubHkgc3R1ZmYgaGVyZSB0aGF0IHRoZSBhc3NlbWJsZXIgY2FuIGRpZ2VzdCAqLworCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQorCisjZGVmaW5lIFJPVU5EKGEsYikJCSgoKGEpICsgKGIpKSAmIH4oKGIpIC0gMSkpCisjZGVmaW5lIERJVl9ST1VORChuLGQpCQkoKChuKSArICgoZCkvMikpIC8gKGQpKQorI2RlZmluZSBESVZfUk9VTkRfVVAobixkKQkoKChuKSArIChkKSAtIDEpIC8gKGQpKQorI2RlZmluZSByb3VuZHVwKHgsIHkpCQkoKCgoeCkgKyAoKHkpIC0gMSkpIC8gKHkpKSAqICh5KSkKKworI2RlZmluZSBBTElHTih4LGEpCQlfX0FMSUdOX01BU0soKHgpLCh0eXBlb2YoeCkpKGEpLTEpCisjZGVmaW5lIF9fQUxJR05fTUFTSyh4LG1hc2spCSgoKHgpKyhtYXNrKSkmfihtYXNrKSkKKworI2VuZGlmCS8qIF9fQ09NTU9OX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbXBpbGVyLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmNGI4MwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29tcGlsZXIuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIEtlZXAgYWxsIHRoZSB1Z2x5ICNpZmRlZiBmb3Igc3lzdGVtIHN0dWZmIGhlcmUKKyAqLworCisjaWZuZGVmIF9fQ09NUElMRVJfSF9fCisjZGVmaW5lIF9fQ09NUElMRVJfSF9fCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmZGVmIFVTRV9IT1NUQ0MKKworI2lmIGRlZmluZWQoX19CRU9TX18pCSB8fCBcCisgICAgZGVmaW5lZChfX05ldEJTRF9fKSAgfHwgXAorICAgIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IFwKKyAgICBkZWZpbmVkKF9fc3VuX18pCSB8fCBcCisgICAgZGVmaW5lZChfX0FQUExFX18pCisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiAhZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2VuZGlmCisKKy8qIE5vdCBhbGwgc3lzdGVtcyAobGlrZSBXaW5kb3dzKSBoYXMgdGhpcyBkZWZpbmUsIGFuZCB5ZXMKKyAqIHdlIGRvIHJlcGxhY2UvZW11bGF0ZSBtbWFwKCkgb24gdGhvc2Ugc3lzdGVtcyAuLi4KKyAqLworI2lmbmRlZiBNQVBfRkFJTEVECisjIGRlZmluZSBNQVBfRkFJTEVEICgodm9pZCAqKS0xKQorI2VuZGlmCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmbmRlZiBPX0JJTkFSWQkJLyogc2hvdWxkIGJlIGRlZmluZSdkIG9uIF9fV0lOMzJfXyAqLworI2RlZmluZSBPX0JJTkFSWQkwCisjZW5kaWYKKworI2lmZGVmIF9fbGludXhfXworIyBpbmNsdWRlIDxlbmRpYW4uaD4KKyMgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNlbGlmIGRlZmluZWQoX19NQUNIX18pCisjIGluY2x1ZGUgPG1hY2hpbmUvZW5kaWFuLmg+Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWxvbmc7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgdWludDsKKyNlbmRpZgorCit0eXBlZGVmIHVpbnQ4X3QgX191ODsKK3R5cGVkZWYgdWludDE2X3QgX191MTY7Cit0eXBlZGVmIHVpbnQzMl90IF9fdTMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKKworI2RlZmluZSB1c3dhcF8xNih4KSBcCisJKCgoKHgpICYgMHhmZjAwKSA+PiA4KSB8IFwKKwkgKCgoeCkgJiAweDAwZmYpIDw8IDgpKQorI2RlZmluZSB1c3dhcF8zMih4KSBcCisJKCgoKHgpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgXAorCSAoKCh4KSAmIDB4MDBmZjAwMDApID4+ICA4KSB8IFwKKwkgKCgoeCkgJiAweDAwMDBmZjAwKSA8PCAgOCkgfCBcCisJICgoKHgpICYgMHgwMDAwMDBmZikgPDwgMjQpKQorI2RlZmluZSBfdXN3YXBfNjQoeCwgc2Z4KSBcCisJKCgoKHgpICYgMHhmZjAwMDAwMDAwMDAwMDAwIyNzZngpID4+IDU2KSB8IFwKKwkgKCgoeCkgJiAweDAwZmYwMDAwMDAwMDAwMDAjI3NmeCkgPj4gNDApIHwgXAorCSAoKCh4KSAmIDB4MDAwMGZmMDAwMDAwMDAwMCMjc2Z4KSA+PiAyNCkgfCBcCisJICgoKHgpICYgMHgwMDAwMDBmZjAwMDAwMDAwIyNzZngpID4+ICA4KSB8IFwKKwkgKCgoeCkgJiAweDAwMDAwMDAwZmYwMDAwMDAjI3NmeCkgPDwgIDgpIHwgXAorCSAoKCh4KSAmIDB4MDAwMDAwMDAwMGZmMDAwMCMjc2Z4KSA8PCAyNCkgfCBcCisJICgoKHgpICYgMHgwMDAwMDAwMDAwMDBmZjAwIyNzZngpIDw8IDQwKSB8IFwKKwkgKCgoeCkgJiAweDAwMDAwMDAwMDAwMDAwZmYjI3NmeCkgPDwgNTYpKQorI2lmIGRlZmluZWQoX19HTlVDX18pCisjIGRlZmluZSB1c3dhcF82NCh4KSBfdXN3YXBfNjQoeCwgdWxsKQorI2Vsc2UKKyMgZGVmaW5lIHVzd2FwXzY0KHgpIF91c3dhcF82NCh4LCApCisjZW5kaWYKKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIGNwdV90b19sZTE2KHgpCQkoeCkKKyMgZGVmaW5lIGNwdV90b19sZTMyKHgpCQkoeCkKKyMgZGVmaW5lIGNwdV90b19sZTY0KHgpCQkoeCkKKyMgZGVmaW5lIGxlMTZfdG9fY3B1KHgpCQkoeCkKKyMgZGVmaW5lIGxlMzJfdG9fY3B1KHgpCQkoeCkKKyMgZGVmaW5lIGxlNjRfdG9fY3B1KHgpCQkoeCkKKyMgZGVmaW5lIGNwdV90b19iZTE2KHgpCQl1c3dhcF8xNih4KQorIyBkZWZpbmUgY3B1X3RvX2JlMzIoeCkJCXVzd2FwXzMyKHgpCisjIGRlZmluZSBjcHVfdG9fYmU2NCh4KQkJdXN3YXBfNjQoeCkKKyMgZGVmaW5lIGJlMTZfdG9fY3B1KHgpCQl1c3dhcF8xNih4KQorIyBkZWZpbmUgYmUzMl90b19jcHUoeCkJCXVzd2FwXzMyKHgpCisjIGRlZmluZSBiZTY0X3RvX2NwdSh4KQkJdXN3YXBfNjQoeCkKKyNlbHNlCisjIGRlZmluZSBjcHVfdG9fbGUxNih4KQkJdXN3YXBfMTYoeCkKKyMgZGVmaW5lIGNwdV90b19sZTMyKHgpCQl1c3dhcF8zMih4KQorIyBkZWZpbmUgY3B1X3RvX2xlNjQoeCkJCXVzd2FwXzY0KHgpCisjIGRlZmluZSBsZTE2X3RvX2NwdSh4KQkJdXN3YXBfMTYoeCkKKyMgZGVmaW5lIGxlMzJfdG9fY3B1KHgpCQl1c3dhcF8zMih4KQorIyBkZWZpbmUgbGU2NF90b19jcHUoeCkJCXVzd2FwXzY0KHgpCisjIGRlZmluZSBjcHVfdG9fYmUxNih4KQkJKHgpCisjIGRlZmluZSBjcHVfdG9fYmUzMih4KQkJKHgpCisjIGRlZmluZSBjcHVfdG9fYmU2NCh4KQkJKHgpCisjIGRlZmluZSBiZTE2X3RvX2NwdSh4KQkJKHgpCisjIGRlZmluZSBiZTMyX3RvX2NwdSh4KQkJKHgpCisjIGRlZmluZSBiZTY0X3RvX2NwdSh4KQkJKHgpCisjZW5kaWYKKworI2Vsc2UgLyogIVVTRV9IT1NUQ0MgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiBUeXBlcyBmb3IgYHZvaWQgKicgcG9pbnRlcnMuICovCisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCAgICAgICB1aW50cHRyX3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgICB1aW50cHRyX3Q7CisjZW5kaWYKKworI2VuZGlmCisKKy8qIGNvbXBpbGVyIG9wdGlvbnMgKi8KKyNkZWZpbmUgdW5pbml0aWFsaXplZF92YXIoeCkJCXggPSB4CisKKyNkZWZpbmUgbGlrZWx5KHgpCV9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpCisjZGVmaW5lIHVubGlrZWx5KHgpCV9fYnVpbHRpbl9leHBlY3QoISEoeCksIDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdfZGVmYXVsdHMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlnX2RlZmF1bHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmMDQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlnX2RlZmF1bHRzLmgKQEAgLTAsMCArMSw5IEBACisvKgorICogY29uZmlnX2RlZmF1bHRzLmggLSBzYW5lIGRlZmF1bHRzIGZvciBldmVyeW9uZQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9DT05GSUdfREVGQVVMVFNfSF8KKyNkZWZpbmUgX0NPTkZJR19ERUZBVUxUU19IXworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvYW0zNTE3ZXZtLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvYW0zNTE3ZXZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2YjkyNgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9hbTM1MTdldm0uaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOQorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogTWFuaWthbmRhbiBQaWxsYWk8bWFuaS5waWxsYWlAdGkuY29tPgorICogWC1Mb2FkZXIgQ29uZmlndWF0aW9uIHNldHRpbmdzIGZvciB0aGUgQU0zNTE3RVZNIGJvYXJkLgorICoKKyAqIERlcml2ZWQgZnJvbSAvaW5jbHVkZS9jb25maWdzL29tYXAzZXZtLmgKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKiBzZXJpYWwgcHJpbnRmIGZhY2lsaXR5IHRha2VzIGFib3V0IDMuNUsgKi8KKyNkZWZpbmUgQ0ZHX1BSSU5URgorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQVJNQ09SVEVYQTggICAgICAgMSAgICAvKiBUaGlzIGlzIGFuIEFSTSBWNyBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUCAgICAgICAgICAgICAgMSAgICAvKiBpbiBhIFRJIE9NQVAgY29yZSAqLworCisjZGVmaW5lIENPTkZJR19BTTM1MTdFVk0gICAgICAgMSAgICAvKiB3b3JraW5nIHdpdGggQU0zNTE3IEVWTSAqLworLy8jZGVmaW5lIENPTkZJR19BTTM1MTdURUIgICAgICAgMSAgICAvKiB3b3JraW5nIHdpdGggQU0zNTE3IFRFQiAqLworCisvKiBFbmFibGUgdGhlIGJlbG93IG1hY3JvIGlmIE1NQyBib290IHN1cHBvcnQgaXMgcmVxdWlyZWQgKi8KKyNkZWZpbmUgQ09ORklHX01NQyAgICAgICAgICAgICAgIDEKKyNpZiBkZWZpbmVkKENPTkZJR19NTUMpCisJI2RlZmluZSBDRkdfQ01EX01NQyAgICAgICAgICAgICAgMQorCSNkZWZpbmUgQ0ZHX0NNRF9GQVQgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+ICAgICAgICAvKiBnZXQgY2hpcCBhbmQgYm9hcmQgZGVmcyAqLworCisvKiB1bmNvbW1lbnQgaXQgaWYgeW91IG5lZWQgdGltZXIgYmFzZWQgdWRlbGF5KCkuIGl0IHRha2VzIGFib3V0IDI1MCBieXRlcyAqLworLy8jZGVmaW5lIENGR19VREVMQVkKKworLyogQ2xvY2sgRGVmaW5lcyAqLworI2RlZmluZSBWX09TQ0sgICAgICAgICAgICAgICAgICAgMjYwMDAwMDAgIC8qIENsb2NrIG91dHB1dCBmcm9tIFQyICovCisKKyNpZiAoVl9PU0NLID4gMTkyMDAwMDApCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICAoVl9PU0NLID4+IDEpCisjZWxzZQorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgVl9PU0NLCisjZW5kaWYKKworLy8jZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMjY2TUhaICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTMzTUh6IEREUiAqLworI2RlZmluZSBQUkNNX0NMS19DRkcyXzMzMk1IWiAgICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTY2TUh6IEREUiAqLworI2RlZmluZSBQUkNNX1BDTEtfT1BQMiAgICAgICAgICAgMSAgICAvKiBBUk09MzgxTUh6IC0gVkREMT0xLjIwdiAqLworCisjIGRlZmluZSBOQU5EX0JBU0VfQURSICAgICAgICAgICBOQU5EX0JBU0UgIC8qIE5BTkQgZmxhc2ggKi8KKyMgZGVmaW5lIE9ORU5BTkRfQkFTRSAgICAgICAgICAgIE9ORU5BTkRfTUFQICAvKiBPbmVOYW5kIGZsYXNoICovCisKKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfMTI4TQorI2RlZmluZSBPTkVOQU5EX0FERFIgT05FTkFORF9CQVNFICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIE9uZU5BTkQgYXQgQ1MwKi8KKworI2lmZGVmIENGR19QUklOVEYKKworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUgICAgICgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLICAgICAgICAgICg0ODAwMDAwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMyAgICAgICAgIE9NQVAzNFhYX1VBUlQzCisKKy8qCisgKiBzZWxlY3Qgc2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TRVJJQUwzICAgICAgICAgICAzICAgIC8qIFVBUlQxIG9uIE9NQVAzRVZNICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgICAzCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgIDExNTIwMAorI2RlZmluZSBDRkdfUEJTSVpFICAgICAgICAgICAgICAgMjU2CisKKyNlbmRpZiAvKiBDRkdfUFJJTlRGICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSICAgICAgICAgICAgIDB4ODAwMDgwMDAKKworI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFICAgICAgICAgKDEyOCoxMDI0KSAvKiByZWd1bGFyIHN0YWNrICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIE5BTkQgSW5mby4KKyAqLworCisjZGVmaW5lIENGR19OQU5EX0s5RjFHMDhSMEEgICAgLyogU2Ftc3VuZyA4LWJpdCAxMjhNQiBjaGlwIGxhcmdlIHBhZ2UgTkFORCBjaGlwKi8KKyNkZWZpbmUgTkFORF8xNkJJVAorCisvKiBOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogMHgwMDAwMDAwMCAtIDB4MDAwN0ZGRkYgIEJvb3RpbmcgSW1hZ2UKKyAqIDB4MDAwODAwMDAgLSAweDAwMjNGRkZGICBVLUJvb3QgSW1hZ2UKKyAqIDB4MDAyNDAwMDAgLSAweDAwMjdGRkZGICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqIDB4MDAyODAwMDAgLSAweDAwNzdGRkZGICBLZXJuZWwgSW1hZ2UKKyAqIDB4MDA3ODAwMDAgLSAweDA4MDAwMDAwICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9TVEFSVCAgICAgICAgIDB4MDA4MDAwMCAvKiBMZWF2aW5nIGZpcnN0IDQgYmxvY2tzIGZvciB4LWxvYWQgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9FTkQgICAgICAgICAgIDB4MDI0MDAwMCAvKiBHaXZpbmcgYSBzcGFjZSBvZiAyIGJsb2NrcyA9IDI1NktCICovCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRSAgICAgICAgICAweDIwMDAwCisKKyNkZWZpbmUgR1BNQ19DT05GSUcgICAgICAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg1MCkKKworI2lmIGRlZmluZWQgKENPTkZJR19BTTM1MTdFVk0pCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4N0MpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODApCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODQpCisjZWxpZiBkZWZpbmVkIChDT05GSUdfQU0zNTE3VEVCKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweERDKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweEUwKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8wICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweEU0KQorI2VuZGlmCisKKyNpZmRlZiBOQU5EXzE2QklUCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzApCisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZWxzZSAvKiB0byBzdXBwb3J0IDgtYml0IE5BTkQgZGV2aWNlcyAqLworI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzApOworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2VuZGlmCisKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBvbmVOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX1NZTkNfQlVSU1RfUkVBRAkxCisKKy8qIE9uZU5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAgIDB4MDAwMDAwMCAtIDB4MDA4MDAwMCAgWC1Mb2FkZXIKKyAqICAgMHgwMDgwMDAwIC0gMHgwMjQwMDAwICAgVS1ib290IEltYWdlCisgKiAgIDB4MDI0MDAwMCAtIDB4MDI4MDAwMCAgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogICAweDAyODAwMDAgLSAweDA3ODAwMDAgICBLZXJuZWwgSW1hZ2UKKyAqICAgMHgwNzgwMDAwIC0gMHg4MDAwMDAwICAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisKKyNkZWZpbmUgT05FTkFORF9TVEFSVF9CTE9DSyAgICAgIDQKKyNkZWZpbmUgT05FTkFORF9FTkRfQkxPQ0sgICAgICAgIDE4CisjZGVmaW5lIE9ORU5BTkRfUEFHRV9TSVpFICAgICAgICAyMDQ4ICAgICAvKiAyS0IgKi8KKyNkZWZpbmUgT05FTkFORF9CTE9DS19TSVpFICAgICAgIDB4MjAwMDAgIC8qIDEyOEtCICovCisKKyNlbmRpZiAvKiBfX0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9kaWFtb25kLXVzYi1sb2FkZXIuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9kaWFtb25kLXVzYi1sb2FkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTkyNzQxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2RpYW1vbmQtdXNiLWxvYWRlci5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTYgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB4LWxvYWRlciBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUKKyAqICAgICAgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqICAgICAgU0RSQU0gQ29udHJvbGxlciAoU0RSQyk6CisgKiAgICAgICAgLSBTYW1zdW5nIEs0WDUxMTYzUEktRkNHNiA2NCBNaUIgRERSIFNEUkFNCisgKgorICogICAgICBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpOgorICogICAgICAgIC0gTWljcm9uIE1UMjlGMkcxNkFCREhDLUVUIDI1NiBNaUIgU0xDIE5BTkQgRmxhc2ggKERldmVsb3BtZW50KQorICogICAgICAgIC0gTWljcm9uIE1UMjlGMkcxNkFCQkVBSDQgMjU2IE1pQiBTTEMgTkFORCBGbGFzaCAoTm9uLWRldmVsb3BtZW50KQorICogICAgICAgIC0gU2Ftc3VuZyBLOUY0RzA4VTBDIDUxMiBNaUIgU0xDIE5BTkQgRmxhc2ggKERldmVsb3BtZW50KQorICogICAgICAgIC0gU01TQyBMQU45MjIwIDEwLzEwMCBNYml0IEV0aGVybmV0IE1BQyBhbmQgUEhZIChEZXZlbG9wbWVudCkKKyAqCisgKiAgICAgIE11bHRpbWVkaWEgQ2FyZCAoTU1DKSBJbnRlcmZhY2U6CisgKiAgICAgICAgLSBNb2xleCA1MDA5OTgtMDkwMCBTZWN1cmUgRGlnaXRhbCAoU0QpIENvbm5lY3RvcgorICogICAgICAgIC0gVEkgV0wxMjcwIFdpcmVsZXNzIExBTiAoV0xBTikgTW9kdWxlCisgKgorICogICAgICBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKToKKyAqICAgICAgICAtIFNhbXN1bmcgTE1TMzUwREYwMyBIVkdBICgzMjAgeCA0ODApIExDTSAoRGV2ZWxvcG1lbnQgYW5kIFByb3RvdHlwZSkKKyAqICAgICAgICAtIFRpYW5tYSBUTTAyNVpEWjAxICgzMjAgeCAzMjApIExDTSAoUHJvZHVjdGlvbikKKyAqCisgKiAgICAgIENhbWVyYSBJbWFnZSBTaWduYWwgUHJvY2Vzc29yOgorICogICAgICAgIC0gVW51c2VkCisgKgorICogICAgICBVQVJUIENvbnRyb2xsZXI6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgICAgICogSGVhZCBVbml0IFNlcmlhbCBDb25zb2xlCisgKgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgICAgICAqIFppZ0JlZSBXaXJlbGVzcyBNb2R1bGUKKyAqCisgKiAgICAgIE11bHRpY2hhbm5lbCBCdWZmZXJlZCBTZXJpYWwgUG9ydCAoTWNCU1ApOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgIC0gQ2hhbm5lbCAzOgorICogICAgICAgIC0gQ2hhbm5lbCA0OgorICogICAgICAgIC0gQ2hhbm5lbCA1OgorICoKKyAqICAgICAgTXVsdGljaGFubmVsIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoTWNTUEkpOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgIC0gQ2hhbm5lbCAzOgorICoKKyAqICAgICAgR1BJTyBDb250cm9sbGVyOgorICogICAgICAgIC0gQmFja3BsYXRlIERldGVjdAorICogICAgICAgIC0gWmlnQmVlCisgKi8KKworI2lmbmRlZiBfX0RJQU1PTkRfVVNCX0xPQURFUl9DT05GSUdfSAorI2RlZmluZSBfX0RJQU1PTkRfVVNCX0xPQURFUl9DT05GSUdfSAorCisjaW5jbHVkZSAiZGlhbW9uZC5oIgorCisjZGVmaW5lIENPTkZJR19VU0IgMQorCisjZW5kaWYgLyogX19ESUFNT05EX1VTQl9MT0FERVJfQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2RpYW1vbmQuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9kaWFtb25kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE2ZmUxMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9kaWFtb25kLmgKQEAgLTAsMCArMSw0NjIgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHgtbG9hZGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHRoZQorICogICAgICBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogICAgICBUaGUgZmlsZSB3YXMgb3JpZ2luYWxseSBkZXJpdmVkIGZyb20gb21hcDNldm0uaC4KKyAqCisgKiAgICAgIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpOgorICogICAgICAgIC0gU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgNjQgTWlCIEREUiBTRFJBTQorICoKKyAqICAgICAgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyIChHUE1DKToKKyAqICAgICAgICAtIE1pY3JvbiBNVDI5RjJHMTZBQkRIQy1FVCAyNTYgTWlCIFNMQyBOQU5EIEZsYXNoIChEZXZlbG9wbWVudCkKKyAqICAgICAgICAtIE1pY3JvbiBNVDI5RjJHMTZBQkJFQUg0IDI1NiBNaUIgU0xDIE5BTkQgRmxhc2ggKE5vbi1kZXZlbG9wbWVudCkKKyAqICAgICAgICAtIFNhbXN1bmcgSzlGNEcwOFUwQyA1MTIgTWlCIFNMQyBOQU5EIEZsYXNoIChEZXZlbG9wbWVudCkKKyAqICAgICAgICAtIFNNU0MgTEFOOTIyMCAxMC8xMDAgTWJpdCBFdGhlcm5ldCBNQUMgYW5kIFBIWSAoRGV2ZWxvcG1lbnQpCisgKgorICogICAgICBNdWx0aW1lZGlhIENhcmQgKE1NQykgSW50ZXJmYWNlOgorICogICAgICAgIC0gTW9sZXggNTAwOTk4LTA5MDAgU2VjdXJlIERpZ2l0YWwgKFNEKSBDb25uZWN0b3IKKyAqICAgICAgICAtIFRJIFdMMTI3MCBXaXJlbGVzcyBMQU4gKFdMQU4pIE1vZHVsZQorICoKKyAqICAgICAgRGlzcGxheSBTdWJzeXN0ZW0gKERTUyk6CisgKiAgICAgICAgLSBTYW1zdW5nIExNUzM1MERGMDMgSFZHQSAoMzIwIHggNDgwKSBMQ00gKERldmVsb3BtZW50IGFuZCBQcm90b3R5cGUpCisgKiAgICAgICAgLSBUaWFubWEgVE0wMjVaRFowMSAoMzIwIHggMzIwKSBMQ00gKFByb2R1Y3Rpb24pCisgKgorICogICAgICBDYW1lcmEgSW1hZ2UgU2lnbmFsIFByb2Nlc3NvcjoKKyAqICAgICAgICAtIFVudXNlZAorICoKKyAqICAgICAgVUFSVCBDb250cm9sbGVyOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgICAgICAqIEhlYWQgVW5pdCBTZXJpYWwgQ29uc29sZQorICoKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAgICAgKiBaaWdCZWUgV2lyZWxlc3MgTW9kdWxlCisgKgorICogICAgICBNdWx0aWNoYW5uZWwgQnVmZmVyZWQgU2VyaWFsIFBvcnQgKE1jQlNQKToKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAtIENoYW5uZWwgMzoKKyAqICAgICAgICAtIENoYW5uZWwgNDoKKyAqICAgICAgICAtIENoYW5uZWwgNToKKyAqCisgKiAgICAgIE11bHRpY2hhbm5lbCBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKE1jU1BJKToKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAtIENoYW5uZWwgMzoKKyAqCisgKiAgICAgIEdQSU8gQ29udHJvbGxlcjoKKyAqICAgICAgICAtIEJhY2twbGF0ZSBEZXRlY3QKKyAqICAgICAgICAtIFppZ0JlZQorICovCisKKyNpZm5kZWYgX19ESUFNT05EX0NPTkZJR19ICisjZGVmaW5lIF9fRElBTU9ORF9DT05GSUdfSAorCisvKgorICogQVJNIFByb2Nlc3NvciBBcmNoaXRlY3R1cmUsIEZhbWlseSBhbmQgUHJvZHVjdCBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX0FSTUNPUlRFWEE4CQkxCisjZGVmaW5lIENPTkZJR19PTUFQICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ09ORklHX09NQVAzNFhYICAgICAgICAgMQorI2RlZmluZSBDT05GSUdfT01BUDM0MzAgICAgICAgICAxCisKKy8qCisgKiBXaXRoIHRoZSBhcmNoaXRlY3R1cmUsIGZhbWlseSBhbmQgcHJvZHVjdCBjb25maWd1cmF0aW9uIGRlZmluZWQsCisgKiBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBDUFUgaGVhZGVyIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorCisvKgorICogQXNzZXJ0IHRoZSBib2FyZCB0eXBlKHMpIHdlIGFyZSBidWlsZGluZyBmb3IuCisgKgorICovCisjdW5kZWYgQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQKKyN1bmRlZiBDT05GSUdfRElBTU9ORF9CT0FSRF9QUk9UT1RZUEUKKyN1bmRlZiBDT05GSUdfRElBTU9ORF9CT0FSRF9FVlQKKyN1bmRlZiBDT05GSUdfRElBTU9ORF9CT0FSRF9EVlQKKyN1bmRlZiBDT05GSUdfRElBTU9ORF9CT0FSRF9QVlQKKyN1bmRlZiBDT05GSUdfRElBTU9ORF9CT0FSRF9NUAorI2RlZmluZSBDT05GSUdfRElBTU9ORF9CT0FSRF9NVUxUSQkJCTEKKworLyoKKyAqIEVuYWJsZSBzZXJpYWwgY29uc29sZSBwcmludGYgZmFjaWxpdHkgKGNvbnN1bWVzIGFib3V0IDMuNSBLaUIpCisgKi8KKyNkZWZpbmUgQ0ZHX1BSSU5URgorCisvKgorICogQ09ORklHX0JPT1RNX0lNQUdFIC0gVGhpcyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgWC1Mb2FkZXIKKyAqIHN1cHBvcnRzIGJvb3RpbmcgZnJvbSAnbWtpbWFnZScgdS1ib290IGltYWdlIGZpbGVzIHJhdGhlciB0aGFuIGp1c3QKKyAqIHJhdywgdS1ib290IGJpbmFyaWVzLgorICoKKyAqIEVuYWJsaW5nIHRoaXMgYWRkcyBzdXBwb3J0IGZvciBhdHRlbXB0aW5nIHRvIGJvb3QgZnJvbSBvbmUgb3IgbW9yZQorICogaW1hZ2VzIGJlY2F1c2UgaXQgYWxsb3dzIGFuIGltYWdlIHRvIGJlIHNhbml0eS1jaGVja2VkIGJlZm9yZQorICogYXR0ZW1wdGluZyB0byBib290IGl0LgorICovCisjZGVmaW5lIENPTkZJR19CT09UTV9JTUFHRQorCisvKgorICogRGlzcGxheSBpbWFnZSBpbmZvcm1hdGlvbiB3aXRoIHRpbWVzdGFtcHMKKyAqLworI2lmZGVmIENPTkZJR19CT09UTV9JTUFHRQorI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX1BSSU5URikKKy8qCisgKiBVc2UgYSBwcmludGYgYnVmZmVyIHNpemUgb2YgMjU2IEIKKyAqLworIyBkZWZpbmUgQ0ZHX1BCU0laRQkJCQkyNTYKKworLyoKKyAqIEluZGljYXRlIHRoYXQgd2Ugd2FudCB0byB1c2UgQ0ZHX05TMTY1NTBfQ09NMSAoc2VlIGJlbG93KSBhdCBhIGJhdWQKKyAqIHJhdGUgb2YgMTE1LDIwMCBicHMgZm9yIHRoZSBzZXJpYWwgY29uc29sZS4KKyAqLworIyBkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgICAxCisjIGRlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgIDExNTIwMAorCisvKgorICogTlMxNjU1MC1jb21wYXRpYmxlIHNlcmlhbCBkcml2ZXIgY29uZmlndXJhdGlvbgorICovCisjIGRlZmluZSBDRkdfTlMxNjU1MAorIyBkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjIGRlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRSAgICgtNCkKKyMgZGVmaW5lIENGR19OUzE2NTUwX0NMSyAgICAgICAgKDQ4MDAwMDAwKQorIyBkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMSAgICAgICBPTUFQMzRYWF9VQVJUMQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX1BSSU5URikgKi8KKworLyoKKyAqIERpc2FibGUgdGltZXItYmFzZWQgZGVsYXkgKGNvbnN1bWVzIGFib3V0IDI1MCBCKSBzaW5jZSB0aGlzIGlzIG9ubHkKKyAqIGF2YWlsYWJsZSBhdCBwcmVzZW50IG9uIHRoZSBBUk05MjZFSlMuCisgKi8KKyN1bmRlZglDRkdfVURFTEFZCisKKy8qCisgKiBUaGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGRldmVsb3BtZW50IGJvYXJkIGhhcyBhbiBTRC9NTUMKKyAqIGNvbm5lY3Rvciwgc28gZW5hYmxlIHN1cHBvcnQgZm9yIGl0LCB3aGljaCBpbXBsaWNpdGx5IGVuYWJsZXMKKyAqIHJ1ZGltZW50YXJ5IHN1cHBvcnQgZm9yIE1TLURPUyAoTUJSKSBwYXJ0aXRpb25zIGFuZCBGQVQgZmlsZQorICogc3lzdGVtcy4KKyAqLworI2RlZmluZSBDT05GSUdfTU1DCQkJCTEKKworI2lmIGRlZmluZWQoQ09ORklHX01NQykKKyMgZGVmaW5lIENGR19DTURfTU1DICAgICAgICAgICAgMQorIyBkZWZpbmUgQ0ZHX0NNRF9GQVQgICAgICAgICAgICAxCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfTU1DKSAqLworCisvKgorICogQ2xvY2sgQ29uZmlndXJhdGlvbgorICoKKyAqICBDaG9vc2UgUFJDTSBDb25maWd1cmF0aW9uIDIgd2hpY2ggc3Vic2VsZWN0cyBhIEwzIGludGVyY29ubmVjdAorICogIGNsb2NrIG9mIDE2NiBNSHogZm9yIFNEUkFNLgorICovCisKKyN1bmRlZiBDRkdfUFJDTV9ERUJVRworCisjZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMzMyTUhaICAgICAJCTEKKworI2RlZmluZQlDT05GSUdfU1lTX01QVV9EUExMXzMwME1IWgkJMQorI3VuZGVmCUNPTkZJR19TWVNfTVBVX0RQTExfNjAwTUhaCisKKyNkZWZpbmUJQ09ORklHX1NZU19DT1JFX0RQTExfMzMyTUhaCQkxCisjdW5kZWYJQ09ORklHX1NZU19DT1JFX0RQTExfMjAwTUhaCisjdW5kZWYJQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaCisKKyNkZWZpbmUgQ0ZHX1NEUkFNX1NJWkVfTUIJCQkJNjQKKyN1bmRlZiBDRkdfU0RSQU1fREVCVUcKKworLyoKKyAqIFRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgbWF5IGhhdmUgb25lIG9mIHRocmVlIFNEUkFNcworICogMWEpU2Ftc3VuZyBJLURpZSA2NE1CCisgKiAgICAzMk1ieDE2CisgKiAgICBWREQ9MS44VgorICogICAgNm5zIGN5Y2xlIHRpbWUKKyAqICAgIENMPTMKKyAqIAorICogMWIpU2Ftc3VuZyBLLURpZSA2NE1CCisgKiAgICAzMk1ieDE2CisgKiAgICBWREQ9MS44VgorICogICAgNm5zIGN5Y2xlIHRpbWUKKyAqICAgIENMPTMKKyAqCisgKiAyKSBOYW55YSBOVDZETSA2NE1CCisgKiAgICAzMk1ieDE2CisgKiAgICBWREQ9MS44VgorICogICAgNm5zIGN5Y2xlIHRpbWUKKyAqICAgIENMPTMKKyAqCisgKi8KKworI3VuZGVmIENGR19TRFJBTV9TTUdfSzRYCisjdW5kZWYgQ0ZHX1NEUkFNX05ZQV9OVEQ2CisjZGVmaW5lIENGR19TRFJBTV9DT01CSU5FRAorLyoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIFNhbXN1bmcgSzRYNTExNjNQSy1GR0M2IGRhdGFzaGVldCAKKyAqIChhcHBsaWNhYmxlIHRvIHRoZSBJLWRpZSBhbmQgdGhlIEstZGllKSBhbmQgdGhlIFRJIHNwcmVhZHNoZWV0IAorICogYXQgaHR0cDovL3Byb2Nlc3NvcnMud2lraS50aS5jb20vaW5kZXgucGhwP3RpdGxlPQorICogU2V0dGluZ191cF9BTTM3eF9TRFJDX3JlZ2lzdGVycy4KKyAqLworI2lmIGRlZmluZWQoQ0ZHX1NEUkFNX1NNR19LNFgpCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSRkMJCTEyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQwkJMTAKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJBUwkJIDcKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJQCQkgMworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkNECQkgMworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlJECQkgMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9URFBMCQkgMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UREFMCQkgNQorCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RXVFIJCSAxCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RDS0UJCSAyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RYUAkJIDEKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhTUgkJMjAKKyNlbmRpZgorCisvKgorICogVGhlc2UgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgTmFueWEgTlQ2RE0gZGF0YXNoZWV0IGFuZCB0aGUgVEkKKyAqIHNwcmVhZHNoZWV0IGF0IGh0dHA6Ly9wcm9jZXNzb3JzLndpa2kudGkuY29tL2luZGV4LnBocD90aXRsZT0KKyAqIFNldHRpbmdfdXBfQU0zN3hfU0RSQ19yZWdpc3RlcnMuCisgKi8KKyNpZiBkZWZpbmVkKENGR19TRFJBTV9OWUFfTlRENikKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJGQwkJMTIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDCQkxMAorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkFTCQkgNworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlAJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQ0QJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSUkQJCSAyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1REUEwJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1REQUwJICAgICAgICAgNgkKKworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UV1RSCQkgMQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFCQkgMQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFAJCSAxCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RYU1IJCTE5CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fQ09NQklORUQpCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSRkMJCTEyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQwkJMTAKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJBUwkJIDcKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJQCQkgMworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkNECQkgMworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlJECQkgMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9URFBMCQkgMworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UREFMCSAgICAgICAgIDYJCisKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFdUUgkJIDEKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVENLRQkJIDIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhQCQkgMQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFNSCSAgICAgICAgMjAJCisjZW5kaWYKKworCisKKy8qCisgKiBOQU5EIENvbmZpZ3VyYXRpb24KKyAqCisgKiBUaGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkIG1heSBoYXZlIHR3byBOQU5EIGRldmljZXM6CisgKgorICogICAxYSkgTWljcm9uIE1UMjlGMkcxNkFCREhDLUVUIEAgR1BNQyBDUzAKKyAqCisgKiAgICAgIC0gMiBHYiB4IDE2ICgyNTYgTWlCKQorICogICAgICAtIDIgS2lCIHBhZ2Ugc2l6ZQorICogICAgICAtIDEyOCBLaUIgZXJhc2Ugc2l6ZQorICogICAgICAtIDEuOFYKKyAqICAgICAgLSBTTEMKKyAqICAgICAgLSAxLWJpdCBFQ0MKKyAqCisgKiAgIDFiKSBNaWNyb24gTVQyOUYyRzE2QUJCRUFINCBAIEdQTUMgQ1MwCisgKgorICogICAgICAtIDIgR2IgeCAxNiAoMjU2IE1pQikKKyAqICAgICAgLSAyIEtpQiBwYWdlIHNpemUKKyAqICAgICAgLSAxMjggS2lCIGVyYXNlIHNpemUKKyAqICAgICAgLSAxLjhWCisgKiAgICAgIC0gU0xDCisgKiAgICAgIC0gNC1iaXQgRUNDCisgKgorICogICAyKSBTYW1zdW5nIEs5RjRHMDhVMEMgQCBHUE1DIENTMworICoKKyAqICAgICAgLSA0IEdiIHggOCAoNTEyIE1pQikKKyAqICAgICAgLSAyIEtpQiBwYWdlIHNpemUKKyAqICAgICAgLSAxMjggS2lCIGVyYXNlIHNpemUKKyAqICAgICAgLSAzLjNWCisgKiAgICAgIC0gU0xDCisgKi8KKworI2RlZmluZSBDRkdfR1BNQ19OQU5ECisjZGVmaW5lIENGR19NTUNfTkFORAorI3VuZGVmCUNGR19HUE1DX09ORU5BTkQKKyN1bmRlZglDRkdfTU1DX09ORU5BTkQKKworI3VuZGVmIENGR19HUE1DX0RFQlVHCisKKyN1bmRlZglDRkdfTkFORF9LOUY0RzA4VTBDCQkvLyBTYW1zdW5nIEs5RjRHMDhVMEMKKyNkZWZpbmUgQ0ZHX05BTkRfTVQyOUYyRzE2CQkvLyBNaWNyb24gTVQyOUYyRzE2CisKKyN1bmRlZiAgQ0ZHX05BTkRfRUNDXzFCSVQKKyNkZWZpbmUgQ0ZHX05BTkRfRUNDXzRCSVQJMQorI3VuZGVmICBDRkdfTkFORF9FQ0NfOEJJVAorCisjZGVmaW5lIENGR19HUE1DX05BTkRfQkFTRQlOQU5EX0JBU0UKKyNkZWZpbmUgQ0ZHX0dQTUNfTkFORF9TSVpFCUdQTUNfU0laRV8xMjhNCisKKyNpZiBkZWZpbmVkKENGR19OQU5EX01UMjlGMkcxNikKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHMV8wCU1fTkFORF9HUE1DX0NPTkZJRzEKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHMl8wCU1fTkFORF9HUE1DX0NPTkZJRzIKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHM18wCU1fTkFORF9HUE1DX0NPTkZJRzMKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHNF8wCU1fTkFORF9HUE1DX0NPTkZJRzQKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHNV8wCU1fTkFORF9HUE1DX0NPTkZJRzUKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHNl8wCU1fTkFORF9HUE1DX0NPTkZJRzYKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHN18wCVwKKwkoR1BNQ19DT05GSUc3X01BU0tBRERSRVNTX0VOQ09ERShDRkdfR1BNQ19OQU5EX1NJWkUpIHwgXAorCSBHUE1DX0NPTkZJRzdfQkFTRUFERFJFU1NfRU5DT0RFKENGR19HUE1DX05BTkRfQkFTRSkpCisjZW5kaWYgLyogZGVmaW5lZChDRkdfTkFORF9NVDI5RjJHMTYpICovCisKKyNpZiBkZWZpbmVkKENGR19OQU5EX0s5RjRHMDhVMEMpCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzFfMwlNX05BTkRfR1BNQ19DT05GSUcxIC8vU01OQU5EX0dQTUNfQ09ORklHMQorI2RlZmluZSBDRkdfR1BNQ19DT05GSUcyXzMJTV9OQU5EX0dQTUNfQ09ORklHMiAvL1NNTkFORF9HUE1DX0NPTkZJRzIKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHM18zCU1fTkFORF9HUE1DX0NPTkZJRzMgLy9TTU5BTkRfR1BNQ19DT05GSUczCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzRfMwlNX05BTkRfR1BNQ19DT05GSUc0IC8vU01OQU5EX0dQTUNfQ09ORklHNAorI2RlZmluZSBDRkdfR1BNQ19DT05GSUc1XzMJTV9OQU5EX0dQTUNfQ09ORklHNSAvL1NNTkFORF9HUE1DX0NPTkZJRzUKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHNl8zCU1fTkFORF9HUE1DX0NPTkZJRzYgLy9TTU5BTkRfR1BNQ19DT05GSUc2CisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzdfMwlcCisJKEdQTUNfQ09ORklHN19NQVNLQUREUkVTU19FTkNPREUoQ0ZHX0dQTUNfTkFORF9TSVpFKSB8IFwKKwkgR1BNQ19DT05GSUc3X0JBU0VBRERSRVNTX0VOQ09ERShDRkdfR1BNQ19OQU5EX0JBU0UpKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfSzlGNEcwOFUwQykgKi8KKworLyoKKyAqIEFyY2hpdGVjdHVyZSwgcHJvY2Vzc29yIGFuZC9vciBib2FyZC1zcGVjaWZpYyBOQU5EIGFjY2VzcyBtYWNyb3MKKyAqIGFuZCBkcml2ZXIgcGFyYW1ldGVycy4KKyAqLworCisjaWYgZGVmaW5lZChDRkdfTkFORF9NVDI5RjJHMTYpCisjIGRlZmluZSBOQU5EXzE2QklUCisjIGRlZmluZSBOQU5EX0JMT0NLX1NJWkUJKDEyOCA8PCAxMCkKKyNlbGlmIGRlZmluZWQoQ0ZHX05BTkRfSzlGNEcwOFUwQykKKyMgdW5kZWYJTkFORF8xNkJJVAorIyBkZWZpbmUgTkFORF9CTE9DS19TSVpFCSgxMjggPDwgMTApCisjZW5kaWYgLyogZGVmaW5lZChDRkdfTkFORF9NVDI5RjJHMTYpICovCisKKyNpZmRlZiBOQU5EXzE2QklUCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzApCisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSBHUE1DX1dSSVRFUFJPVEVDVF9ISUdIO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfkdQTUNfV1JJVEVQUk9URUNUX0hJR0g7fSB3aGlsZSgwKQorCisjZWxzZSAvKiB0byBzdXBwb3J0IDgtYml0IE5BTkQgZGV2aWNlcyAqLworI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzApOworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gR1BNQ19XUklURVBST1RFQ1RfSElHSDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH5HUE1DX1dSSVRFUFJPVEVDVF9ISUdIO30gd2hpbGUoMCkKKyNlbmRpZiAvKiBOQU5EXzE2QklUICovCisKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKQorCisvKgorICogTG9jYXRpb24gd2hlcmUgd2UgZXhwZWN0IHRvIGZpbmQgdGhlIHNlY29uZC1zdGFnZSBib290IGxvYWRlciBpbgorICogdGhlIGJvb3QgTkFORCBkZXZpY2UuCisgKgorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIEFsaWFzIERlc2NyaXB0aW9uICAgICAgICAgICAgU2l6ZSAgICBCbG9ja3MgIEJsb2NrICAgICBBZGRyZXNzICAgICBTaXplCisgKiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICBpcGwJIFgtTG9hZGVyIEltYWdlCSAgICAgIDI1NiBLaUIgICAgICAyICAgICAgMAkgIDB4MDAwMDAwMDAgICAgMCBCCisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICBzcGwwCSBQcmltYXJ5IFUtQm9vdCBJbWFnZSAxLjUgTWlCICAgICAxMiAgICAgIDIJICAweDAwMDQwMDAwICAyNTYgS2lCCisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICBzcGwxCSBSZXNlcnZlZCBmb3IgRnV0dXJlICAxLjUgTWlCICAgICAxMiAgICAgMTQJICAweDAwMUMwMDAwIDEuNzUgTWlCCisgKiAgICAgICAgICAgU2Vjb25kYXJ5IFUtQm9vdAorICogICAgICAgICAgIEltYWdlCisgKiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjZGVmaW5lIENGR19OQU5EX0JPT1RFWFRFTlQwX1NUQVJUCQkweDAwMDQwMDAwCisjZGVmaW5lIENGR19OQU5EX0JPT1RFWFRFTlQxX1NUQVJUCQkweDAwMUMwMDAwCisjZGVmaW5lIENGR19OQU5EX0JPT1RFWFRFTlRfU0laRQkJMHgxODAwMDAKKworI2lmZGVmIENPTkZJR19CT09UTV9JTUFHRQorI2RlZmluZSBDT05GSUdfTkFORF9CT09URVhURU5UX0xJU1QJCXsgeyBDRkdfTkFORF9CT09URVhURU5UMF9TVEFSVCwgXAorCQkJCQkJCQkJCQlDRkdfTkFORF9CT09URVhURU5UX1NJWkUgfSwJXAorCQkJCQkJCQkJCSAgeyBDRkdfTkFORF9CT09URVhURU5UMV9TVEFSVCwgXAorCQkJCQkJCQkJCQlDRkdfTkFORF9CT09URVhURU5UX1NJWkUgfSB9CisjZWxzZQorI2RlZmluZSBDT05GSUdfTkFORF9CT09URVhURU5UCQkJeyBDRkdfTkFORF9CT09URVhURU5UMF9TVEFSVCwgXAorCQkJCQkJCQkJCSAgQ0ZHX05BTkRfQk9PVEVYVEVOVF9TSVpFIH0KKyNlbmRpZgorCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisKKy8qCisgKiBDT05GSUdfQk9PVEZJTEUgLSBUaGlzIGNhbiBiZSB1c2VkIHRvIHNldCBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQorICogc2Vjb25kLXN0YWdlIGJvb3QgZmlsZSBsb2FkZWQgZnJvbSBTRCBjYXJkIGlmIHRoZSBzeXN0ZW0gaGFzIGJlZW4KKyAqIGNvbmZpZ3VyZWQgdG8gYm9vdCBhcyBzdWNoLgorICoKKyAqIENPTkZJR19CT09URklMRV9MSVNUIC0gVGhpcyBjYW4gYmUgdXNlZCB0byBhIGxpc3Qgb2YgZGVmYXVsdCB2YWx1ZXMKKyAqIGZvciB0aGUgc2Vjb25kLXN0YWdlIGJvb3QgZmlsZSBsb2FkZWQgZnJvbSBTRCBjYXJkIGlmIHRoZSBzeXN0ZW0gaGFzIGJlZW4KKyAqIGNvbmZpZ3VyZWQgdG8gYm9vdCBhcyBzdWNoLgorICoKKyAqIFRyeSB0byBib290IGFuICdta2ltYWdlJyB1LWJvb3QgaW1hZ2UgZmlyc3Q7IG90aGVyd2lzZSwgdHJ5IHRvIGJvb3QgYQorICogcmF3IHUtYm9vdCBiaW5hcnkgaWYgaXQgZXhpc3RzIGFzIGEgZmFsbGJhY2suCisgKi8KKyNpZmRlZiBDT05GSUdfQk9PVE1fSU1BR0UKKyNkZWZpbmUgQ09ORklHX0JPT1RGSUxFX0xJU1QgCQkJeyAidS1ib290LmltZyIsICJ1LWJvb3QuYmluIiB9CisjZWxzZQorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCQkJCSJ1LWJvb3QuaW1nIgorI2VuZGlmCisKKy8qCisgKiBMb2NhdGlvbiBpbiBTRFJBTSB3aGVyZSB0aGUgc2Vjb25kLXN0YWdlIGJvb3QgbG9hZGVyIHdpbGwgYmUgbG9hZGVkCisgKiB0byBhbmQgZXhlY3V0ZWQgZnJvbS4KKyAqLworI2RlZmluZSBDRkdfTE9BREFERFIgICAgICAgICAgICAgCQkweDgwMDA4MDAwCisKKyNlbmRpZiAvKiBfX0RJQU1PTkRfQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2o0OS11c2ItbG9hZGVyLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvajQ5LXVzYi1sb2FkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzE0YzdiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2o0OS11c2ItbG9hZGVyLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMiBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHgtbG9hZGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHRoZQorICogICAgICBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgSjQ5IGJvYXJkLiAgVGhlIGl0ZW1zIGJlbG93IHNob3VsZAorICogICAgICBiZSB1cGRhdGVkIGFzIHRoZSBoYXJkd2FyZSBzZXR0bGVzLgorICoKKyAqICAgICAgU0RSQU0gQ29udHJvbGxlciAoU0RSQyk6CisgKiAgICAgICAgLSBTYW1zdW5nIEs0WDUxMTYzUEktRkNHNiA2NCBNaUIgRERSIFNEUkFNCisgKgorICogICAgICBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpOgorICogICAgICAgIC0gTWljcm9uIE1UMjlGMkcxNkFCREhDLUVUIDI1NiBNaUIgU0xDIE5BTkQgRmxhc2ggKERldmVsb3BtZW50KQorICogICAgICAgIC0gTWljcm9uIE1UMjlGMkcxNkFCQkVBSDQgMjU2IE1pQiBTTEMgTkFORCBGbGFzaCAoTm9uLWRldmVsb3BtZW50KQorICogICAgICAgIC0gU2Ftc3VuZyBLOUY0RzA4VTBDIDUxMiBNaUIgU0xDIE5BTkQgRmxhc2ggKERldmVsb3BtZW50KQorICogICAgICAgIC0gU01TQyBMQU45MjIwIDEwLzEwMCBNYml0IEV0aGVybmV0IE1BQyBhbmQgUEhZIChEZXZlbG9wbWVudCkKKyAqCisgKiAgICAgIE11bHRpbWVkaWEgQ2FyZCAoTU1DKSBJbnRlcmZhY2U6CisgKiAgICAgICAgLSBNb2xleCA1MDA5OTgtMDkwMCBTZWN1cmUgRGlnaXRhbCAoU0QpIENvbm5lY3RvcgorICogICAgICAgIC0gVEkgV0wxMjcwIFdpcmVsZXNzIExBTiAoV0xBTikgTW9kdWxlCisgKgorICogICAgICBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKToKKyAqICAgICAgICAtIFNhbXN1bmcgTE1TMzUwREYwMyBIVkdBICgzMjAgeCA0ODApIExDTSAoRGV2ZWxvcG1lbnQgYW5kIFByb3RvdHlwZSkKKyAqICAgICAgICAtIFRpYW5tYSBUTTAyNVpEWjAxICgzMjAgeCAzMjApIExDTSAoUHJvZHVjdGlvbikKKyAqCisgKiAgICAgIENhbWVyYSBJbWFnZSBTaWduYWwgUHJvY2Vzc29yOgorICogICAgICAgIC0gVW51c2VkCisgKgorICogICAgICBVQVJUIENvbnRyb2xsZXI6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgICAgICogSGVhZCBVbml0IFNlcmlhbCBDb25zb2xlCisgKgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgICAgICAqIFppZ0JlZSBXaXJlbGVzcyBNb2R1bGUKKyAqCisgKiAgICAgIE11bHRpY2hhbm5lbCBCdWZmZXJlZCBTZXJpYWwgUG9ydCAoTWNCU1ApOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgIC0gQ2hhbm5lbCAzOgorICogICAgICAgIC0gQ2hhbm5lbCA0OgorICogICAgICAgIC0gQ2hhbm5lbCA1OgorICoKKyAqICAgICAgTXVsdGljaGFubmVsIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoTWNTUEkpOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgIC0gQ2hhbm5lbCAzOgorICoKKyAqICAgICAgR1BJTyBDb250cm9sbGVyOgorICogICAgICAgIC0gQmFja3BsYXRlIERldGVjdAorICogICAgICAgIC0gWmlnQmVlCisgKi8KKworI2lmbmRlZiBfX0o0OV9DT05GSUdfSAorI2RlZmluZSBfX0o0OV9DT05GSUdfSAorCisjaW5jbHVkZSAiZGlhbW9uZC5oIgorCisvKgorICogQXNzZXJ0IHRoZSBib2FyZCB0eXBlKHMpIHdlIGFyZSBidWlsZGluZyBmb3IuCisgKgorICovCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9QUk9UT1RZUEUKKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX0VWVAorI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfRFZUCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9QUkVfUFZUCisjZGVmaW5lIENPTkZJR19KNDlfQk9BUkRfTVVMVEkJCQkxCisKKyNkZWZpbmUgQ09ORklHX1VTQiAxCisKKyNlbmRpZiAvKiBfX0o0OV9DT05GSUdfSCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvajQ5LmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvajQ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2NThkYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9qNDkuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEyIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgeC1sb2FkZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlCisgKiAgICAgIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBKNDkgYm9hcmQuICBUaGUgaXRlbXMgYmVsb3cgc2hvdWxkCisgKiAgICAgIGJlIHVwZGF0ZWQgYXMgdGhlIGhhcmR3YXJlIHNldHRsZXMuCisgKgorICogICAgICBTRFJBTSBDb250cm9sbGVyIChTRFJDKToKKyAqICAgICAgICAtIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDY0IE1pQiBERFIgU0RSQU0KKyAqCisgKiAgICAgIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlciAoR1BNQyk6CisgKiAgICAgICAgLSBNaWNyb24gTVQyOUYyRzE2QUJESEMtRVQgMjU2IE1pQiBTTEMgTkFORCBGbGFzaCAoRGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBNaWNyb24gTVQyOUYyRzE2QUJCRUFINCAyNTYgTWlCIFNMQyBOQU5EIEZsYXNoIChOb24tZGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBTYW1zdW5nIEs5RjRHMDhVMEMgNTEyIE1pQiBTTEMgTkFORCBGbGFzaCAoRGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBTTVNDIExBTjkyMjAgMTAvMTAwIE1iaXQgRXRoZXJuZXQgTUFDIGFuZCBQSFkgKERldmVsb3BtZW50KQorICoKKyAqICAgICAgTXVsdGltZWRpYSBDYXJkIChNTUMpIEludGVyZmFjZToKKyAqICAgICAgICAtIE1vbGV4IDUwMDk5OC0wOTAwIFNlY3VyZSBEaWdpdGFsIChTRCkgQ29ubmVjdG9yCisgKiAgICAgICAgLSBUSSBXTDEyNzAgV2lyZWxlc3MgTEFOIChXTEFOKSBNb2R1bGUKKyAqCisgKiAgICAgIERpc3BsYXkgU3Vic3lzdGVtIChEU1MpOgorICogICAgICAgIC0gU2Ftc3VuZyBMTVMzNTBERjAzIEhWR0EgKDMyMCB4IDQ4MCkgTENNIChEZXZlbG9wbWVudCBhbmQgUHJvdG90eXBlKQorICogICAgICAgIC0gVGlhbm1hIFRNMDI1WkRaMDEgKDMyMCB4IDMyMCkgTENNIChQcm9kdWN0aW9uKQorICoKKyAqICAgICAgQ2FtZXJhIEltYWdlIFNpZ25hbCBQcm9jZXNzb3I6CisgKiAgICAgICAgLSBVbnVzZWQKKyAqCisgKiAgICAgIFVBUlQgQ29udHJvbGxlcjoKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAgICAgKiBIZWFkIFVuaXQgU2VyaWFsIENvbnNvbGUKKyAqCisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgICAgICogWmlnQmVlIFdpcmVsZXNzIE1vZHVsZQorICoKKyAqICAgICAgTXVsdGljaGFubmVsIEJ1ZmZlcmVkIFNlcmlhbCBQb3J0IChNY0JTUCk6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgLSBDaGFubmVsIDM6CisgKiAgICAgICAgLSBDaGFubmVsIDQ6CisgKiAgICAgICAgLSBDaGFubmVsIDU6CisgKgorICogICAgICBNdWx0aWNoYW5uZWwgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChNY1NQSSk6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgLSBDaGFubmVsIDM6CisgKgorICogICAgICBHUElPIENvbnRyb2xsZXI6CisgKiAgICAgICAgLSBCYWNrcGxhdGUgRGV0ZWN0CisgKiAgICAgICAgLSBaaWdCZWUKKyAqLworCisjaWZuZGVmIF9fSjQ5X0NPTkZJR19ICisjZGVmaW5lIF9fSjQ5X0NPTkZJR19ICisKKyNpbmNsdWRlICJkaWFtb25kLmgiCisKKy8qCisgKiBBc3NlcnQgdGhlIGJvYXJkIHR5cGUocykgd2UgYXJlIGJ1aWxkaW5nIGZvci4KKyAqCisgKi8KKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX1BST1RPVFlQRQorI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfRVZUCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9EVlQKKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX1BSRV9QVlQKKyNkZWZpbmUgQ09ORklHX0o0OV9CT0FSRF9NVUxUSQkJCTEKKworI2VuZGlmIC8qIF9fSjQ5X0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMC5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAxNTEwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkZWFjZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMC5oCkBAIC0wLDAgKzEsNjk4IEBACisvKgorICoKKyAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgorICogICBPTUFQIGhhcmR3YXJlIG1hcAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBSaWRnZVJ1biwgSW5jLiAoaHR0cDovL3d3dy5yaWRnZXJ1bi5jb20pCisgKiBBdXRob3I6IFJpZGdlUnVuLCBJbmMuCisgKgkgICBHcmVnIExvbm5vbiAoZ2xvbm5vbkByaWRnZXJ1bi5jb20pIG9yIGluZm9AcmlkZ2VydW4uY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQkgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YJIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCUxpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVECSAgYGBBUwlJUycnIEFORCAgIEFOWQlFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLAkgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqICBOTwlFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRQkgTElBQkxFIEZPUiBBTlkJICBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVECSAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTCU9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLAlPUiBQUk9GSVRTOyBPUglCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCSBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxhc20vYXJjaC9zaXplcy5oPgorCisvKgorICBUaGVyZSBhcmUgMiBzZXRzIG9mIGdlbmVyYWwgSS9PIC0tPgorICAxLiBHUElPIChzaGFyZWQgYmV0d2VlbiBBUk0gJiBEU1AsIGNvbmZpZ3VyZWQgYnkgQVJNKQorICAyLiBNUFVJTyB3aGljaCBjYW4gYmUgdXNlZCBvbmx5IGJ5IHRoZSBBUk0uCisKKyAgQmFzZSBhZGRyZXNzIEZGRkI6NTAwMCBpcyB3aGVyZSB0aGUgQVJNIGFjY2Vzc2VzIHRoZSBNUFVJTyBjb250cm9sIHJlZ2lzdGVycworICAoc2VlIDcuMi4yIG9mIHRoZSBUUk0gZm9yIE1QVUlPIHJlZyBkZWZpbml0aW9ucykuCisKKyAgQmFzZSBhZGRyZXNzIEUxMDE6NTAwMCBpcyByZXNlcnZlZCBmb3IgQVJNIGFjY2VzcyBvZiB0aGUgc2FtZSBNUFVJTyBjb250cm9sCisgIHJlZ3MsIGJ1dCB2aWEgdGhlIERTUCBJL08gbWFwLiAgVGhpcyBhZGRyZXNzIGlzIHVuYXZhaWxhYmxlIG9uIDE1MTAuCisKKyAgQmFzZSBhZGRyZXNzIEZGRkM6RTAwMCBpcyB3aGVyZSB0aGUgQVJNIGFjY2Vzc2VzIHRoZSBHUElPIGNvbmZpZyByZWdpc3RlcnMKKyAgZGlyZWN0bHkgdmlhIGl0cyBvd24gcGVyaXBoZXJhbCBidXMuCisKKyAgQmFzZSBhZGRyZXNzIEUxMDE6RTAwMCBpcyB3aGVyZSB0aGUgQVJNIGNhbiBhY2Nlc3MgdGhlIHNhbWUgR1BJTyBjb25maWcKKyAgcmVnaXN0ZXJzLCBidXQgdGhlIGFjY2VzcyB0YWtlcyBwbGFjZSB0aHJvdWdoIHRoZSBBUk0gcG9ydCBpbnRlcmZhY2UgKGNhbGxlZAorICBBUEkgb3IgTVBVSSkgdmlhIHRoZSBEU1AncyBwZXJpcGhlcmFsIGJ1cyAoRFNQIEkvTyBzcGFjZSkuCisKKyAgVGhlcmVmb3JlLCB0aGUgQVJNIHNob3VsZCBzZXR1cCB0aGUgR1BJTyByZWdzIHRocnUgdGhlIEZGRkM6RTAwMCBhZGRyZXNzZXMKKyAgaW5zdGVhZCBvZiB0aGUgRTEwMTpFMDAwIGFkZHJlc3Nlcy4gIFRoZSBEU1AgaGFzIG9ubHkgcmVhZCBhY2Nlc3Mgb2YgdGhlIHBpbgorICBjb250cm9sIHJlZ2lzdGVyLCBzbyB0aGlzIG1heSBleHBsYWluIHRoZSBpbmFiaWxpdHkgdG8gd3JpdGUgdG8gRTEwMTpFMDE4LgorICBUcnkgYWNjZXNzaW5nIHBpbiBjb250cm9sIHJlZyBhdCBGRkZDOkUwMTguCisgKi8KKyNkZWZpbmUgT01BUDE1MTBfR1BJT19CQVNFCSAweGZmZmNlMDAwCisjZGVmaW5lIE9NQVAxNTEwX0dQSU9fU1RBUlQJIE9NQVAxNTEwX0dQSU9fQkFTRQorI2RlZmluZSBPTUFQMTUxMF9HUElPX1NJWkUJIFNaXzRLCisKKyNkZWZpbmUgT01BUDE1MTBfTUNCU1AxX0JBU0UJIDB4RTEwMTEwMDAKKyNkZWZpbmUgT01BUDE1MTBfTUNCU1AxX1NJWkUJIFNaXzRLCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQMV9TVEFSVAkgMHhFMTAxMTAwMAorCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQMl9CQVNFCSAweEZGRkIxMDAwCisKKyNkZWZpbmUgT01BUDE1MTBfTUNCU1AzX0JBU0UJIDB4RTEwMTcwMDAKKyNkZWZpbmUgT01BUDE1MTBfTUNCU1AzX1NJWkUJIFNaXzRLCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQM19TVEFSVAkgMHhFMTAxNzAwMAorCisvKgorICogV2hlcmUncyB0aGUgZmx1c2ggYWRkcmVzcyAoZm9yIGZsdXNoaW5nIEQgYW5kIEkgY2FjaGU/KQorICovCisjZGVmaW5lIEZMVVNIX0JBU0UJCTB4ZGYwMDAwMDAKKyNkZWZpbmUgRkxVU0hfQkFTRV9QSFlTIDB4MDAwMDAwMDAKKworI2lmbmRlZiBfX0FTU0VNQkxFUl9fCisKKyNkZWZpbmUgUENJT19CQVNFCQkwCisKKy8qCisgKiBSQU0gZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBNQVBUT1BIWVMoYSkJCSgodW5zaWduZWQgbG9uZykoYSkgLSBQQUdFX09GRlNFVCkKKyNkZWZpbmUgS0VSTlRPUEhZUyhhKQkJKCh1bnNpZ25lZCBsb25nKSgmYSkpCisjZGVmaW5lIEtFUk5FTF9CQVNFCQkoMHgxMDAwODAwMCkKKyNlbmRpZgorCisvKiBtYWNybyB0byBnZXQgYXQgSU8gc3BhY2Ugd2hlbiBydW5uaW5nIHZpcnR1YWxseSAqLworI2RlZmluZSBJT19BRERSRVNTKHgpICgoeCkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPTUFQMTUxMCBzeXN0ZW0gcmVnaXN0ZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBPTUFQMTUxMF9VQVJUMV9CQVNFCSAgICAweGZmZmIwMDAwCSAvKiAiQkxVRVRPT1RILVVBUlQiICovCisjZGVmaW5lIE9NQVAxNTEwX1VBUlQyX0JBU0UJICAgIDB4ZmZmYjA4MDAJIC8qICJNT0RFTS1VQVJUIiAqLworI2RlZmluZSBPTUFQMTUxMF9SVENfQkFTRQkgICAgMHhmZmZiNDgwMAkgLyogUlRDICovCisjZGVmaW5lIE9NQVAxNTEwX1VBUlQzX0JBU0UJICAgIDB4ZmZmYjk4MDAJIC8qIFNoYXJlZCBNUFUvRFNQIFVBUlQgKi8KKyNkZWZpbmUgT01BUDE1MTBfQ09NX01DQlNQMl9CQVNFICAgIDB4ZmZmZjEwMDAJIC8qIENvbSBNY0JTUDIgKi8KKyNkZWZpbmUgT01BUDE1MTBfQVVESU9fTUNCU1BfQkFTRSAgIDB4ZmZmZjE4MDAJIC8qIEF1ZGlvIE1jQlNQMiAqLworI2RlZmluZSBPTUFQMTUxMF9BUk1JT19CQVNFCSAgICAweGZmZmI1MDAwCSAvKiBrZXlib2FyZC9ncGlvICovCisKKy8qCisgKiBPTUFQMTUxMCBVQVJUMyBSZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIE9NQVBfTVBVX1VBUlQzX0JBU0UgIDB4RkZGQjk4MDAgLyogVUFSVDMgdGhyb3VnaCBNUFUgYnVzICovCisKKy8qIFVBUlQzIFJlZ2lzdGVycyBNYXBpbmcgdGhyb3VnaCBNUFUgYnVzICovCisKKyNkZWZpbmUgVUFSVDNfUkhSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDApCisjZGVmaW5lIFVBUlQzX1RIUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAwKQorI2RlZmluZSBVQVJUM19ETEwJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMCkKKyNkZWZpbmUgVUFSVDNfSUVSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDQpCisjZGVmaW5lIFVBUlQzX0RMSAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyA0KQorI2RlZmluZSBVQVJUM19JSVIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgOCkKKyNkZWZpbmUgVUFSVDNfRkNSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDgpCisjZGVmaW5lIFVBUlQzX0VGUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyA4KQorI2RlZmluZSBVQVJUM19MQ1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgwQykKKyNkZWZpbmUgVUFSVDNfTUNSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MTApCisjZGVmaW5lIFVBUlQzX1hPTjFfQUREUjEgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDEwKQorI2RlZmluZSBVQVJUM19YT04yX0FERFIyIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxNCkKKyNkZWZpbmUgVUFSVDNfTFNSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MTQpCisjZGVmaW5lIFVBUlQzX1RDUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDE4KQorI2RlZmluZSBVQVJUM19NU1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxOCkKKyNkZWZpbmUgVUFSVDNfWE9GRjEJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxOCkKKyNkZWZpbmUgVUFSVDNfWE9GRjIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxQykKKyNkZWZpbmUgVUFSVDNfU1BSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MUMpCisjZGVmaW5lIFVBUlQzX1RMUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDFDKQorI2RlZmluZSBVQVJUM19NRFIxCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MjApCisjZGVmaW5lIFVBUlQzX01EUjIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgyNCkKKyNkZWZpbmUgVUFSVDNfU0ZMU1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgyOCkKKyNkZWZpbmUgVUFSVDNfVFhGTEwJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgyOCkKKyNkZWZpbmUgVUFSVDNfUkVTVU1FCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MkMpCisjZGVmaW5lIFVBUlQzX1RYRkxICSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MkMpCisjZGVmaW5lIFVBUlQzX1NGUkVHTAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDMwKQorI2RlZmluZSBVQVJUM19SWEZMTAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDMwKQorI2RlZmluZSBVQVJUM19TRlJFR0gJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgzNCkKKyNkZWZpbmUgVUFSVDNfUlhGTEgJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgzNCkKKyNkZWZpbmUgVUFSVDNfQkxSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MzgpCisjZGVmaW5lIFVBUlQzX0FDUkVHCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4M0MpCisjZGVmaW5lIFVBUlQzX0RJVjE2CSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4M0MpCisjZGVmaW5lIFVBUlQzX1NDUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDQwKQorI2RlZmluZSBVQVJUM19TU1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHg0NCkKKyNkZWZpbmUgVUFSVDNfRUJMUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDQ4KQorI2RlZmluZSBVQVJUM19PU0NfMTJNX1NFTCAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4NEMpCisjZGVmaW5lIFVBUlQzX01WUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDUwKQorCisvKgorICogQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMKKyAqLworI2RlZmluZSBGVU5DX01VWF9DVFJMXzAJCTB4ZmZmZTEwMDAKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF8xCQkweGZmZmUxMDA0CisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfMgkJMHhmZmZlMTAwOAorI2RlZmluZSBDT01QX01PREVfQ1RSTF8wCTB4ZmZmZTEwMGMKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF8zCQkweGZmZmUxMDEwCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfNAkJMHhmZmZlMTAxNAorI2RlZmluZSBGVU5DX01VWF9DVFJMXzUJCTB4ZmZmZTEwMTgKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF82CQkweGZmZmUxMDFDCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfNwkJMHhmZmZlMTAyMAorI2RlZmluZSBGVU5DX01VWF9DVFJMXzgJCTB4ZmZmZTEwMjQKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF85CQkweGZmZmUxMDI4CisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfQQkJMHhmZmZlMTAyQworI2RlZmluZSBGVU5DX01VWF9DVFJMX0IJCTB4ZmZmZTEwMzAKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF9DCQkweGZmZmUxMDM0CisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfRAkJMHhmZmZlMTAzOAorI2RlZmluZSBQVUxMX0RXTl9DVFJMXzAJCTB4ZmZmZTEwNDAKKyNkZWZpbmUgUFVMTF9EV05fQ1RSTF8xCQkweGZmZmUxMDQ0CisjZGVmaW5lIFBVTExfRFdOX0NUUkxfMgkJMHhmZmZlMTA0OAorI2RlZmluZSBQVUxMX0RXTl9DVFJMXzMJCTB4ZmZmZTEwNGMKKyNkZWZpbmUgR0FURV9JTkhfQ1RSTF8wCQkweGZmZmUxMDUwCisjZGVmaW5lIFZPTFRBR0VfQ1RSTF8wCQkweGZmZmUxMDYwCisjZGVmaW5lIFRFU1RfREJHX0NUUkxfMAkJMHhmZmZlMTA3MAorCisjZGVmaW5lIE1PRF9DT05GX0NUUkxfMAkJMHhmZmZlMTA4MAorCisvKiAxNjEwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQMTYxMCkgfHwgZGVmaW5lZChDT05GSUdfT01BUDE3MTApCisjZGVmaW5lIFVTQl9PVEdfQ1RSTAkJMHhGRkZCMDQwQworI2RlZmluZSBVU0JfVFJBTlNDRUlWRVJfQ1RSTAkweEZGRkUxMDY0CisjZGVmaW5lIFBVTExfRFdOX0NUUkxfNAkJMHhGRkZFMTBBQworI2RlZmluZSBQVV9QRF9TRUxfMAkJMHhGRkZFMTBCNAorI2RlZmluZSBQVV9QRF9TRUxfMQkJMHhGRkZFMTBCOAorI2RlZmluZSBQVV9QRF9TRUxfMgkJMHhGRkZFMTBCQworI2RlZmluZSBQVV9QRF9TRUxfMwkJMHhGRkZFMTBDMAorI2RlZmluZSBQVV9QRF9TRUxfNAkJMHhGRkZFMTBDNAorCisjZW5kaWYKKy8qCisgKiBUcmFmZmljIENvbnRyb2xsZXIgTWVtb3J5IEludGVyZmFjZSBSZWdpc3RlcnMKKyAqLworI2RlZmluZSBUQ01JRl9CQVNFCQkweGZmZmVjYzAwCisjZGVmaW5lIElNSUZfUFJJTwkJKFRDTUlGX0JBU0UgKyAweDAwKQorI2RlZmluZSBFTUlGU19QUklPX1JFRwkJKFRDTUlGX0JBU0UgKyAweDA0KQorI2RlZmluZSBFTUlGRl9QUklPX1JFRwkJKFRDTUlGX0JBU0UgKyAweDA4KQorI2RlZmluZSBFTUlGU19DT05GSUdfUkVHCShUQ01JRl9CQVNFICsgMHgwYykKKyNkZWZpbmUgRU1JRlNfQ1MwX0NPTkZJRwkoVENNSUZfQkFTRSArIDB4MTApCisjZGVmaW5lIEVNSUZTX0NTMV9DT05GSUcJKFRDTUlGX0JBU0UgKyAweDE0KQorI2RlZmluZSBFTUlGU19DUzJfQ09ORklHCShUQ01JRl9CQVNFICsgMHgxOCkKKyNkZWZpbmUgRU1JRlNfQ1MzX0NPTkZJRwkoVENNSUZfQkFTRSArIDB4MWMpCisjZGVmaW5lIEVNSUZGX1NEUkFNX0NPTkZJRwkoVENNSUZfQkFTRSArIDB4MjApCisjZGVmaW5lIEVNSUZGX01SUwkJKFRDTUlGX0JBU0UgKyAweDI0KQorI2RlZmluZSBUQ19USU1FT1VUMQkJKFRDTUlGX0JBU0UgKyAweDI4KQorI2RlZmluZSBUQ19USU1FT1VUMgkJKFRDTUlGX0JBU0UgKyAweDJjKQorI2RlZmluZSBUQ19USU1FT1VUMwkJKFRDTUlGX0JBU0UgKyAweDMwKQorI2RlZmluZSBUQ19FTkRJQU5JU00JCShUQ01JRl9CQVNFICsgMHgzNCkKKyNkZWZpbmUgRU1JRkZfU0RSQU1fQ09ORklHXzIJKFRDTUlGX0JBU0UgKyAweDNjKQorI2RlZmluZSBFTUlGX0NGR19EWU5BTUlDX1dTCShUQ01JRl9CQVNFICsgMHg0MCkKKworLyoKKyAqIExDRCBQYW5lbAorICovCisjZGVmaW5lIFRJOTI1X0xDRF9CQVNFCQkweEZGRkVDMDAwCisjZGVmaW5lIFRJOTI1X0xDRF9DT05UUk9MCShUSTkyNV9MQ0RfQkFTRSkKKyNkZWZpbmUgVEk5MjVfTENEX1RJTUlORzAJKFRJOTI1X0xDRF9CQVNFKzB4NCkKKyNkZWZpbmUgVEk5MjVfTENEX1RJTUlORzEJKFRJOTI1X0xDRF9CQVNFKzB4OCkKKyNkZWZpbmUgVEk5MjVfTENEX1RJTUlORzIJKFRJOTI1X0xDRF9CQVNFKzB4YykKKyNkZWZpbmUgVEk5MjVfTENEX1NUQVRVUwkoVEk5MjVfTENEX0JBU0UrMHgxMCkKKyNkZWZpbmUgVEk5MjVfTENEX1NVQlBBTkVMCShUSTkyNV9MQ0RfQkFTRSsweDE0KQorCisjZGVmaW5lIE9NQVBfTENEX0NPTlRST0wJVEk5MjVfTENEX0NPTlRST0wKKworLyoKKyAqIE1NQy9TRCBIb3N0IENvbnRyb2xsZXIgUmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBPTUFQX01NQ19DTUQJIDB4RkZGQjc4MDAgLyogTU1DIENvbW1hbmQgKi8KKyNkZWZpbmUgT01BUF9NTUNfQVJHTAkgMHhGRkZCNzgwNCAvKiBNTUMgYXJndW1lbnQgbG93ICovCisjZGVmaW5lIE9NQVBfTU1DX0FSR0gJIDB4RkZGQjc4MDggLyogTU1DIGFyZ3VtZW50IGhpZ2ggKi8KKyNkZWZpbmUgT01BUF9NTUNfQ09OCSAweEZGRkI3ODBDIC8qIE1NQyBzeXN0ZW0gY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBPTUFQX01NQ19TVEFUCSAweEZGRkI3ODEwIC8qIE1NQyBzdGF0dXMgKi8KKyNkZWZpbmUgT01BUF9NTUNfSUUJIDB4RkZGQjc4MTQgLyogTU1DIHN5c3RlbSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIE9NQVBfTU1DX0NUTwkgMHhGRkZCNzgxOCAvKiBNTUMgY29tbWFuZCB0aW1lLW91dCAqLworI2RlZmluZSBPTUFQX01NQ19EVE8JIDB4RkZGQjc4MUMgLyogTU1DIGRhdGEgdGltZS1vdXQgKi8KKyNkZWZpbmUgT01BUF9NTUNfREFUQQkgMHhGRkZCNzgyMCAvKiBNTUMgVFgvUlggRklGTyBkYXRhICovCisjZGVmaW5lIE9NQVBfTU1DX0JMRU4JIDB4RkZGQjc4MjQgLyogTU1DIGJsb2NrIGxlbmd0aCAqLworI2RlZmluZSBPTUFQX01NQ19OQkxLCSAweEZGRkI3ODI4IC8qIE1NQyBudW1iZXIgb2YgYmxvY2tzICovCisjZGVmaW5lIE9NQVBfTU1DX0JVRgkgMHhGRkZCNzgyQyAvKiBNTUMgYnVmZmVyIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgT01BUF9NTUNfU1BJCSAweEZGRkI3ODMwIC8qIE1NQyBzZXJpYWwgcG9ydCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgT01BUF9NTUNfU0RJTwkgMHhGRkZCNzgzNCAvKiBNTUMgU0RJTyBtb2RlIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgT01BUF9NTUNfU1lTVAkgMHhGRkZCNzgzOCAvKiBNTUMgc3lzdGVtIHRlc3QgKi8KKyNkZWZpbmUgT01BUF9NTUNfUkVWCSAweEZGRkI3ODNDIC8qIE1NQyBtb2R1bGUgdmVyc2lvbiAqLworI2RlZmluZSBPTUFQX01NQ19SU1AwCSAweEZGRkI3ODQwIC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDAgKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQMQkgMHhGRkZCNzg0NCAvKiBNTUMgY29tbWFuZCByZXNwb25zZSAxICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDIJIDB4RkZGQjc4NDggLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgMiAqLworI2RlZmluZSBPTUFQX01NQ19SU1AzCSAweEZGRkI3ODRDIC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDMgKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQNAkgMHhGRkZCNzg1MCAvKiBNTUMgY29tbWFuZCByZXNwb25zZSA0ICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDUJIDB4RkZGQjc4NTQgLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgNSAqLworI2RlZmluZSBPTUFQX01NQ19SU1A2CSAweEZGRkI3ODU4IC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDYgKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQNwkgMHhGRkZCNzg1QyAvKiBNTUMgY29tbWFuZCByZXNwb25zZSA0ICovCisKKy8qIE1NQyBtYXNrcyAqLworCisjZGVmaW5lIE9NQVBfTU1DX0VORF9PRl9DTUQJKDEgPDwgMCkJLyogRW5kIG9mIGNvbW1hbmQgcGhhc2UgKi8KKyNkZWZpbmUgT01BUF9NTUNfQ0FSRF9CVVNZCSgxIDw8IDIpCS8qIENhcmQgZW50ZXIgYnVzeSBzdGF0ZSAqLworI2RlZmluZSBPTUFQX01NQ19CTE9DS19SUwkoMSA8PCAzKQkvKiBCbG9jayByZWNlaXZlZC9zZW50ICovCisjZGVmaW5lIE9NQVBfTU1DX0VPRl9CVVNZCSgxIDw8IDQpCS8qIENhcmQgZXhpdCBidXN5IHN0YXRlICovCisjZGVmaW5lIE9NQVBfTU1DX0RBVEFfVElNRU9VVAkoMSA8PCA1KQkvKiBEYXRhIHJlc3BvbnNlIHRpbWUtb3V0ICovCisjZGVmaW5lIE9NQVBfTU1DX0RBVEFfQ1JDCSgxIDw8IDYpCS8qIERhdGUgQ1JDIGVycm9yICovCisjZGVmaW5lIE9NQVBfTU1DX0NNRF9USU1FT1VUCSgxIDw8IDcpCS8qIENvbW1hbmQgcmVzcG9uc2UgdGltZS1vdXQgKi8KKyNkZWZpbmUgT01BUF9NTUNfQ01EX0NSQwkoMSA8PCA4KQkvKiBDb21tYW5kIENSQyBlcnJvciAqLworI2RlZmluZSBPTUFQX01NQ19BX0ZVTEwJCSgxIDw8IDEwKQkvKiBCdWZmZXIgYWxtb3N0IGZ1bGwgKi8KKyNkZWZpbmUgT01BUF9NTUNfQV9FTVBUWQkoMSA8PCAxMSkJLyogQnVmZmVyIGFsbW9zdCBlbXB0eSAqLworI2RlZmluZSBPTUFQX01NQ19PQ1JfQlVTWQkoMSA8PCAxMikJLyogT0NSIGJ1c3kgKi8KKyNkZWZpbmUgT01BUF9NTUNfQ0FSRF9JUlEJKDEgPDwgMTMpCS8qIENhcmQgSVJRIHJlY2VpdmVkICovCisjZGVmaW5lIE9NQVBfTU1DX0NBUkRfRVJSCSgxIDw8IDE0KQkvKiBDYXJkIHN0YXR1cyBlcnJvciBpbiByZXNwb25zZSAqLworCisvKiAyLjkuMiBNUFVJIEludGVyZmFjZSBSZWdpc3RlcnMgRkZGRTpDOTAwICovCisKKyNkZWZpbmUgTVBVSV9DVFJMX1JFRwkJKHZvbGF0aWxlIF9fdTMyICopKDB4ZmZmZWM5MDApCisjZGVmaW5lIE1QVUlfREVCVUdfQUREUgkJKHZvbGF0aWxlIF9fdTMyICopKDB4ZmZmZWM5MDQpCisjZGVmaW5lIE1QVUlfREVCVUdfREFUQQkJKHZvbGF0aWxlIF9fdTMyICopKDB4ZmZmZWM5MDgpCisjZGVmaW5lIE1QVUlfREVCVUdfRkxBRwkJKHZvbGF0aWxlIF9fdTE2ICopKDB4ZmZmZWM5MGMpCisjZGVmaW5lIE1QVUlfU1RBVFVTX1JFRwkJKHZvbGF0aWxlIF9fdTE2ICopKDB4ZmZmZWM5MTApCisjZGVmaW5lIE1QVUlfRFNQX1NUQVRVU19SRUcJKHZvbGF0aWxlIF9fdTE2ICopKDB4ZmZmZWM5MTQpCisjZGVmaW5lIE1QVUlfRFNQX0JPT1RfQ09ORklHCSh2b2xhdGlsZSBfX3UxNiAqKSgweGZmZmVjOTE4KQorI2RlZmluZSBNUFVJX0RTUF9BUElfQ09ORklHCSh2b2xhdGlsZSBfX3UxNiAqKSgweGZmZmVjOTFjKQorCisvKiAyLjkuNiBUcmFmZmljIENvbnRyb2xsZXIgTWVtb3J5IEludGVyZmFjZSBSZWdpc3RlcnM6ICovCisjZGVmaW5lIE9NQVBfSU1JRl9QUklPX1JFRwkJMHhmZmZlY2MwMAorI2RlZmluZSBPTUFQX0VNSUZTX1BSSU9fUkVHCQkweGZmZmVjYzA0CisjZGVmaW5lIE9NQVBfRU1JRkZfUFJJT19SRUcJCTB4ZmZmZWNjMDgKKyNkZWZpbmUgT01BUF9FTUlGU19DT05GSUdfUkVHCQkweGZmZmVjYzBjCisjZGVmaW5lIE9NQVBfRU1JRlNfQ1MwX0NPTkZJRwkJMHhmZmZlY2MxMAorI2RlZmluZSBPTUFQX0VNSUZTX0NTMV9DT05GSUcJCTB4ZmZmZWNjMTQKKyNkZWZpbmUgT01BUF9FTUlGU19DUzJfQ09ORklHCQkweGZmZmVjYzE4CisjZGVmaW5lIE9NQVBfRU1JRlNfQ1MzX0NPTkZJRwkJMHhmZmZlY2MxYworI2RlZmluZSBPTUFQX0VNSUZGX1NEUkFNX0NPTkZJRwkJMHhmZmZlY2MyMAorI2RlZmluZSBPTUFQX0VNSUZGX01SUwkJCTB4ZmZmZWNjMjQKKyNkZWZpbmUgT01BUF9USU1FT1VUMQkJCTB4ZmZmZWNjMjgKKyNkZWZpbmUgT01BUF9USU1FT1VUMgkJCTB4ZmZmZWNjMmMKKyNkZWZpbmUgT01BUF9USU1FT1VUMwkJCTB4ZmZmZWNjMzAKKyNkZWZpbmUgT01BUF9FTkRJQU5JU00JCQkweGZmZmVjYzM0CisKKy8qIDIuOS4xMCBFTUlGIFNsb3cgSW50ZXJmYWNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKEVNSUZTX0NPTkZJR19SRUcpOiAqLworI2RlZmluZSBPTUFQX0VNSUZTX0NPTkZJR19GUgkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUF9FTUlGU19DT05GSUdfUERFCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQX0VNSUZTX0NPTkZJR19QV0RfRU4JKDEgPDwgMikKKyNkZWZpbmUgT01BUF9FTUlGU19DT05GSUdfQk0JCSgxIDw8IDEpCisjZGVmaW5lIE9NQVBfRU1JRlNfQ09ORklHX1dQCQkoMSA8PCAwKQorCisvKgorICogTWVtb3J5IGNodW5rIHNldCBhc2lkZSBmb3IgdGhlIEZyYW1lYnVmZmVyIGluIFNSQU0KKyAqLworI2RlZmluZSBTUkFNX0ZSQU1FQlVGRkVSX01FTU9SWSBPTUFQMTUxMF9TUkFNX0JBU0UKKworCisvKgorICogRE1BCisgKi8KKworI2RlZmluZSBPTUFQMTUxMF9ETUFfQkFTRSAweEZGRkVEODAwCisjZGVmaW5lIE9NQVBfRE1BX0JBU0UJICBPTUFQMTUxMF9ETUFfQkFTRQorCisvKiBHbG9iYWwgUmVnaXN0ZXIgc2VsZWN0aW9uICovCisjZGVmaW5lIE5PX0dMT0JBTF9ETUFfQUNDRVNTIDAKKworLyogQ2hhbm5lbCBzZWxlY3QgZmllbGQKKyAqIE5PVEU6IGFsbCBvdGhlciBjaGFubmVscyBhcmUgbGluZWFyLCBjaGFuMCBpcyAwLCBjaGFuMSBpcyAxLCBldGMuLi4KKyAqLworI2RlZmluZSBMQ0RfQ0hBTk5FTCAweGMKKworLyogUmVnaXN0ZXIgU2VsZWN0IEZpZWxkIChMQ0QpICovCisjZGVmaW5lIERNQV9MQ0RfQ1RSTAkJMAorI2RlZmluZSBETUFfTENEX1RPUF9GMV9MCTEKKyNkZWZpbmUgRE1BX0xDRF9UT1BfRjFfVQkyCisjZGVmaW5lIERNQV9MQ0RfQk9UX0YxX0wJMworI2RlZmluZSBETUFfTENEX0JPVF9GMV9VCTQKKworI2RlZmluZSBMQ0RfRlJBTUVfTU9ERQkJKDE8PDApCisjZGVmaW5lIExDRF9GUkFNRV9JVF9JRQkJKDE8PDEpCisjZGVmaW5lIExDRF9CVVNfRVJST1JfSVRfSUUJKDE8PDIpCisjZGVmaW5lIExDRF9GUkFNRV8xX0lUX0NPTkQJKDE8PDMpCisjZGVmaW5lIExDRF9GUkFNRV8yX0lUX0NPTkQJKDE8PDQpCisjZGVmaW5lIExDRF9CVVNfRVJST1JfSVRfQ09ORAkoMTw8NSkKKyNkZWZpbmUgTENEX1NPVVJDRV9JTUlGCQkoMTw8NikKKworLyoKKyAqIFJlYWwtVGltZSBDbG9jaworICovCisKKyNkZWZpbmUgUlRDX1NFQ09ORFMJCSh2b2xhdGlsZSBfX3U4ICopKE9NQVAxNTEwX1JUQ19CQVNFICsgMHgwMCkKKyNkZWZpbmUgUlRDX01JTlVURVMJCSh2b2xhdGlsZSBfX3U4ICopKE9NQVAxNTEwX1JUQ19CQVNFICsgMHgwNCkKKyNkZWZpbmUgUlRDX0hPVVJTCQkodm9sYXRpbGUgX191OCAqKShPTUFQMTUxMF9SVENfQkFTRSArIDB4MDgpCisjZGVmaW5lIFJUQ19EQVlTCQkodm9sYXRpbGUgX191OCAqKShPTUFQMTUxMF9SVENfQkFTRSArIDB4MEMpCisjZGVmaW5lIFJUQ19NT05USFMJCSh2b2xhdGlsZSBfX3U4ICopKE9NQVAxNTEwX1JUQ19CQVNFICsgMHgxMCkKKyNkZWZpbmUgUlRDX1lFQVJTCQkodm9sYXRpbGUgX191OCAqKShPTUFQMTUxMF9SVENfQkFTRSArIDB4MTQpCisjZGVmaW5lIFJUQ19DVFJMCQkodm9sYXRpbGUgX191OCAqKShPTUFQMTUxMF9SVENfQkFTRSArIDB4NDApCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgT01BUDE1MTAgSW50ZXJydXB0IEhhbmRsZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNkZWZpbmUgT01BUF9JSDFfQkFTRQkJMHhmZmZlY2IwMAorI2RlZmluZSBPTUFQX0lIMl9CQVNFCQkweGZmZmUwMDAwCisjZGVmaW5lIE9NQVAxNTEwX0lUUgkJMHgwCisjZGVmaW5lIE9NQVAxNTEwX01BU0sJCTB4NAorCisjZGVmaW5lIElOVEVSUlVQVF9IQU5ETEVSX0JBU0UJIE9NQVBfSUgxX0JBU0UKKyNkZWZpbmUgSU5URVJSVVBUX0lOUFVUX1JFR0lTVEVSIE9NQVAxNTEwX0lUUgorI2RlZmluZSBJTlRFUlJVUFRfTUFTS19SRUdJU1RFUgkgT01BUDE1MTBfTUFTSworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE9NQVAxNTEwIFRJTUVSUworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNkZWZpbmUgT01BUDE1MTBfMzJrSHpfVElNRVJfQkFTRSAweGZmZmI5MDAwCisKKy8qIDMyayBUaW1lciBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgVElNRVIzMmtfQ1IJMHgwOAorI2RlZmluZSBUSU1FUjMya19UVlIJMHgwMAorI2RlZmluZSBUSU1FUjMya19UQ1IJMHgwNAorCisvKiAzMmsgVGltZXIgQ29udHJvbCBSZWdpc3RlciBkZWZpbml0aW9uICovCisjZGVmaW5lIFRJTUVSMzJrX1RTUwkoMTw8MCkKKyNkZWZpbmUgVElNRVIzMmtfVFJCCSgxPDwxKQorI2RlZmluZSBUSU1FUjMya19JTlQJKDE8PDIpCisjZGVmaW5lIFRJTUVSMzJrX0FSTAkoMTw8MykKKworLyogTVBVIFRpbWVyIGJhc2UgYWRkcmVzc2VzICAqLworI2RlZmluZSBPTUFQMTUxMF9NUFVUSU1FUl9CQVNFCTB4ZmZmZWM1MDAKKyNkZWZpbmUgT01BUDE1MTBfTVBVVElNRVJfT0ZGCTB4MDAwMDAxMDAKKworI2RlZmluZSBPTUFQMTUxMF9USU1FUjFfQkFTRQkweGZmZmVjNTAwCisjZGVmaW5lIE9NQVAxNTEwX1RJTUVSMl9CQVNFCTB4ZmZmZWM2MDAKKyNkZWZpbmUgT01BUDE1MTBfVElNRVIzX0JBU0UJMHhmZmZlYzcwMAorCisvKiBNUFUgVGltZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIENOVExfVElNRVIJMAorI2RlZmluZSBMT0FEX1RJTQk0CisjZGVmaW5lIFJFQURfVElNCTgKKworLyogIENOVExfVElNRVIgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBNUFVUSU1fRlJFRQkJKDE8PDYpCisjZGVmaW5lIE1QVVRJTV9DTE9DS19FTkFCTEUJKDE8PDUpCisjZGVmaW5lIE1QVVRJTV9QVFZfTUFTSwkJKDB4Nzw8UFRWX0JJVCkKKyNkZWZpbmUgTVBVVElNX1BUVl9CSVQJCTIKKyNkZWZpbmUgTVBVVElNX0FSCQkoMTw8MSkKKyNkZWZpbmUgTVBVVElNX1NUCQkoMTw8MCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgT01BUDE1MTAgR1BJTyAoU0hBUkVEKQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjZGVmaW5lIEdQSU9fREFUQV9JTlBVVF9SRUcJKE9NQVAxNTEwX0dQSU9fQkFTRSArIDB4MCkKKyNkZWZpbmUgR1BJT19EQVRBX09VVFBVVF9SRUcJKE9NQVAxNTEwX0dQSU9fQkFTRSArIDB4NCkKKyNkZWZpbmUgR1BJT19ESVJfQ09OVFJPTF9SRUcJKE9NQVAxNTEwX0dQSU9fQkFTRSArIDB4OCkKKyNkZWZpbmUgR1BJT19JTlRfQ09OVFJPTF9SRUcJKE9NQVAxNTEwX0dQSU9fQkFTRSArIDB4YykKKyNkZWZpbmUgR1BJT19JTlRfTUFTS19SRUcJKE9NQVAxNTEwX0dQSU9fQkFTRSArIDB4MTApCisjZGVmaW5lIEdQSU9fSU5UX1NUQVRVU19SRUcJKE9NQVAxNTEwX0dQSU9fQkFTRSArIDB4MTQpCisjZGVmaW5lIEdQSU9fUElOX0NPTlRST0xfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweDE4KQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogT01BUDE1MTAgTVBVSU8gKEFSTSBvbmx5KQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgT01BUDE1MTBfTVBVSU9fQkFTRQkweEZGRkI1MDAwCisjZGVmaW5lIE1QVUlPX0RBVEFfSU5QVVRfUkVHCShPTUFQMTUxMF9NUFVJT19CQVNFICsgMHgwKQorI2RlZmluZSBNUFVJT19EQVRBX09VVFBVVF9SRUcJKE9NQVAxNTEwX01QVUlPX0JBU0UgKyAweDQpCisjZGVmaW5lIE1QVUlPX0RJUl9DT05UUk9MX1JFRwkoT01BUDE1MTBfTVBVSU9fQkFTRSArIDB4OCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgT01BUDE1MTAgVElQQiAob25seSkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2RlZmluZSBUSVBCX1BVQkxJQ19DTlRMX0JBU0UJCTB4ZmZmZWQzMDAKKyNkZWZpbmUgTVBVX1BVQkxJQ19USVBCX0NOVExfUkVHCShUSVBCX1BVQkxJQ19DTlRMX0JBU0UgKyAweDgpCisjZGVmaW5lIFRJUEJfUFJJVkFURV9DTlRMX0JBU0UJCTB4ZmZmZWNhMDAKKyNkZWZpbmUgTVBVX1BSSVZBVEVfVElQQl9DTlRMX1JFRwkoVElQQl9QUklWQVRFX0NOVExfQkFTRSArIDB4OCkKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE9NQVAxNTEwIENhbWVyYSBJbnRlcmZhY2UKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIENBTUVSQV9CQVNFCQkoSU9fQkFTRSArIDB4NjgwMCkKKyNkZWZpbmUgQ0FNX0NUUkxDTE9DS19SRUcJKENBTUVSQV9CQVNFICsgMHgwMCkKKyNkZWZpbmUgQ0FNX0lUX1NUQVRVU19SRUcJKENBTUVSQV9CQVNFICsgMHgwNCkKKyNkZWZpbmUgQ0FNX01PREVfUkVHCQkoQ0FNRVJBX0JBU0UgKyAweDA4KQorI2RlZmluZSBDQU1fU1RBVFVTX1JFRwkJKENBTUVSQV9CQVNFICsgMHgwQykKKyNkZWZpbmUgQ0FNX0NBTURBVEFfUkVHCQkoQ0FNRVJBX0JBU0UgKyAweDEwKQorI2RlZmluZSBDQU1fR1BJT19SRUcJCShDQU1FUkFfQkFTRSArIDB4MTQpCisjZGVmaW5lIENBTV9QRUFLX0NUUl9SRUcJKENBTUVSQV9CQVNFICsgMHgxOCkKKworI2lmIDAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCit0eXBlZGVmIHN0cnVjdCB7CisJX191MzIgY3RybGNsb2NrOworCV9fdTMyIGl0X3N0YXR1czsKKwlfX3UzMiBtb2RlOworCV9fdTMyIHN0YXR1czsKKwlfX3UzMiBjYW1kYXRhOworCV9fdTMyIGdwaW87CisJX191MzIgcGVha19jb3VudGVyOworfSBjYW1lcmFfcmVnc190OworI2VuZGlmCisjZW5kaWYKKworLyogQ1RSTENMT0NLIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgRk9TQ01PRF9CSVQJMAorI2RlZmluZSBGT1NDTU9EX01BU0sJKDB4NyA8PCBGT1NDTU9EX0JJVCkKKyNkZWZpbmUJIEZPU0NNT0RfMTJNSHoJMHgwCisjZGVmaW5lCSBGT1NDTU9EXzZNSHoJMHgyCisjZGVmaW5lCSBGT1NDTU9EXzlfNk1IeiAweDQKKyNkZWZpbmUJIEZPU0NNT0RfMjRNSHoJMHg1CisjZGVmaW5lCSBGT1NDTU9EXzhNSHoJMHg2CisjZGVmaW5lIFBPTENMSwkJKDE8PDMpCisjZGVmaW5lIENBTUVYQ0xLX0VOCSgxPDw0KQorI2RlZmluZSBNQ0xLX0VOCQkoMTw8NSkKKyNkZWZpbmUgRFBMTF9FTgkJKDE8PDYpCisjZGVmaW5lIExDTEtfRU4JCSgxPDw3KQorCisvKiBJVF9TVEFUVVMgYml0IHNoaWZ0cyAqLworI2RlZmluZSBWX1VQCQkoMTw8MCkKKyNkZWZpbmUgVl9ET1dOCQkoMTw8MSkKKyNkZWZpbmUgSF9VUAkJKDE8PDIpCisjZGVmaW5lIEhfRE9XTgkJKDE8PDMpCisjZGVmaW5lIEZJRk9fRlVMTAkoMTw8NCkKKyNkZWZpbmUgREFUQV9YRkVSCSgxPDw1KQorCisvKiBNT0RFIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgQ0FNT1NDCQkoMTw8MCkKKyNkZWZpbmUgSU1HU0laRV9CSVQJMQorI2RlZmluZSBJTUdTSVpFX01BU0sJKDB4MyA8PCBJTUdTSVpFX0JJVCkKKyNkZWZpbmUJIElNR1NJWkVfQ0lGCSgweDAgPDwgSU1HU0laRV9CSVQpCS8qIDM1MngyODggKi8KKyNkZWZpbmUJIElNR1NJWkVfUUNJRgkoMHgxIDw8IElNR1NJWkVfQklUKQkvKiAxNzZ4MTQ0ICovCisjZGVmaW5lCSBJTUdTSVpFX1ZHQQkoMHgyIDw8IElNR1NJWkVfQklUKQkvKiA2NDB4NDgwICovCisjZGVmaW5lCSBJTUdTSVpFX1FWR0EJKDB4MyA8PCBJTUdTSVpFX0JJVCkJLyogMzIweDI0MCAqLworI2RlZmluZSBPUkRFUkNBTUQJKDE8PDMpCisjZGVmaW5lIEVOX1ZfVVAJCSgxPDw0KQorI2RlZmluZSBFTl9WX0RPV04JKDE8PDUpCisjZGVmaW5lIEVOX0hfVVAJCSgxPDw2KQorI2RlZmluZSBFTl9IX0RPV04JKDE8PDcpCisjZGVmaW5lIEVOX0RNQQkJKDE8PDgpCisjZGVmaW5lIFRIUkVTSE9MRAkoMTw8OSkKKyNkZWZpbmUgVEhSRVNIT0xEX0JJVAk5CisjZGVmaW5lIFRIUkVTSE9MRF9NQVNLCSgweDdmPDw5KQorI2RlZmluZSBFTl9OSVJRCQkoMTw8MTYpCisjZGVmaW5lIEVOX0ZJRk9fRlVMTAkoMTw8MTcpCisjZGVmaW5lIFJBWl9GSUZPCSgxPDwxOCkKKworLyogU1RBVFVTIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgVlNUQVRVUwkJKDE8PDApCisjZGVmaW5lIEhTVEFUVVMJCSgxPDwxKQorCisvKiBHUElPIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgQ0FNX1JTVAkJKDE8PDApCisKKworLyoqKioqKioqKioqKioqKioqKioqKgorICogV2F0Y2hkb2cgdGltZXIuCisgKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBXRFRJTV9CQVNFCTB4ZmZmZWM4MDAKKyNkZWZpbmUgV0RUSU1fQ09OVFJPTAkoV0RUSU1fQkFTRSsweDAwKQorI2RlZmluZSBXRFRJTV9MT0FECShXRFRJTV9CQVNFKzB4MDQpCisjZGVmaW5lIFdEVElNX1JFQUQJKFdEVElNX0JBU0UrMHgwNCkKKyNkZWZpbmUgV0RUSU1fTU9ERQkoV0RUSU1fQkFTRSsweDA4KQorCisvKiBWYWx1ZXMgdG8gd3JpdGUgdG8gbW9kZSByZWdpc3RlciB0byBkaXNhYmxlIHRoZSB3YXRjaGRvZyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgRElTQUJMRV9TRVExCTB4RjUKKyNkZWZpbmUgRElTQUJMRV9TRVEyCTB4QTAKKworLyogV0RUSU1fQ09OVFJPTCBiaXQgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIFdEVElNX0NPTlRST0xfU1QJQklUNworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIERpZmZlcmVudGlhdGluZyBwcm9jZXNzb3IgdmVyc2lvbnMgZm9yIHRob3NlIHdobyBjYXJlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjZGVmaW5lIE9NQVAxNTA5IDAKKyNkZWZpbmUgT01BUDE1MTAgMQorCisjZGVmaW5lIE9NQVAxNTEwX0lEX0NPREVfUkVHIDB4ZmZmZWQ0MDQKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK2ludCBjcHVfdHlwZSh2b2lkKTsKKyNlbmRpZgorCisvKgorICogRVZNIEltcGxlbWVudGF0aW9uIFNwZWNpZmljcy4KKyAqCisgKiAqKiogTk9URSAqKioKKyAqIEFueSBkZWZpbml0aW9ucyBpbiB0aGVzZSBmaWxlcyBzaG91bGQgYmUgcHJlZml4ZWQgYnkgYW4gaWRlbnRpZmllciAtCisgKiBlZy4gT01BUDE1MTBQMV9GTEFTSDBfQkFTRSAuCisgKgorICovCisjaWZkZWYgQ09ORklHX09NQVBfSU5OT1ZBVE9SCisjaW5jbHVkZSAiaW5ub3ZhdG9yLmgiCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19PTUFQXzE1MTBQMQorI2luY2x1ZGUgIm9tYXAxNTEwcDEuaCIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ0xLR0VOX1JFU0VUX0JBU0UgKDB4ZmZmZWNlMDApCisjZGVmaW5lIEFSTV9DS0NUTAkodm9sYXRpbGUgX191MTYgKikoQ0xLR0VOX1JFU0VUX0JBU0UgKyAweDApCisjZGVmaW5lIEFSTV9JRExFQ1QxCSh2b2xhdGlsZSBfX3UxNiAqKShDTEtHRU5fUkVTRVRfQkFTRSArIDB4NCkKKyNkZWZpbmUgQVJNX0lETEVDVDIJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHg4KQorI2RlZmluZSBBUk1fRVdVUENUCSh2b2xhdGlsZSBfX3UxNiAqKShDTEtHRU5fUkVTRVRfQkFTRSArIDB4QykKKyNkZWZpbmUgQVJNX1JTVENUMQkodm9sYXRpbGUgX191MTYgKikoQ0xLR0VOX1JFU0VUX0JBU0UgKyAweDEwKQorI2RlZmluZSBBUk1fUlNUQ1QyCSh2b2xhdGlsZSBfX3UxNiAqKShDTEtHRU5fUkVTRVRfQkFTRSArIDB4MTQpCisjZGVmaW5lIEFSTV9TWVNTVAkodm9sYXRpbGUgX191MTYgKikoQ0xLR0VOX1JFU0VUX0JBU0UgKyAweDE4KQorCisKKyNkZWZpbmUgQ0tfQ0xLSU4JMTIgLyogTUh6ICovCisjZGVmaW5lIENLX1JBVEVGCTEKKyNkZWZpbmUgQ0tfSURMRUYJMgorI2RlZmluZSBDS19FTkFCTEVGCTQKKyNkZWZpbmUgQ0tfU0VMRUNURgk4CisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKyNkZWZpbmUgQ0tfRFBMTDEJKCh2b2xhdGlsZSBfX3UxNiAqKTB4ZmZmZWNmMDApCisjZWxzZQorI2RlZmluZSBDS19EUExMMSAoMHhmZmZlY2YwMCkKKyNlbmRpZgorI2RlZmluZSBTRVRBUk1fSURMRV9TSElGVAorCisvKiBBUk1fQ0tDVEwgYml0IHNoaWZ0cyAqLworI2RlZmluZSBQRVJESVYJCTAKKyNkZWZpbmUgTENERElWCQkyCisjZGVmaW5lIEFSTURJVgkJNAorI2RlZmluZSBEU1BESVYJCTYKKyNkZWZpbmUgVENESVYJCTgKKyNkZWZpbmUgRFNQTU1VRElWCTEwCisjZGVmaW5lIEFSTV9USU1YTwkxMgorI2RlZmluZSBFTl9EU1BDSwkxMworI2RlZmluZSBBUk1fSU5USENLX1NFTAkxNCAvKiBSRVZJU0lUIC0tIHdoZXJlIGlzIHRoaXMgdXNlZD8gKi8KKworI2RlZmluZSBBUk1fQ0tDVExfUlNSVkRfQklUMTUJCSgxIDw8IDE1KQorI2RlZmluZSBBUk1fQ0tDVExfQVJNX0lOVEhDS19TRUwJKDEgPDwgMTQpCisjZGVmaW5lIEFSTV9DS0NUTF9FTl9EU1BDSwkJKDEgPDwgMTMpCisjZGVmaW5lIEFSTV9DS0NUTF9BUk1fVElNWE8JCSgxIDw8IDEyKQorI2RlZmluZSBBUk1fQ0tDVExfRFNQTU1VX0RJVjEJCSgxIDw8IDExKQorI2RlZmluZSBBUk1fQ0tDVExfRFNQTU1VX0RJVjIJCSgxIDw8IDEwKQorI2RlZmluZSBBUk1fQ0tDVExfVENESVYxCQkoMSA8PCA5KQorI2RlZmluZSBBUk1fQ0tDVExfVENESVYyCQkoMSA8PCA4KQorI2RlZmluZSBBUk1fQ0tDVExfRFNQRElWMQkJKDEgPDwgNykKKyNkZWZpbmUgQVJNX0NLQ1RMX0RTUERJVjAJCSgxIDw8IDYpCisjZGVmaW5lIEFSTV9DS0NUTF9BUk1ESVYxCQkoMSA8PCA1KQorI2RlZmluZSBBUk1fQ0tDVExfQVJNRElWMAkJKDEgPDwgNCkKKyNkZWZpbmUgQVJNX0NLQ1RMX0xDRERJVjEJCSgxIDw8IDMpCisjZGVmaW5lIEFSTV9DS0NUTF9MQ0RESVYwCQkoMSA8PCAyKQorI2RlZmluZSBBUk1fQ0tDVExfUEVSRElWMQkJKDEgPDwgMSkKKyNkZWZpbmUgQVJNX0NLQ1RMX1BFUkRJVjAJCSgxIDw8IDApCisKKy8qIEFSTV9JRExFQ1QxIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgSURMV0RUX0FSTQkwCisjZGVmaW5lIElETFhPUlBfQVJNCTEKKyNkZWZpbmUgSURMUEVSX0FSTQkyCisjZGVmaW5lIElETExDRF9BUk0JMworI2RlZmluZSBJRExMQl9BUk0JNAorI2RlZmluZSBJRExIU0FCX0FSTQk1CisjZGVmaW5lIElETElGX0FSTQk2CisjZGVmaW5lIElETERQTExfQVJNCTcKKyNkZWZpbmUgSURMQVBJX0FSTQk4CisjZGVmaW5lIElETFRJTV9BUk0JOQorI2RlZmluZSBTRVRBUk1fSURMRQkxMQorCisvKiBBUk1fSURMRUNUMiBiaXQgc2hpZnRzICovCisjZGVmaW5lIEVOX1dEVENLCTAKKyNkZWZpbmUgRU5fWE9SUENLCTEKKyNkZWZpbmUgRU5fUEVSQ0sJMgorI2RlZmluZSBFTl9MQ0RDSwkzCisjZGVmaW5lIEVOX0xCQ0sJCTQKKyNkZWZpbmUgRU5fSFNBQkNLCTUKKyNkZWZpbmUgRU5fQVBJQ0sJNgorI2RlZmluZSBFTl9USU1DSwk3CisjZGVmaW5lIERNQUNLX1JFUQk4CisjZGVmaW5lIEVOX0dQSU9DSwk5CisjZGVmaW5lIEVOX0xCRlJFRUNLCTEwCisKKyNkZWZpbmUgQVJNX1JTVENUMV9TV19SU1QJKDEgPDwgMykKKyNkZWZpbmUgQVJNX1JTVENUMV9EU1BfUlNUCSgxIDw8IDIpCisjZGVmaW5lIEFSTV9SU1RDVDFfRFNQX0VOCSgxIDw8IDEpCisjZGVmaW5lIEFSTV9SU1RDVDFfQVJNX1JTVAkoMSA8PCAwKQorCisvKiBBUk1fUlNUQ1QyIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgRU5fUEVSCQkwCisKKyNkZWZpbmUgQVJNX1NZU1NUX1JTUlZEX0JJVDE1CSgxIDw8IDE1KQorI2RlZmluZSBBUk1fU1lTU1RfUlNSVkRfQklUMTQJKDEgPDwgMTQpCisjZGVmaW5lIEFSTV9TWVNTVF9DTE9DS19TRUxFQ1QyICgxIDw8IDEzKQorI2RlZmluZSBBUk1fU1lTU1RfQ0xPQ0tfU0VMRUNUMSAoMSA8PCAxMikKKyNkZWZpbmUgQVJNX1NZU1NUX0NMT0NLX1NFTEVDVDAgKDEgPDwgMTEpCisjZGVmaW5lIEFSTV9TWVNTVF9SU1JWRF9CSVQxMAkoMSA8PCAxMCkKKyNkZWZpbmUgQVJNX1NZU1NUX1JTUlZEX0JJVDkJKDEgPDwgOSkKKyNkZWZpbmUgQVJNX1NZU1NUX1JTUlZEX0JJVDgJKDEgPDwgOCkKKyNkZWZpbmUgQVJNX1NZU1NUX1JTUlZEX0JJVDcJKDEgPDwgNykKKyNkZWZpbmUgQVJNX1NZU1NUX0lETEVfRFNQCSgxIDw8IDYpCisjZGVmaW5lIEFSTV9TWVNTVF9QT1IJCSgxIDw8IDUpCisjZGVmaW5lIEFSTV9TWVNTVF9FWFRfUlNUCSgxIDw8IDQpCisjZGVmaW5lIEFSTV9TWVNTVF9BUk1fTUNSU1QJKDEgPDwgMykKKyNkZWZpbmUgQVJNX1NZU1NUX0FSTV9XRFJTVAkoMSA8PCAyKQorI2RlZmluZSBBUk1fU1lTU1RfR0xPQl9TV1JTVAkoMSA8PCAxKQorI2RlZmluZSBBUk1fU1lTU1RfRFNQX1dEUlNUCSgxIDw8IDApCisKKy8qIFRhYmxlIDE1LTIzLiBEUExMIENvbnRyb2wgUmVnaXN0ZXJzOiAqLworI2RlZmluZSBEUExMX0NUTF9SRUcJCSh2b2xhdGlsZSBfX3UxNiAqKSgweGZmZmVjZjAwKQorCisvKiBUYWJsZSAxNS0yNC4gQ29udHJvbCBSZWdpc3RlciAoQ1RMX1JFRyk6ICovCisKKyNkZWZpbmUgRFBMTF9DVExfUkVHX0lPQgkJKDEgPDwgMTMpCisjZGVmaW5lIERQTExfQ1RMX1JFR19QTExfTVVMVAkJRmxkKDUsMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBPTUFQIElOVEVSUlVQVCBSRUdJU1RFUlMgKi8KKyNkZWZpbmUgSVJRX0lUUgkJCTB4MDAKKyNkZWZpbmUgSVJRX01JUgkJCTB4MDQKKyNkZWZpbmUgSVJRX1NJUl9JUlEJCTB4MTAKKyNkZWZpbmUgSVJRX1NJUl9GSVEJCTB4MTQKKyNkZWZpbmUgSVJRX0NPTlRST0xfUkVHCQkweDE4CisjZGVmaW5lIElSUV9JU1IJCQkweDljCisjZGVmaW5lIElSUV9JTFIwCQkweDFjCisKKyNkZWZpbmUgUkVHX0lITDFfTUlSICAoT01BUF9JSDFfQkFTRStJUlFfTUlSKQorI2RlZmluZSBSRUdfSUhMMl9NSVIgIChPTUFQX0lIMl9CQVNFK0lSUV9NSVIpCisKKy8qIElOVEVSUlVQVCBMRVZFTCBSRUdJU1RFUiBCSVRTICovCisjZGVmaW5lIElMUl9QUklPUklUWV9NQVNLCSgweDNjKQorI2RlZmluZSBJTFJfUFJJT1JJVFlfU0hJRlQJKDIpCisjZGVmaW5lIElMUl9MRVZFTF9UUklHR0VSCSgxPDwxKQorI2RlZmluZSBJTFJfRklRCQkJKDE8PDApCisKKyNkZWZpbmUgSVJRX0xFVkVMX0lOVAkJMQorI2RlZmluZSBJUlFfRURHRV9JTlQJCTAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMTcxMGgzLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE3MTBoMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhODgxYmQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE3MTBoMy5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cy4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+LCBLc2hpdGlqIEd1cHRhIDxrc2hpdGlqQHRpLmNvbT4KKyAqIFgtTG9hZGVyIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIFRJIE9NQVAgSDMgYm9hcmQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogZXhhY3RseSB1bmNvbW1lbnQgb25lICovCisjZGVmaW5lIENGR19CT09UX0NTMAkgIC8qIFJPTSBjb2RlIC0+IHNpZ25lZCBYLUxvYWRlciBpbiBOTkFEICovCisvLyNkZWZpbmUgQ0ZHX0JPT1RfQ1MzCSAgLyogdW5zaWduZWQgWC1sb2FkZXIgaW4gTk9SIGZvciBkZXZlbG9wbWVudCAqLworCisvKiBzZXJpYWwgcHJpbnRmIGZhY2lsaXR5IHRha2VzIGFib3V0IDMuNUsgKi8KKyNkZWZpbmUgQ0ZHX1BSSU5URiAKKy8vI3VuZGVmIENGR19QUklOVEYgCisKKy8qIHVuY29tbWVudCBpdCBpZiB5b3UgbmVlZCB0aW1lciBiYXNlZCB1ZGVsYXkoKS4gaXQgdGFrZXMgYWJvdXQgMjUwIGJ5dGVzICovCisvLyNkZWZpbmUgQ0ZHX1VERUxBWQorIAorLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKyNkZWZpbmUgQ09ORklHX0FSTTkyNkVKUwkxCS8qIFRoaXMgaXMgYW4gYXJtOTI2ZWpzIENQVSBjb3JlICAqLworI2RlZmluZSBDT05GSUdfT01BUAkxCQkJLyogaW4gYSBUSSBPTUFQIGNvcmUgICAgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAxNzEwCTEJCS8qIHdoaWNoIGlzIGluIGEgMTcxMCAgKi8KKyNkZWZpbmUgQ09ORklHX0gzX09NQVAxNzEwCTEJLyogIGEgSDMgQm9hcmQgICovCisKKy8qIGlucHV0IGNsb2NrIG9mIFBMTCAqLworLyogdGhlIE9NQVAxNzEwIEgzIGhhcyAxMk1IeiBpbnB1dCBjbG9jayAqLworI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRCTEyMDAwMDAwCisKKworI2lmZGVmIENGR19QUklOVEYKKworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUJKC00KQorI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCSg0ODAwMDAwMCkJLyogY2FuIGJlIDEyTS8zMktoeiBvciA0OE1oeiAqLworI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xCTB4ZmZmYjAwMDAJLyogdWFydDEsIGJsdWV0b290aCB1YXJ0IG9uIGhlbGVuICovCisKKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJMQorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJMTE1MjAwCisKKyNlbmRpZiAvKiBDRkdfUFJJTlRGICovCisKKyNpbmNsdWRlIDxjb25maWdzL29tYXAxNTEwLmg+CisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX1BCU0laRQkyNTYKKyNkZWZpbmUgQ0ZHX0xPQURBRERSIAkweDExMDAwMDAwCisgIAorI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisgCisvKiBUaGUgMTcxMCBoYXMgNiB0aW1lcnMsIHRoZXkgY2FuIGJlIGRyaXZlbiBieSB0aGUgUmVmQ2xrICgxMk1oeikgb3IgYnkKKyAqIERQTEwxLiBUaGlzIHRpbWUgaXMgZnVydGhlciBzdWJkaXZpZGVkIGJ5IGEgbG9jYWwgZGl2aXNvci4KKyAqLworI2RlZmluZSBDRkdfVElNRVJCQVNFCTB4RkZGRUM1MDAJLyogdXNlIHRpbWVyIDEgKi8KKyNkZWZpbmUgQ0ZHX1BWVAk3CS8qIDJeKHB2dCsxKSwgZGl2aWRlIGJ5IDI1NiAqLworI2RlZmluZSBDRkdfSFoJKChDT05GSUdfU1lTX0NMS19GUkVRKS8oMiA8PCBDRkdfUFZUKSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhY2sgc2l6ZXMKKyAqCisgKiBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDEyOCoxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIE5BTkQgSW5mby4KKyAqLworI2RlZmluZSBDRkdfTkFORF9LOUY1NjE2ICAgIC8qIFNhbXN1bmcgMTYtYml0IDMyTUIgY2hpcCAqLworCisjaWZkZWYgQ0ZHX0JPT1RfQ1MwCisjZGVmaW5lIE5BTkRfQUREUiAweDBjMDAwMDAwICAvKiBwaHlzaWNhbCBhZGRyZXNzIHRvIGFjY2VzcyBuYW5kIGF0IENTMyovCisjZWxzZQorI2RlZmluZSBOQU5EX0FERFIgMHgwYTAwMDAwMCAgLyogcGh5c2ljYWwgYWRkcmVzcyB0byBhY2Nlc3MgbmFuZCBhdCBDUzJCKi8KKyNlbmRpZgorCisvKiBIMyBOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogMHgwMDAwMDAwIC0gMHgwMDEwMDAwIAlCb290aW5nIEltYWdlCisgKiAweDAwMTAwMDAgLSAweDAwNTAwMDAgCVUtQm9vdCBJbWFnZQorICogMHgwMDUwMDAwIC0gMHgwMDgwMDAwIAlVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqIDB4MDA4MDAwMCAtIDB4MjAwMDAwMCAJZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisjZGVmaW5lIE5BTkRfVUJPT1RfU1RBUlQJMHgwMDEwMDAwCisjZGVmaW5lIE5BTkRfVUJPT1RfRU5ECQkweDAwNTAwMDAKKyNkZWZpbmUgTkFORF9CTE9DS19TSVpFCQkweDQwMDAKKyAgCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIGRveyAqKHZvbGF0aWxlIF9fdTggKikoKHVuc2lnbmVkIGxvbmcpYWRyICsgMikgPSAoX191OCkoZCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgZG97ICoodm9sYXRpbGUgX191OCAqKSgodW5zaWduZWQgbG9uZylhZHIgKyA0KSA9IChfX3U4KShkKTsgfSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgZG97ICoodm9sYXRpbGUgX191MTYgKikoKHVuc2lnbmVkIGxvbmcpYWRyKSA9IChfX3UxNikoZCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgKCh2b2xhdGlsZSBfX3UxNikoKih2b2xhdGlsZSBfX3UxNiAqKSh1bnNpZ25lZCBsb25nKWFkcikpCisKKyNkZWZpbmUgR1BJTzFfREFUQUlOCQkweGZmZmJlNDJjCisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpICAJd2hpbGUoISgoKih2b2xhdGlsZSBfX3UxNiAqKShHUElPMV9EQVRBSU4pICYgMHgwNDAwKSA9PSAweDA0MDApKTsKKyAKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikgICAgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpICAgIAorI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUoYWRyKSAgICAgICAgIAorI2RlZmluZSBOQU5EX0NUTF9TRVRDTEUoYWRyKSAgICAgICAgIAorI2RlZmluZSBOQU5EX0RJU0FCTEVfQ0UoKSAgICAgCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkgICAgICAgCisKKworI2VuZGlmCQkJCQkJCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MjBoNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OTVkN2YKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MjBoNC5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNSBUZXhhcyBJbnN0cnVtZW50cy4KKyAqIAorICogWC1Mb2FkZXIgQ29uZmlndWF0aW9uIHNldHRpbmdzIGZvciB0aGUgVEkgT01BUCBINCBib2FyZC4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKiBzZXJpYWwgcHJpbnRmIGZhY2lsaXR5IHRha2VzIGFib3V0IDMuNUsgKi8KKyNkZWZpbmUgQ0ZHX1BSSU5URiAKKy8vI3VuZGVmIENGR19QUklOVEYgCisKKy8qIHVuY29tbWVudCBpdCBpZiB5b3UgbmVlZCB0aW1lciBiYXNlZCB1ZGVsYXkoKS4gaXQgdGFrZXMgYWJvdXQgMjUwIGJ5dGVzICovCisvLyNkZWZpbmUgQ0ZHX1VERUxBWQorIAorLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0FSTTExMzYgICAgICAgICAgIDEgICAgLyogVGhpcyBpcyBhbiBhcm0xMTM2IENQVSBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQICAgICAgICAgICAgICAxICAgIC8qIGluIGEgVEkgT01BUCBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQMjQyMAkgICAgICAgICAxICAgIC8qIHdoaWNoIGlzIGluIGEgMjQyMCAqLworI2RlZmluZSBDT05GSUdfT01BUDI0MjBINCAgICAgICAgMSAgICAvKiBhbmQgb24gYSBINCBib2FyZCAqLworCisjZGVmaW5lIENPTkZJR19PTUFQMjQyWAorCisjZGVmaW5lIFBSQ01fQ09ORklHX0lJICAgICAgICAgICAxICAgIAorLy8jZGVmaW5lIFBSQ01fQ09ORklHX0lJSSAgICAgICAgICAgMSAgICAKKyNkZWZpbmUgQ09ORklHX1BBUlRJQUxfU1JBTSAgICAgIDEKKworLy8jZGVmaW5lIENGR19TRFJBTV9ERFIJCQkxCisjZGVmaW5lIENGR19TRFJBTV9DT01CTwkJMgorLy8jZGVmaW5lIENGR19TRFJBTV9TRFIJCQkzCisvLyNkZWZpbmUgQ0ZHX1NEUkFNX1NUQUNLRUQJCTQKKwkgCisvKiBDaGlwc2VsZWN0IGFuZCBOQU5EIGluZm9ybWF0aW9uIDoKKyAgIFNpbmNlIHdlIHNoYXJlIHRoZSBtZW0uaCBmcm9tIHUtYm9vdCwgd2UgZGVmaW5lIGZldyBtYWNyb3MgaGVyZQorICAgc28gYXMgdG8gcGljayB0aGUgcmlnaHQgZ3BtYyB2YWx1ZXMgZnJvbSB0aGVyZSBmb3IgdGhlIG1hY3JvcyBpbiBtZW0uaAorKi8KKy8qIE5BTkQgZml4ZWQgYXQgQ1M1ICovCisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwIFNNTkFORAorI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV82NE0KKyNkZWZpbmUgT01BUDI0WFhfR1BNQ19DUzBfTUFQIENGR19GTEFTSF9CQVNFCisjZGVmaW5lIENGR19OQU5EX0JPT1QKKyNkZWZpbmUgTkFORF9MRUdBQ1kKKworI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAyNDIwLmg+ICAgICAgICAvKiBnZXQgY2hpcCBhbmQgYm9hcmQgZGVmcyAqLworCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICAxMjAwMDAwMAorLyogaW5wdXQgY2xvY2sgb2YgUExMICovCisvKiB0aGUgT01BUDI0MjAgSDQgaGFzIDEyTUh6LCAxM01Ieiwgb3IgMTkuMk1oeiBjcnlzdGFsIGlucHV0ICovCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgICAgICBWX1NDTEsKKworI2lmZGVmIENGR19QUklOVEYKKworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUJKC00KQorI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCSg0ODAwMDAwMCkJLyogY2FuIGJlIDEyTS8zMktoeiBvciA0OE1oeiAqLworI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xICAgICAgICAgT01BUDI0MjBfVUFSVDEKKyAKKy8qCisgKiBzZWxlY3Qgc2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TRVJJQUwxICAgICAgICAgICAxICAgIC8qIFVBUlQxIG9uIEg0ICovCisKKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgICAgIDEKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgIDExNTIwMAorI2RlZmluZSBDRkdfUEJTSVpFCTI1NgorCisjZW5kaWYgLyogQ0ZHX1BSSU5URiAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT0FEQUREUiAJMHg4MDAwMDAwMAorICAKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhY2sgc2l6ZXMKKyAqCisgKiBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDEyOCoxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIE5BTkQgSW5mby4KKyAqLworI2RlZmluZSBDRkdfTkFORF9LOUsxMjE2ICAgIC8qIFNhbXN1bmcgMTYtYml0IDY0TUIgY2hpcCAqLworCisjZGVmaW5lIE5BTkRfQUREUiAweDA0MDAwMDAwICAvKiBwaHlzaWNhbCBhZGRyZXNzIHRvIGFjY2VzcyBuYW5kIGF0IENTMCovCisgCisvKiBINCBOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogMHgwMDAwMDAwIC0gMHgwMDEwMDAwIAlCb290aW5nIEltYWdlCisgKiAweDAwMTAwMDAgLSAweDAwNTAwMDAgCVUtQm9vdCBJbWFnZQorICogMHgwMDUwMDAwIC0gMHgwMDgwMDAwIAlVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqIDB4MDA4MDAwMCAtIDB4NDAwMDAwMCAJZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisjZGVmaW5lIE5BTkRfVUJPT1RfU1RBUlQJMHgwMDQwMDAwCisjZGVmaW5lIE5BTkRfVUJPT1RfRU5ECQkweDAwODAwMDAKKyNkZWZpbmUgTkFORF9CTE9DS19TSVpFCQkweDQwMDAKKyAgCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIGRvIHsqKHZvbGF0aWxlIHUxNiAqKTB4NjgwMEEwN0MgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgZG8geyoodm9sYXRpbGUgdTE2ICopMHg2ODAwQTA4MCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgZG8geyoodm9sYXRpbGUgdTE2ICopMHg2ODAwQTA4NCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSAoKih2b2xhdGlsZSB1MTYgKikweDY4MDBBMDg0KQorCisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisgIAorI2RlZmluZSBOQU5EX1dQX09GRigpICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoMHg2ODAwQTA1MCkgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgZG8geyoodm9sYXRpbGUgdTMyICopKDB4NjgwMEEwNTApICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKyAgCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpICAgIAorI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUoYWRyKSAgICAKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikgICAgICAgICAKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikgICAgICAgICAKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkgICAgIAorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpICAgICAgIAorCisKKyNlbmRpZgkJCQkJCQkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MzBzZHAuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMjQzMHNkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGE2MWYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MzBzZHAuaApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0cnVtZW50cy4KKyAqIAorICogWC1Mb2FkZXIgQ29uZmlndWF0aW9uIHNldHRpbmdzIGZvciB0aGUgVEkgT01BUCBINCBib2FyZC4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKiBzZXJpYWwgcHJpbnRmIGZhY2lsaXR5IHRha2VzIGFib3V0IDMuNUsgKi8KKyNkZWZpbmUgQ0ZHX1BSSU5URiAKKy8vI3VuZGVmIENGR19QUklOVEYgCisKKy8qIHVuY29tbWVudCBpdCBpZiB5b3UgbmVlZCB0aW1lciBiYXNlZCB1ZGVsYXkoKS4gaXQgdGFrZXMgYWJvdXQgMjUwIGJ5dGVzICovCisvLyNkZWZpbmUgQ0ZHX1VERUxBWQorIAorLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0FSTTExMzYgICAgICAgICAgIDEgICAgLyogVGhpcyBpcyBhbiBhcm0xMTM2IENQVSBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQICAgICAgICAgICAgICAxICAgIC8qIGluIGEgVEkgT01BUCBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQMjQzMEg0ICAgICAgICAxICAgIC8qIGFuZCBvbiBhIEg0IGJvYXJkICovCisKKyNkZWZpbmUgQ09ORklHX09NQVAyNDNYIDEKKworLy8jZGVmaW5lIFBSQ01fQ09ORklHXzVBCQkgMQorI2RlZmluZSBQUkNNX0NPTkZJR18yICAgICAgICAgICAxIC8qIDI0MzAgRVMyKzMzMEFSTStERFItMTY1LVBJU01PICovCisKKyNkZWZpbmUgT01BUDI0MzBfU1FVQVJFX0NMT0NLX0lOUFVUIDEKKworLyogTWVtb3J5IHR5cGUgKi8KKy8vI2RlZmluZSBDRkdfU0RSQU1fRERSCQkJMSAvKiBub3QgdGVzdGVkICovCisvLyNkZWZpbmUgQ0ZHX1NEUkFNX0NPTUJPCQkyIC8qIG5vdCB0ZXN0ZWQgKi8KKyNkZWZpbmUgQ0ZHXzI0MzBTRFJBTV9ERFIJCTMKKy8vI2RlZmluZSBDRkdfU0RSQU1fU1RBQ0tFRAkJNCAvKiBub3QgdGVzdGVkICovCisKKy8qIFRoZSBhY3R1YWwgcmVnaXN0ZXIgdmFsdWVzIGFyZSBkZWZpbmVkIGluIHUtYm9vdC0gbWVtLmggKi8KKy8qIFNEUkFNIEJhbmsgQWxsb2NhdGlvbiBtZXRob2QgKi8KKy8vI2RlZmluZSBTRFJDX0JfUl9DICAgICAgICAgIDEKKy8vI2RlZmluZSBTRFJDX0IxX1JfQjBfQyAgICAgIDEKKyNkZWZpbmUgU0RSQ19SX0JfQyAgICAgICAgICAgIDEKKworLyogQm9vdCB0eXBlICovCisvLyNkZWZpbmUgQ0ZHX05BTkQgMQorI2RlZmluZSBDRkdfT05FTkFORCAxCisKKyMgZGVmaW5lIE5BTkRfQkFTRSAgICAgICAgICAgIDB4MEMwMDAwMDAgIC8qIE5BTkQgZmxhc2ggKi8KKyMgZGVmaW5lIE9ORU5BTkRfQkFTRQkgICAgICAweDIwMDAwMDAwICAvKiBPbmVOYW5kIGZsYXNoICovCisKKyNpZmRlZiBDRkdfTkFORAorI2RlZmluZSBOQU5EX0xFR0FDWQorI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV82NE0KKyNkZWZpbmUgT01BUDI0WFhfR1BNQ19DUzBfTUFQIE5BTkRfQkFTRQorI2Vsc2UKKyNkZWZpbmUgT01BUDI0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfMTI4TQorI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTMF9NQVAgT05FTkFORF9CQVNFCisjZGVmaW5lIE9ORU5BTkRfQUREUiBPTkVOQU5EX0JBU0UgIC8qIHBoeXNpY2FsIGFkZHJlc3MgdG8gYWNjZXNzIE9uZU5BTkQgYXQgQ1MwKi8KKyNlbmRpZgorCisvKiBBbm90aGVyIGRlcGVuZGVuY3kgb24gdS1ib290ICovCisjZGVmaW5lIHNkZWxheSBkZWxheQorCSAKKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMjQzMC5oPiAgICAgICAgLyogZ2V0IGNoaXAgYW5kIGJvYXJkIGRlZnMgKi8KKworI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgMTMwMDAwMDAKKy8qIGlucHV0IGNsb2NrIG9mIFBMTCAqLworLyogdGhlIE9NQVAyNDIwIEg0IGhhcyAxMk1IeiwgMTNNSHosIG9yIDE5LjJNaHogY3J5c3RhbCBpbnB1dCAqLworI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRICAgICAgVl9TQ0xLCisKKyNpZmRlZiBDRkdfUFJJTlRGCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCSgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQkoNDgwMDAwMDApCS8qIGNhbiBiZSAxMk0vMzJLaHogb3IgNDhNaHogKi8KKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMSAgICAgICAgIE9NQVAyNDMwX1VBUlQxCisgCisvKgorICogc2VsZWN0IHNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU0VSSUFMMSAgICAgICAgICAgMSAgICAvKiBVQVJUMSBvbiAyNDMwU0RQICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgICAxCisjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgICAxMTUyMDAKKyNkZWZpbmUgQ0ZHX1BCU0laRQkyNTYKKworI2VuZGlmIC8qIENGR19QUklOVEYgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9BREFERFIgCTB4ODAwMDgwMDAKKyAgCisjdW5kZWYJQ0ZHX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgxMjgqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworCisjaWZkZWYgQ0ZHX05BTkQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19OQU5EX0s5SzEyMTYgICAgLyogU2Ftc3VuZyAxNi1iaXQgNjRNQiBjaGlwICovCisKKy8qIE5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAweDAwMDAwMDAgLSAweDAwMTAwMDAgCUJvb3RpbmcgSW1hZ2UKKyAqIDB4MDAxMDAwMCAtIDB4MDA1MDAwMCAJVS1Cb290IEltYWdlCisgKiAweDAwNTAwMDAgLSAweDAwODAwMDAgCVUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogMHgwMDgwMDAwIC0gMHgwMEIwMDAwIAlLZXJuZWwgSW1hZ2UKKyAqIDB4MDBCMDAwMCAtIDB4NDAwMDAwMCAJZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisjZGVmaW5lIE5BTkRfVUJPT1RfU1RBUlQJMHgwMDQwMDAwCisjZGVmaW5lIE5BTkRfVUJPT1RfRU5ECQkweDAwODAwMDAKKyNkZWZpbmUgTkFORF9CTE9DS19TSVpFCQkweDQwMDAKKyAgCisjZGVmaW5lIEdQTUNfQ09ORklHCQkoT01BUDI0WFhfR1BNQ19CQVNFKzB4NTApCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzAJKE9NQVAyNFhYX0dQTUNfQkFTRSsweDdDKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18wCShPTUFQMjRYWF9HUE1DX0JBU0UrMHg4MCkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfMAkoT01BUDI0WFhfR1BNQ19CQVNFKzB4ODQpCisKKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpICgqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzApCisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikgICAgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpICAgIAorI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUoYWRyKSAgICAgICAgIAorI2RlZmluZSBOQU5EX0NUTF9TRVRDTEUoYWRyKSAgICAgICAgIAorI2RlZmluZSBOQU5EX0RJU0FCTEVfQ0UoKSAgICAgCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkgICAgICAgCisKKyNlbHNlCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBvbmVOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX1NZTkNfQlVSU1RfUkVBRCAgICAgMQorCisvKiBPbmVOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogICAweDAwMDAwMDAgLSAweDAwODAwMDAgICAgICAgIFgtTG9hZGVyIAorICogICAweDAwODAwMDAgLSAweDAwYzAwMDAgICAgICAgIFUtYm9vdCBJbWFnZQorICogICAweDAwYzAwMDAgLSAweDAwZTAwMDAgICAgICAgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogICAweDAwZTAwMDAgLSAweDAxMjAwMDAgICAgICAgIEtlcm5lbCBJbWFnZQorICogICAweDAxMjAwMDAgLSAweDQwMDAwMDAgICAgICAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworCisjZGVmaW5lIE9ORU5BTkRfU1RBUlRfQkxPQ0sgICAgICAgICAgICAgNAorI2RlZmluZSBPTkVOQU5EX0VORF9CTE9DSyAgICAgICAgICAgICAJNgorI2RlZmluZSBPTkVOQU5EX1BBR0VfU0laRSAgICAgICAgICAgICAgIDIwNDggICAgICAgICAgICAvKiAyS0IgKi8KKyNkZWZpbmUgT05FTkFORF9CTE9DS19TSVpFICAgICAgICAgICAgICAweDIwMDAwICAgICAgICAgLyogMTI4S0IgKi8KKworI2VuZGlmIC8vIG9uZU5BTkQKKyNlbmRpZgkJCQkJCQkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBsYWJyYWRvci5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzNDMwbGFicmFkb3IuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNjA4ODcyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzNDMwbGFicmFkb3IuaApAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNiAKKyAqIFRleGFzIEluc3RydW1lbnRzIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFgtTG9hZGVyIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIFRJIE9NQVAgU0RQMzQzMCBib2FyZC4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKiBzZXJpYWwgcHJpbnRmIGZhY2lsaXR5IHRha2VzIGFib3V0IDMuNUsgKi8KKyNkZWZpbmUgQ0ZHX1BSSU5URiAKKy8vI3VuZGVmIENGR19QUklOVEYgCisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19BUk1DT1JURVhBOCAgICAgICAxICAgIC8qIFRoaXMgaXMgYW4gQVJNIFY3IENQVSBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQICAgICAgICAgICAgICAxICAgIC8qIGluIGEgVEkgT01BUCBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQMzRYWCAgICAgICAgICAxICAgIC8qIHdoaWNoIGlzIGEgMzRYWCAqLworI2RlZmluZSBDT05GSUdfT01BUDM0MzAgICAgICAgICAgMSAgICAvKiB3aGljaCBpcyBpbiBhIDM0MzAgKi8KKyNkZWZpbmUgQ09ORklHXzM0MzBMQUJSQURPUiAgICAgIDEgICAgLyogd29ya2luZyBvbiBMYWJyYWRvciAqLworLy8jZGVmaW5lIENPTkZJR18zNDMwX0FTXzM0MTAgICAgMSAgICAvKiB0cnVlIGZvciAzNDMwIGluIDM0MTAgbW9kZSAqLworCisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+ICAgICAgICAvKiBnZXQgY2hpcCBhbmQgYm9hcmQgZGVmcyAqLworCisvKiB1bmNvbW1lbnQgaXQgaWYgeW91IG5lZWQgdGltZXIgYmFzZWQgdWRlbGF5KCkuIGl0IHRha2VzIGFib3V0IDI1MCBieXRlcyAqLworLy8jZGVmaW5lIENGR19VREVMQVkKKyAKKy8qIENsb2NrIERlZmluZXMgKi8KKyNkZWZpbmUgVl9PU0NLICAgICAgICAgICAgICAgICAgIDI2MDAwMDAwICAvKiBDbG9jayBvdXRwdXQgZnJvbSBUMiAqLworCisjaWYgKFZfT1NDSyA+IDE5MjAwMDAwKSAgICAgICAgICAKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIChWX09TQ0sgPj4gMSkKKyNlbHNlCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICBWX09TQ0sKKyNlbmRpZgorCisjZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMjY2TUhaICAgICAxICAgIC8qIFZERDI9MS4xNXYgLSAxMzNNSHogRERSICovCisvLyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8zMzJNSFogICAxICAgIC8qIFZERDI9MS4xNXYgLSAxNjZNSHogRERSICovCisjZGVmaW5lIFBSQ01fUENMS19PUFAyICAgICAgICAgICAxICAgIC8qIEFSTT01MDBNSHogLSBWREQxPTEuMjB2ICovCisKKy8qIE1lbW9yeSB0eXBlICovCisjZGVmaW5lIENGR18zNDMwU0RSQU1fRERSICAgICAgICAxCisKKy8qIFRoZSBhY3R1YWwgcmVnaXN0ZXIgdmFsdWVzIGFyZSBkZWZpbmVkIGluIHUtYm9vdC0gbWVtLmggKi8KKy8qIFNEUkFNIEJhbmsgQWxsb2NhdGlvbiBtZXRob2QgKi8KKy8vI2RlZmluZSBTRFJDX0JfUl9DICAgICAgICAgICAgIDEKKy8vI2RlZmluZSBTRFJDX0IxX1JfQjBfQyAgICAgICAgIDEKKyNkZWZpbmUgU0RSQ19SX0JfQyAgICAgICAgICAgICAgIDEKKworLyogQm9vdCB0eXBlICovCisjZGVmaW5lIENGR19OQU5EIDEKKy8vI2RlZmluZSBDRkdfT05FTkFORCAxCisKKyMgZGVmaW5lIE5BTkRfQkFTRV9BRFIgICAgICAgICAgIE5BTkRfQkFTRSAgLyogTkFORCBmbGFzaCAqLworIyBkZWZpbmUgT05FTkFORF9CQVNFICAgICAgICAgICAgT05FTkFORF9NQVAgIC8qIE9uZU5hbmQgZmxhc2ggKi8KKworI2lmZGVmIENGR19OQU5ECisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzEyOE0gIC8qIHUgPSBvZmRvbid0IG5lZWQgc28gbXVjaCBmb3IgbmFuZCBwb3J0ICovCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX01BUCBOQU5EX0JBU0VfQURSCisjZWxzZQorI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV8xMjhNCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX01BUCBPTkVOQU5EX0JBU0UKKyNkZWZpbmUgT05FTkFORF9BRERSIE9ORU5BTkRfQkFTRSAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBPbmVOQU5EIGF0IENTMCovCisjZW5kaWYKKworCisjaWZkZWYgQ0ZHX1BSSU5URgorCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRSAgICAgKC00KQorI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsgICAgICAgICAgKDQ4MDAwMDAwKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00zICAgICAgICAgT01BUDM0WFhfVUFSVDMKKyAKKy8qCisgKiBzZWxlY3Qgc2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TRVJJQUwzICAgICAgICAgICAzICAgIC8qIFVBUlQzIG9uIGJvYXJkICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgICAzCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgIDExNTIwMAorI2RlZmluZSBDRkdfUEJTSVpFICAgICAgICAgICAgICAgMjU2CisKKyNlbmRpZiAvKiBDRkdfUFJJTlRGICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSICAgICAgICAgICAgIDB4ODAwMDgwMDAKKyAgCisjdW5kZWYJQ0ZHX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFICAgICAgICAgKDEyOCoxMDI0KSAvKiByZWd1bGFyIHN0YWNrICovCisKKyNpZmRlZiBDRkdfTkFORAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBOQU5EIEluZm8uCisgKi8KKworCisjZGVmaW5lIENGR19OQU5EX0s5RjFHMDhSMEEgICAgLyogTWljcm9uIDE2LWJpdCAyNTZNQiBjaGlwIGxhcmdlIHBhZ2UgTkFORCBjaGlwKi8KKyNkZWZpbmUgTkFORF8xNkJJVAorCisvKiBOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogMHgwMDAwMDAwMCAtIDB4MDAwN0ZGRkYgIEJvb3RpbmcgSW1hZ2UKKyAqIDB4MDAwODAwMDAgLSAweDAwMEJGRkZGICBVLUJvb3QgSW1hZ2UKKyAqIDB4MDAwQzAwMDAgLSAweDAwMEZGRkZGICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqIDB4MDAxMDAwMDAgLSAweDAwMkZGRkZGICBLZXJuZWwgSW1hZ2UKKyAqIDB4MDAzMDAwMDAgLSAweDA4MDAwMDAwICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9TVEFSVCAgICAgICAgIDB4MDA4MDAwMCAvKiBMZWF2aW5nIGZpcnN0IDQgYmxvY2tzIGZvciB4LWxvYWQgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9FTkQgICAgICAgICAgIDB4MDBDMDAwMCAvKiBHaXZpbmcgYSBzcGFjZSBvZiAyIGJsb2NrcyA9IDI1NktCICovCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRSAgICAgICAgICAweDIwMDAwCisgIAorI2RlZmluZSBHUE1DX0NPTkZJRyAgICAgICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDUwKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDdDKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDgwKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8wICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDg0KQorCisjaWZkZWYgTkFORF8xNkJJVAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wKQorI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2Vsc2UgLyogdG8gc3VwcG9ydCA4LWJpdCBOQU5EIGRldmljZXMgKi8KKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wKTsKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNlbmRpZgorCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpIAorI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpIAorI2RlZmluZSBOQU5EX0RJU0FCTEVfQ0UoKSAKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKSAKKworI2Vsc2UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIG9uZU5BTkQgSW5mby4KKyAqLworI2RlZmluZSBDRkdfU1lOQ19CVVJTVF9SRUFEICAgICAgMQorCisvKiBPbmVOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogICAweDAwMDAwMDAgLSAweDAwODAwMDAgIFgtTG9hZGVyIAorICogICAweDAwODAwMDAgLSAweDAwYzAwMDAgICBVLWJvb3QgSW1hZ2UKKyAqICAgMHgwMGMwMDAwIC0gMHgwMGUwMDAwICAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAgIDB4MDBlMDAwMCAtIDB4MDEyMDAwMCAgIEtlcm5lbCBJbWFnZQorICogICAweDAxMjAwMDAgLSAweDQwMDAwMDAgICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKworI2RlZmluZSBPTkVOQU5EX1NUQVJUX0JMT0NLICAgICAgNAorI2RlZmluZSBPTkVOQU5EX0VORF9CTE9DSyAgICAgICAgNgorI2RlZmluZSBPTkVOQU5EX1BBR0VfU0laRSAgICAgICAgMjA0OCAgICAgLyogMktCICovCisjZGVmaW5lIE9ORU5BTkRfQkxPQ0tfU0laRSAgICAgICAweDIwMDAwICAvKiAxMjhLQiAqLworCisjZW5kaWYgIC8qIG9uZU5BTkQgKi8KKyNlbmRpZiAvKiBfX0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMHNkcC5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzNDMwc2RwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4ODBlZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMHNkcC5oCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2IAorICogVGV4YXMgSW5zdHJ1bWVudHMgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogWC1Mb2FkZXIgQ29uZmlndWF0aW9uIHNldHRpbmdzIGZvciB0aGUgVEkgT01BUCBTRFAzNDMwIGJvYXJkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIHNlcmlhbCBwcmludGYgZmFjaWxpdHkgdGFrZXMgYWJvdXQgMy41SyAqLworI2RlZmluZSBDRkdfUFJJTlRGIAorLy8jdW5kZWYgQ0ZHX1BSSU5URiAKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0FSTUNPUlRFWEE4ICAgICAgIDEgICAgLyogVGhpcyBpcyBhbiBBUk0gVjcgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgIDEgICAgLyogaW4gYSBUSSBPTUFQIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAzNFhYICAgICAgICAgIDEgICAgLyogd2hpY2ggaXMgYSAzNFhYICovCisjZGVmaW5lIENPTkZJR19PTUFQMzQzMCAgICAgICAgICAxICAgIC8qIHdoaWNoIGlzIGluIGEgMzQzMCAqLworI2RlZmluZSBDT05GSUdfMzQzMFNEUCAgICAgICAgICAgMSAgICAvKiB3b3JraW5nIHdpdGggU0RQICovCisvLyNkZWZpbmUgQ09ORklHXzM0MzBfQVNfMzQxMAkgMSAgICAvKiB0cnVlIGZvciAzNDMwIGluIDM0MTAgbW9kZSAqLworCisvKiBFbmFibGUgdGhlIGJlbG93IG1hY3JvIGlmIE1NQyBib290IHN1cHBvcnQgaXMgcmVxdWlyZWQgKi8KKy8vI2RlZmluZSBDT05GSUdfTU1DICAgICAgICAgICAgICAgMQorI2lmIGRlZmluZWQoQ09ORklHX01NQykKKwkjZGVmaW5lIENGR19DTURfTU1DICAgICAgICAgICAgICAxCisJI2RlZmluZSBDRkdfQ01EX0ZBVCAgICAgICAgICAgICAgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4gICAgICAgIC8qIGdldCBjaGlwIGFuZCBib2FyZCBkZWZzICovCisKKy8qIHVuY29tbWVudCBpdCBpZiB5b3UgbmVlZCB0aW1lciBiYXNlZCB1ZGVsYXkoKS4gaXQgdGFrZXMgYWJvdXQgMjUwIGJ5dGVzICovCisvLyNkZWZpbmUgQ0ZHX1VERUxBWQorIAorLyogQ2xvY2sgRGVmaW5lcyAqLworI2RlZmluZSBWX09TQ0sgICAgICAgICAgICAgICAgICAgMTkyMDAwMDAgIC8qIENsb2NrIG91dHB1dCBmcm9tIFQyICovCisKKyNpZiAoVl9PU0NLID4gMTkyMDAwMDApICAgICAgICAgIAorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgKFZfT1NDSyA+PiAxKQorI2Vsc2UKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIFZfT1NDSworI2VuZGlmCisKKy8vI2RlZmluZSBQUkNNX0NMS19DRkcyXzI2Nk1IWiAgIDEgICAgLyogVkREMj0xLjE1diAtIDEzM01IeiBERFIgKi8KKyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8zMzJNSFogICAgIDEgICAgLyogVkREMj0xLjE1diAtIDE2Nk1IeiBERFIgKi8KKyNkZWZpbmUgUFJDTV9QQ0xLX09QUDIgICAgICAgICAgIDEgICAgLyogQVJNPTM4MU1IeiAtIFZERDE9MS4yMHYgKi8KKworLyogTWVtb3J5IHR5cGUgKi8KKyNkZWZpbmUgQ0ZHXzM0MzBTRFJBTV9ERFIgICAgICAgIDEKKworLyogVGhlIGFjdHVhbCByZWdpc3RlciB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gdS1ib290LSBtZW0uaCAqLworLyogU0RSQU0gQmFuayBBbGxvY2F0aW9uIG1ldGhvZCAqLworLy8jZGVmaW5lIFNEUkNfQl9SX0MgICAgICAgICAgICAgMQorLy8jZGVmaW5lIFNEUkNfQjFfUl9CMF9DICAgICAgICAgMQorI2RlZmluZSBTRFJDX1JfQl9DICAgICAgICAgICAgICAgMQorCisvKiBCb290IHR5cGUgKi8KKyNkZWZpbmUgQ0ZHX05BTkQgMQorLy8jZGVmaW5lIENGR19PTkVOQU5EIDEKKworIyBkZWZpbmUgTkFORF9CQVNFX0FEUiAgICAgICAgICAgTkFORF9CQVNFICAvKiBOQU5EIGZsYXNoICovCisjIGRlZmluZSBPTkVOQU5EX0JBU0UgICAgICAgICAgICBPTkVOQU5EX01BUCAgLyogT25lTmFuZCBmbGFzaCAqLworCisjaWZkZWYgQ0ZHX05BTkQKKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfMTI4TQorI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9NQVAgTkFORF9CQVNFX0FEUgorI2Vsc2UKKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfMTI4TQorI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9NQVAgT05FTkFORF9CQVNFCisjZGVmaW5lIE9ORU5BTkRfQUREUiBPTkVOQU5EX0JBU0UgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgT25lTkFORCBhdCBDUzAqLworI2VuZGlmCisgCisjaWZkZWYgQ0ZHX1BSSU5URgorCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRSAgICAgKC00KQorI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsgICAgICAgICAgKDQ4MDAwMDAwKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xICAgICAgICAgT01BUDM0WFhfVUFSVDEKKyAKKy8qCisgKiBzZWxlY3Qgc2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TRVJJQUwxICAgICAgICAgICAxICAgIC8qIFVBUlQxIG9uIDM0MzBTRFAgKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgICAgIDEKKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAgMTE1MjAwCisjZGVmaW5lIENGR19QQlNJWkUgICAgICAgICAgICAgICAyNTYKKworI2VuZGlmIC8qIENGR19QUklOVEYgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9BREFERFIgICAgICAgICAgICAgMHg4MDAwODAwMAorICAKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhY2sgc2l6ZXMKKyAqCisgKiBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUgICAgICAgICAoMTI4KjEwMjQpIC8qIHJlZ3VsYXIgc3RhY2sgKi8KKworI2lmZGVmIENGR19OQU5ECisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIE5BTkQgSW5mby4KKyAqLworCisKKyNkZWZpbmUgQ0ZHX05BTkRfSzlGMUcwOFIwQSAgICAvKiBTYW1zdW5nIDgtYml0IDEyOE1CIGNoaXAgbGFyZ2UgcGFnZSBOQU5EIGNoaXAqLworI2RlZmluZSBOQU5EXzhCSVQKKworLyogTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMDAgLSAweDAwMDdGRkZGICBCb290aW5nIEltYWdlCisgKiAweDAwMDgwMDAwIC0gMHgwMDBCRkZGRiAgVS1Cb290IEltYWdlCisgKiAweDAwMEMwMDAwIC0gMHgwMDBGRkZGRiAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwMTAwMDAwIC0gMHgwMDJGRkZGRiAgS2VybmVsIEltYWdlCisgKiAweDAwMzAwMDAwIC0gMHgwODAwMDAwMCAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisjZGVmaW5lIE5BTkRfVUJPT1RfU1RBUlQgICAgICAgICAweDAwODAwMDAgLyogTGVhdmluZyBmaXJzdCA0IGJsb2NrcyBmb3IgeC1sb2FkICovCisjZGVmaW5lIE5BTkRfVUJPT1RfRU5EICAgICAgICAgICAweDAwQzAwMDAgLyogR2l2aW5nIGEgc3BhY2Ugb2YgMiBibG9ja3MgPSAyNTZLQiAqLworI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUgICAgICAgICAgMHgyMDAwMAorICAKKyNkZWZpbmUgR1BNQ19DT05GSUcgICAgICAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg1MCkKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg3QykKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg4MCkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfMCAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg4NCkKKworI2lmZGVmIE5BTkRfMTZCSVQKKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCkKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNlbHNlIC8qIHRvIHN1cHBvcnQgOC1iaXQgTkFORCBkZXZpY2VzICovCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCk7CisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZW5kaWYKKworI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikgCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpIAorI2RlZmluZSBOQU5EX0NUTF9TRVRDTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkgCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkgCisKKyNlbHNlCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBvbmVOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX1NZTkNfQlVSU1RfUkVBRCAgICAgIDEKKworLyogT25lTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqICAgMHgwMDAwMDAwIC0gMHgwMDgwMDAwICBYLUxvYWRlciAKKyAqICAgMHgwMDgwMDAwIC0gMHgwMGMwMDAwICAgVS1ib290IEltYWdlCisgKiAgIDB4MDBjMDAwMCAtIDB4MDBlMDAwMCAgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogICAweDAwZTAwMDAgLSAweDAxMjAwMDAgICBLZXJuZWwgSW1hZ2UKKyAqICAgMHgwMTIwMDAwIC0gMHg0MDAwMDAwICAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisKKyNkZWZpbmUgT05FTkFORF9TVEFSVF9CTE9DSyAgICAgIDQKKyNkZWZpbmUgT05FTkFORF9FTkRfQkxPQ0sgICAgICAgIDYKKyNkZWZpbmUgT05FTkFORF9QQUdFX1NJWkUgICAgICAgIDIwNDggICAgIC8qIDJLQiAqLworI2RlZmluZSBPTkVOQU5EX0JMT0NLX1NJWkUgICAgICAgMHgyMDAwMCAgLyogMTI4S0IgKi8KKworI2VuZGlmICAvKiBvbmVOQU5EICovCisjZW5kaWYgLyogX19DT05GSUdfSCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDNldm0uaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwM2V2bS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4MTBhMTcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDNldm0uaApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaXN0cmFsIFNvbHV0aW9ucyBQdnQgTHRkLgorICoKKyAqIFgtTG9hZGVyIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIE9NQVAzRVZNIGJvYXJkLgorICoKKyAqIERlcml2ZWQgZnJvbSAvaW5jbHVkZS9jb25maWdzL29tYXAzNDMwc2RwLmgKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKiBzZXJpYWwgcHJpbnRmIGZhY2lsaXR5IHRha2VzIGFib3V0IDMuNUsgKi8KKyNkZWZpbmUgQ0ZHX1BSSU5URgorLy8jdW5kZWYgQ0ZHX1BSSU5URgorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQVJNQ09SVEVYQTggICAgICAgMSAgICAvKiBUaGlzIGlzIGFuIEFSTSBWNyBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUCAgICAgICAgICAgICAgMSAgICAvKiBpbiBhIFRJIE9NQVAgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUDM0WFggICAgICAgICAgMSAgICAvKiB3aGljaCBpcyBhIDM0WFggKi8KKyNkZWZpbmUgQ09ORklHX09NQVAzNDMwICAgICAgICAgIDEgICAgLyogd2hpY2ggaXMgaW4gYSAzNDMwICovCisvLyNkZWZpbmUgQ09ORklHXzM0MzBTRFAgICAgICAgICAgIDEgICAgLyogd29ya2luZyB3aXRoIFNEUCAqLworLy8jZGVmaW5lIENPTkZJR18zNDMwX0FTXzM0MTAJIDEgICAgLyogdHJ1ZSBmb3IgMzQzMCBpbiAzNDEwIG1vZGUgKi8KKworI2RlZmluZSBDT05GSUdfT01BUDNFVk0gICAgICAgICAgMSAgICAvKiB3b3JraW5nIHdpdGggRVZNICovCisKKy8qIEVuYWJsZSB0aGUgYmVsb3cgbWFjcm8gaWYgTU1DIGJvb3Qgc3VwcG9ydCBpcyByZXF1aXJlZCAqLworI2RlZmluZSBDT05GSUdfTU1DICAgICAgICAgICAgICAgMQorI2lmIGRlZmluZWQoQ09ORklHX01NQykKKwkjZGVmaW5lIENGR19DTURfTU1DICAgICAgICAgICAgICAxCisJI2RlZmluZSBDRkdfQ01EX0ZBVCAgICAgICAgICAgICAgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4gICAgICAgIC8qIGdldCBjaGlwIGFuZCBib2FyZCBkZWZzICovCisKKy8qIHVuY29tbWVudCBpdCBpZiB5b3UgbmVlZCB0aW1lciBiYXNlZCB1ZGVsYXkoKS4gaXQgdGFrZXMgYWJvdXQgMjUwIGJ5dGVzICovCisvLyNkZWZpbmUgQ0ZHX1VERUxBWQorCisvKiBDbG9jayBEZWZpbmVzICovCisjZGVmaW5lIFZfT1NDSyAgICAgICAgICAgICAgICAgICAyNjAwMDAwMCAgLyogQ2xvY2sgb3V0cHV0IGZyb20gVDIgKi8KKworI2lmIChWX09TQ0sgPiAxOTIwMDAwMCkKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIChWX09TQ0sgPj4gMSkKKyNlbHNlCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICBWX09TQ0sKKyNlbmRpZgorCisvLyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8yNjZNSFogICAxICAgIC8qIFZERDI9MS4xNXYgLSAxMzNNSHogRERSICovCisjZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMzMyTUhaICAgICAxICAgIC8qIFZERDI9MS4xNXYgLSAxNjZNSHogRERSICovCisjZGVmaW5lIFBSQ01fUENMS19PUFAyICAgICAgICAgICAxICAgIC8qIEFSTT0zODFNSHogLSBWREQxPTEuMjB2ICovCisKKy8qIE1lbW9yeSB0eXBlICovCisjZGVmaW5lIENGR19PTUFQRVZNX0REUgkJMQorI2RlZmluZSBDRkdfMzQzMFNEUkFNX0REUgkxCisjZGVmaW5lIENPTkZJR19ERFJfMjU2TUJfU1RBQ0tFRAorCisvKiBUaGUgYWN0dWFsIHJlZ2lzdGVyIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiB1LWJvb3QtIG1lbS5oICovCisvKiBTRFJBTSBCYW5rIEFsbG9jYXRpb24gbWV0aG9kICovCisvLyNkZWZpbmUgU0RSQ19CX1JfQyAgICAgICAgICAgICAxCisvLyNkZWZpbmUgU0RSQ19CMV9SX0IwX0MgICAgICAgICAxCisjZGVmaW5lIFNEUkNfUl9CX0MgICAgICAgICAgICAgICAxCisKKworIyBkZWZpbmUgTkFORF9CQVNFX0FEUiAgICAgICAgICAgTkFORF9CQVNFICAvKiBOQU5EIGZsYXNoICovCisjIGRlZmluZSBPTkVOQU5EX0JBU0UgICAgICAgICAgICBPTkVOQU5EX01BUCAgLyogT25lTmFuZCBmbGFzaCAqLworCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzEyOE0KKyNkZWZpbmUgT05FTkFORF9BRERSIE9ORU5BTkRfQkFTRSAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBPbmVOQU5EIGF0IENTMCovCisKKyNpZmRlZiBDRkdfUFJJTlRGCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFICAgICAoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSyAgICAgICAgICAoNDgwMDAwMDApCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEgICAgICAgICBPTUFQMzRYWF9VQVJUMQorCisvKgorICogc2VsZWN0IHNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU0VSSUFMMSAgICAgICAgICAgMSAgICAvKiBVQVJUMSBvbiBPTUFQM0VWTSAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAgMQorCisjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgICAxMTUyMDAKKyNkZWZpbmUgQ0ZHX1BCU0laRSAgICAgICAgICAgICAgIDI1NgorCisjZW5kaWYgLyogQ0ZHX1BSSU5URiAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT0FEQUREUiAgICAgICAgICAgICAweDgwMDA4MDAwCisKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRSAgICAgICAgICgxMjgqMTAyNCkgLyogcmVndWxhciBzdGFjayAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBOQU5EIEluZm8uCisgKi8KKworCisjZGVmaW5lIENGR19OQU5EX0s5RjFHMDhSMEEgICAgLyogU2Ftc3VuZyA4LWJpdCAxMjhNQiBjaGlwIGxhcmdlIHBhZ2UgTkFORCBjaGlwKi8KKyNkZWZpbmUgTkFORF8xNkJJVAorCisvKiBOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogMHgwMDAwMDAwMCAtIDB4MDAwN0ZGRkYgIEJvb3RpbmcgSW1hZ2UKKyAqIDB4MDAwODAwMDAgLSAweDAwMjNGRkZGICBVLUJvb3QgSW1hZ2UKKyAqIDB4MDAyNDAwMDAgLSAweDAwMjdGRkZGICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqIDB4MDAyODAwMDAgLSAweDAwNzdGRkZGICBLZXJuZWwgSW1hZ2UKKyAqIDB4MDA3ODAwMDAgLSAweDA4MDAwMDAwICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9TVEFSVCAgICAgICAgIDB4MDA4MDAwMCAvKiBMZWF2aW5nIGZpcnN0IDQgYmxvY2tzIGZvciB4LWxvYWQgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9FTkQgICAgICAgICAgIDB4MDI0MDAwMCAvKiBHaXZpbmcgYSBzcGFjZSBvZiAyIGJsb2NrcyA9IDI1NktCICovCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRSAgICAgICAgICAweDIwMDAwCisKKyNkZWZpbmUgR1BNQ19DT05GSUcgICAgICAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg1MCkKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg3QykKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg4MCkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfMCAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg4NCkKKworI2lmZGVmIE5BTkRfMTZCSVQKKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCkKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNlbHNlIC8qIHRvIHN1cHBvcnQgOC1iaXQgTkFORCBkZXZpY2VzICovCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCk7CisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZW5kaWYKKworI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKQorI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUoYWRyKQorI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUoYWRyKQorI2RlZmluZSBOQU5EX0NUTF9TRVRDTEUoYWRyKQorI2RlZmluZSBOQU5EX0RJU0FCTEVfQ0UoKQorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIG9uZU5BTkQgSW5mby4KKyAqLworI2RlZmluZSBDRkdfU1lOQ19CVVJTVF9SRUFEICAgICAgMQorCisvKiBPbmVOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogICAweDAwMDAwMDAgLSAweDAwODAwMDAgIFgtTG9hZGVyCisgKiAgIDB4MDA4MDAwMCAtIDB4MDI0MDAwMCAgIFUtYm9vdCBJbWFnZQorICogICAweDAyNDAwMDAgLSAweDAyODAwMDAgICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqICAgMHgwMjgwMDAwIC0gMHgwNzgwMDAwICAgS2VybmVsIEltYWdlCisgKiAgIDB4MDc4MDAwMCAtIDB4ODAwMDAwMCAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworCisjZGVmaW5lIE9ORU5BTkRfU1RBUlRfQkxPQ0sgICAgICA0CisjZGVmaW5lIE9ORU5BTkRfRU5EX0JMT0NLICAgICAgICAxOAorI2RlZmluZSBPTkVOQU5EX1BBR0VfU0laRSAgICAgICAgMjA0OCAgICAgLyogMktCICovCisjZGVmaW5lIE9ORU5BTkRfQkxPQ0tfU0laRSAgICAgICAweDIwMDAwICAvKiAxMjhLQiAqLworCisjZW5kaWYgLyogX19DT05GSUdfSCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2ZhdC5oIGIveC1sb2FkZXIvaW5jbHVkZS9mYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjU3M2JhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9mYXQuaApAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIFIvTyAoVilGQVQgMTIvMTYvMzIgZmlsZXN5c3RlbSBpbXBsZW1lbnRhdGlvbiBieSBNYXJjdXMgU3VuZGJlcmcKKyAqCisgKiAyMDAyLTA3LTI4IC0gcmpvbmVzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHBwY2Jvb3QgdjEuMS42CisgKiAyMDAzLTAzLTEwIC0ga2hhcnJpc0BuZXh1cy10ZWNoLm5ldCAtIHBvcnRlZCB0byB1LWJvb3QKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfRkFUX0hfCisjZGVmaW5lIF9GQVRfSF8KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2RlZmluZSBDT05GSUdfU1VQUE9SVF9WRkFUCisKKyNkZWZpbmUgU0VDVE9SX1NJWkUgRlNfQkxPQ0tfU0laRQorCisjZGVmaW5lIEZTX0JMT0NLX1NJWkUgNTEyCisKKyNpZiBGU19CTE9DS19TSVpFICE9IFNFQ1RPUl9TSVpFCisjZXJyb3IgRlNfQkxPQ0tfU0laRSAhPSBTRUNUT1JfU0laRSAtIFRoaXMgY29kZSBuZWVkcyB0byBiZSBmaXhlZCEKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9DTFVTVFNJWkUJNjU1MzYKKyNkZWZpbmUgRElSRU5UU1BFUkJMT0NLCShGU19CTE9DS19TSVpFL3NpemVvZihkaXJfZW50cnkpKQorI2RlZmluZSBESVJFTlRTUEVSQ0xVU1QJKChteWRhdGEtPmNsdXN0X3NpemUqU0VDVE9SX1NJWkUpL3NpemVvZihkaXJfZW50cnkpKQorCisjZGVmaW5lIEZBVEJVRkJMT0NLUwk2CisjZGVmaW5lIEZBVEJVRlNJWkUJKEZTX0JMT0NLX1NJWkUqRkFUQlVGQkxPQ0tTKQorI2RlZmluZSBGQVQxMkJVRlNJWkUJKChGQVRCVUZTSVpFKjIpLzMpCisjZGVmaW5lIEZBVDE2QlVGU0laRQkoRkFUQlVGU0laRS8yKQorI2RlZmluZSBGQVQzMkJVRlNJWkUJKEZBVEJVRlNJWkUvNCkKKworCisvKiBGaWxlc3lzdGVtIGlkZW50aWZpZXJzICovCisjZGVmaW5lIEZBVDEyX1NJR04JIkZBVDEyICAgIgorI2RlZmluZSBGQVQxNl9TSUdOCSJGQVQxNiAgICIKKyNkZWZpbmUgRkFUMzJfU0lHTgkiRkFUMzIgICAiCisjZGVmaW5lIFNJR05MRU4JCTcKKworLyogRmlsZSBhdHRyaWJ1dGVzICovCisjZGVmaW5lIEFUVFJfUk8gICAgICAxCisjZGVmaW5lIEFUVFJfSElEREVOICAyCisjZGVmaW5lIEFUVFJfU1lTICAgICA0CisjZGVmaW5lIEFUVFJfVk9MVU1FICA4CisjZGVmaW5lIEFUVFJfRElSICAgICAxNgorI2RlZmluZSBBVFRSX0FSQ0ggICAgMzIKKworI2RlZmluZSBBVFRSX1ZGQVQgICAgIChBVFRSX1JPIHwgQVRUUl9ISURERU4gfCBBVFRSX1NZUyB8IEFUVFJfVk9MVU1FKQorCisjZGVmaW5lIERFTEVURURfRkxBRwkoKGNoYXIpMHhlNSkgLyogTWFya3MgZGVsZXRlZCBmaWxlcyB3aGVuIGluIG5hbWVbMF0gKi8KKyNkZWZpbmUgYVJJTkcJCTB4MDUJICAgICAvKiBVc2VkIHRvIHJlcHJlc2VudCAn5ScgaW4gbmFtZVswXSAqLworCisvKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZW50cnkgaXMgdGhlIGxhc3QgbG9uZyBlbnRyeSBpbiBhIHNldCBvZiBsb25nCisgKiBkaXIgZW50cmllcworICovCisjZGVmaW5lIExBU1RfTE9OR19FTlRSWV9NQVNLCTB4NDAKKworLyogRmxhZ3MgdGVsbGluZyB3aGV0aGVyIHdlIHNob3VsZCByZWFkIGEgZmlsZSBvciBsaXN0IGEgZGlyZWN0b3J5ICovCisjZGVmaW5lIExTX05PCTAKKyNkZWZpbmUgTFNfWUVTCTEKKyNkZWZpbmUgTFNfRElSCTEKKyNkZWZpbmUgTFNfUk9PVAkyCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBGQVRfRFBSSU5UKGFyZ3MuLi4pCXByaW50ZihhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRkFUX0RQUklOVChhcmdzLi4uKQorI2VuZGlmCisjZGVmaW5lIEZBVF9FUlJPUihhcmcpCQlwcmludGYoYXJnKQorCisjZGVmaW5lIElTRElSREVMSU0oYykgICAoKGMpID09ICcvJyB8fCAoYykgPT0gJ1xcJykKKworI2RlZmluZSBGU1RZUEVfTk9ORQkoLTEpCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorI2RlZmluZSBGQVQyQ1BVMTYJbGUxNl90b19jcHUKKyNkZWZpbmUgRkFUMkNQVTMyCWxlMzJfdG9fY3B1CisjZWxzZQorI2lmIF9fTElUVExFX0VORElBTgorI2RlZmluZSBGQVQyQ1BVMTYoeCkJKHgpCisjZGVmaW5lIEZBVDJDUFUzMih4KQkoeCkKKyNlbHNlCisjZGVmaW5lIEZBVDJDUFUxNih4KQkoKCgoeCkgJiAweDAwZmYpIDw8IDgpIHwgKCgoeCkgJiAweGZmMDApID4+IDgpKQorI2RlZmluZSBGQVQyQ1BVMzIoeCkJKCgoKHgpICYgMHgwMDAwMDBmZikgPDwgMjQpICB8CVwKKwkgCQkgKCgoeCkgJiAweDAwMDBmZjAwKSA8PCA4KSAgfAlcCisJCQkgKCgoeCkgJiAweDAwZmYwMDAwKSA+PiA4KSAgfAlcCisJCQkgKCgoeCkgJiAweGZmMDAwMDAwKSA+PiAyNCkpCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFRPTE9XRVIoYykJaWYoKGMpID49ICdBJyAmJiAoYykgPD0gJ1onKXsoYykrPSgnYScgLSAnQScpO30KKyNkZWZpbmUgU1RBUlQoZGVudCkJKEZBVDJDUFUxNigoZGVudCktPnN0YXJ0KSBcCisJCQkrIChteWRhdGEtPmZhdHNpemUgIT0gMzIgPyAwIDogXAorCQkJICAoRkFUMkNQVTE2KChkZW50KS0+c3RhcnRoaSkgPDwgMTYpKSkKKworCit0eXBlZGVmIHN0cnVjdCBib290X3NlY3RvciB7CisJX191OAlpZ25vcmVkWzNdOwkvKiBCb290c3RyYXAgY29kZSAqLworCWNoYXIJc3lzdGVtX2lkWzhdOwkvKiBOYW1lIG9mIGZzICovCisJX191OAlzZWN0b3Jfc2l6ZVsyXTsJLyogQnl0ZXMvc2VjdG9yICovCisJX191OAljbHVzdGVyX3NpemU7CS8qIFNlY3RvcnMvY2x1c3RlciAqLworCV9fdTE2CXJlc2VydmVkOwkvKiBOdW1iZXIgb2YgcmVzZXJ2ZWQgc2VjdG9ycyAqLworCV9fdTgJZmF0czsJCS8qIE51bWJlciBvZiBGQVRzICovCisJX191OAlkaXJfZW50cmllc1syXTsJLyogTnVtYmVyIG9mIHJvb3QgZGlyZWN0b3J5IGVudHJpZXMgKi8KKwlfX3U4CXNlY3RvcnNbMl07CS8qIE51bWJlciBvZiBzZWN0b3JzICovCisJX191OAltZWRpYTsJCS8qIE1lZGlhIGNvZGUgKi8KKwlfX3UxNglmYXRfbGVuZ3RoOwkvKiBTZWN0b3JzL0ZBVCAqLworCV9fdTE2CXNlY3NfdHJhY2s7CS8qIFNlY3RvcnMvdHJhY2sgKi8KKwlfX3UxNgloZWFkczsJCS8qIE51bWJlciBvZiBoZWFkcyAqLworCV9fdTMyCWhpZGRlbjsJCS8qIE51bWJlciBvZiBoaWRkZW4gc2VjdG9ycyAqLworCV9fdTMyCXRvdGFsX3NlY3Q7CS8qIE51bWJlciBvZiBzZWN0b3JzIChpZiBzZWN0b3JzID09IDApICovCisKKwkvKiBGQVQzMiBvbmx5ICovCisJX191MzIJZmF0MzJfbGVuZ3RoOwkvKiBTZWN0b3JzL0ZBVCAqLworCV9fdTE2CWZsYWdzOwkJLyogQml0IDg6IGZhdCBtaXJyb3JpbmcsIGxvdyA0OiBhY3RpdmUgZmF0ICovCisJX191OAl2ZXJzaW9uWzJdOwkvKiBGaWxlc3lzdGVtIHZlcnNpb24gKi8KKwlfX3UzMglyb290X2NsdXN0ZXI7CS8qIEZpcnN0IGNsdXN0ZXIgaW4gcm9vdCBkaXJlY3RvcnkgKi8KKwlfX3UxNglpbmZvX3NlY3RvcjsJLyogRmlsZXN5c3RlbSBpbmZvIHNlY3RvciAqLworCV9fdTE2CWJhY2t1cF9ib290OwkvKiBCYWNrdXAgYm9vdCBzZWN0b3IgKi8KKwlfX3UxNglyZXNlcnZlZDJbNl07CS8qIFVudXNlZCAqLworfSBib290X3NlY3RvcjsKKwordHlwZWRlZiBzdHJ1Y3Qgdm9sdW1lX2luZm8KK3sKKwlfX3U4IGRyaXZlX251bWJlcjsJLyogQklPUyBkcml2ZSBudW1iZXIgKi8KKwlfX3U4IHJlc2VydmVkOwkJLyogVW51c2VkICovCisJX191OCBleHRfYm9vdF9zaWduOwkvKiAweDI5IGlmIGZpZWxkcyBiZWxvdyBleGlzdCAoRE9TIDMuMyspICovCisJX191OCB2b2x1bWVfaWRbNF07CS8qIFZvbHVtZSBJRCBudW1iZXIgKi8KKwljaGFyIHZvbHVtZV9sYWJlbFsxMV07CS8qIFZvbHVtZSBsYWJlbCAqLworCWNoYXIgZnNfdHlwZVs4XTsJLyogVHlwaWNhbGx5IEZBVDEyLCBGQVQxNiwgb3IgRkFUMzIgKi8KKwkvKiBCb290IGNvZGUgY29tZXMgbmV4dCwgYWxsIGJ1dCAyIGJ5dGVzIHRvIGZpbGwgdXAgc2VjdG9yICovCisJLyogQm9vdCBzaWduIGNvbWVzIGxhc3QsIDIgYnl0ZXMgKi8KK30gdm9sdW1lX2luZm87CisKK3R5cGVkZWYgc3RydWN0IGRpcl9lbnRyeSB7CisJY2hhcgluYW1lWzhdLGV4dFszXTsJLyogTmFtZSBhbmQgZXh0ZW5zaW9uICovCisJX191OAlhdHRyOwkJLyogQXR0cmlidXRlIGJpdHMgKi8KKwlfX3U4CWxjYXNlOwkJLyogQ2FzZSBmb3IgYmFzZSBhbmQgZXh0ZW5zaW9uICovCisJX191OAljdGltZV9tczsJLyogQ3JlYXRpb24gdGltZSwgbWlsbGlzZWNvbmRzICovCisJX191MTYJY3RpbWU7CQkvKiBDcmVhdGlvbiB0aW1lICovCisJX191MTYJY2RhdGU7CQkvKiBDcmVhdGlvbiBkYXRlICovCisJX191MTYJYWRhdGU7CQkvKiBMYXN0IGFjY2VzcyBkYXRlICovCisJX191MTYJc3RhcnRoaTsJLyogSGlnaCAxNiBiaXRzIG9mIGNsdXN0ZXIgaW4gRkFUMzIgKi8KKwlfX3UxNgl0aW1lLGRhdGUsc3RhcnQ7LyogVGltZSwgZGF0ZSBhbmQgZmlyc3QgY2x1c3RlciAqLworCV9fdTMyCXNpemU7CQkvKiBGaWxlIHNpemUgaW4gYnl0ZXMgKi8KK30gZGlyX2VudHJ5OworCit0eXBlZGVmIHN0cnVjdCBkaXJfc2xvdCB7CisJX191OCAgICBpZDsJCS8qIFNlcXVlbmNlIG51bWJlciBmb3Igc2xvdCAqLworCV9fdTggICAgbmFtZTBfNFsxMF07CS8qIEZpcnN0IDUgY2hhcmFjdGVycyBpbiBuYW1lICovCisJX191OCAgICBhdHRyOwkJLyogQXR0cmlidXRlIGJ5dGUgKi8KKwlfX3U4ICAgIHJlc2VydmVkOwkvKiBVbnVzZWQgKi8KKwlfX3U4ICAgIGFsaWFzX2NoZWNrc3VtOy8qIENoZWNrc3VtIGZvciA4LjMgYWxpYXMgKi8KKwlfX3U4ICAgIG5hbWU1XzEwWzEyXTsJLyogNiBtb3JlIGNoYXJhY3RlcnMgaW4gbmFtZSAqLworCV9fdTE2ICAgc3RhcnQ7CQkvKiBVbnVzZWQgKi8KKwlfX3U4ICAgIG5hbWUxMV8xMls0XTsJLyogTGFzdCAyIGNoYXJhY3RlcnMgaW4gbmFtZSAqLworfSBkaXJfc2xvdDsKKworLyogUHJpdmF0ZSBmaWxlc3lzdGVtIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQJZmF0c2l6ZTsJLyogU2l6ZSBvZiBGQVQgaW4gYml0cyAqLworCV9fdTE2CWZhdGxlbmd0aDsJLyogTGVuZ3RoIG9mIEZBVCBpbiBzZWN0b3JzICovCisJX191MTYJZmF0X3NlY3Q7CS8qIFN0YXJ0aW5nIHNlY3RvciBvZiB0aGUgRkFUICovCisJX191MTYJcm9vdGRpcl9zZWN0OwkvKiBTdGFydCBzZWN0b3Igb2Ygcm9vdCBkaXJlY3RvcnkgKi8KKwlfX3UxNgljbHVzdF9zaXplOwkvKiBTaXplIG9mIGNsdXN0ZXJzIGluIHNlY3RvcnMgKi8KKwlzaG9ydAlkYXRhX2JlZ2luOwkvKiBUaGUgc2VjdG9yIG9mIHRoZSBmaXJzdCBjbHVzdGVyLCBjYW4gYmUgbmVnYXRpdmUgKi8KKwlfX3UzMglmYXRidWZbRkFUQlVGU0laRV07IC8qIEN1cnJlbnQgRkFUIGJ1ZmZlciAqLworCWludAlmYXRidWZudW07CS8qIFVzZWQgYnkgZ2V0X2ZhdGVudCwgaW5pdCB0byAtMSAqLworfSBmc2RhdGE7CisKK3R5cGVkZWYgaW50CShmaWxlX2RldGVjdGZzX2Z1bmMpKHZvaWQpOwordHlwZWRlZiBpbnQJKGZpbGVfbHNfZnVuYykoY29uc3QgY2hhciAqZGlyKTsKK3R5cGVkZWYgbG9uZwkoZmlsZV9yZWFkX2Z1bmMpKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpidWZmZXIsCisJCQkJIHVuc2lnbmVkIGxvbmcgbWF4c2l6ZSk7CisKK3N0cnVjdCBmaWxlc3lzdGVtIHsKKwlmaWxlX2RldGVjdGZzX2Z1bmMgKmRldGVjdDsKKwlmaWxlX2xzX2Z1bmMJICAgKmxzOworCWZpbGVfcmVhZF9mdW5jCSAgICpyZWFkOworCWNvbnN0IGNoYXIJICAgIG5hbWVbMTJdOworfTsKKworLyogRkFUIHRhYmxlcyAqLworZmlsZV9kZXRlY3Rmc19mdW5jCWZpbGVfZmF0X2RldGVjdGZzOworZmlsZV9sc19mdW5jCQlmaWxlX2ZhdF9sczsKK2ZpbGVfcmVhZF9mdW5jCQlmaWxlX2ZhdF9yZWFkOworCisvKiBDdXJyZW50bHkgdGhpcyBkb2Vzbid0IGNoZWNrIGlmIHRoZSBkaXIgZXhpc3RzIG9yIGlzIHZhbGlkLi4uICovCitpbnQgZmlsZV9jZChjb25zdCBjaGFyICpwYXRoKTsKK2ludCBmaWxlX2ZhdF9kZXRlY3Rmcyh2b2lkKTsKK2ludCBmaWxlX2ZhdF9scyhjb25zdCBjaGFyICpkaXIpOworbG9uZyBmaWxlX2ZhdF9yZWFkKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbWF4c2l6ZSk7Citjb25zdCBjaGFyICpmaWxlX2dldGZzbmFtZShpbnQgaWR4KTsKK2ludCBmYXRfcmVnaXN0ZXJfZGV2aWNlKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjLCBpbnQgcGFydF9ubyk7CisKKyNlbmRpZiAvKiBfRkFUX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2lkZS5oIGIveC1sb2FkZXIvaW5jbHVkZS9pZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmVmMzJmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9pZGUuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYJX0lERV9ICisjZGVmaW5lIF9JREVfSAorCisjZGVmaW5lCUlERV9CVVMoZGV2KQkoZGV2ID4+IDEpCisKKyNpZmRlZiBDT05GSUdfSURFX0xFRAorCisvKgorICogTEVEIFBvcnQKKyAqLworI2RlZmluZQlMRURfUE9SVAkoKHVjaGFyICopKFBFUjhfQkFTRSArIDB4MzAwMCkpCisjZGVmaW5lIExFRF9JREUxCTB4MDEKKyNkZWZpbmUgTEVEX0lERTIJMHgwMgorI2RlZmluZQlERVZJQ0VfTEVEKGQpCSgoZCAmIDIpIHwgKChkICYgMikgPT0gMCkpIC8qIGRlcGVuZHMgb24gYml0IHBvc2l0aW9ucyEgKi8KKworI2VuZGlmIC8qIENPTkZJR19JREVfTEVEICovCisKKyNpZmRlZiBDRkdfNjRCSVRfTEJBCit0eXBlZGVmIHVpbnQ2NF90IGxiYWludF90OworI2Vsc2UKK3R5cGVkZWYgdWxvbmcgbGJhaW50X3Q7CisjZW5kaWYKKworLyoKKyAqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqLworCit2b2lkICBpZGVfaW5pdCAgKHZvaWQpOwordWxvbmcgaWRlX3JlYWQJKGludCBkZXZpY2UsIGxiYWludF90IGJsa25yLCB1bG9uZyBibGtjbnQsIHVsb25nICpidWZmZXIpOwordWxvbmcgaWRlX3dyaXRlIChpbnQgZGV2aWNlLCBsYmFpbnRfdCBibGtuciwgdWxvbmcgYmxrY250LCB1bG9uZyAqYnVmZmVyKTsKKworI2VuZGlmIC8qIF9JREVfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9pbWFnZS5oIGIveC1sb2FkZXIvaW5jbHVkZS9pbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNzhlOTAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2ltYWdlLmgKQEAgLTAsMCArMSw2NzkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDggU2VtaWhhbGYKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBhbiBpbnRlcmZhY2UgdG8gVS1Cb290LiBJbmNsdWRpbmcKKyAqIHRoaXMgKHVubW9kaWZpZWQpIGhlYWRlciBmaWxlIGluIGFub3RoZXIgZmlsZSBpcyBjb25zaWRlcmVkIG5vcm1hbAorICogdXNlIG9mIFUtQm9vdCwgYW5kIGRvZXMgKm5vdCogZmFsbCB1bmRlciB0aGUgaGVhZGluZyBvZiAiZGVyaXZlZAorICogd29yayIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fSU1BR0VfSF9fCisjZGVmaW5lIF9fSU1BR0VfSF9fCisKKyNpbmNsdWRlICJjb21waWxlci5oIgorCisjaWZkZWYgVVNFX0hPU1RDQworCisvKiBuZXcgdUltYWdlIGZvcm1hdCBzdXBwb3J0IGVuYWJsZWQgb24gaG9zdCAqLworI2RlZmluZSBDT05GSUdfRklUCQkxCisjZGVmaW5lIENPTkZJR19PRl9MSUJGRFQJMQorI2RlZmluZSBDT05GSUdfRklUX1ZFUkJPU0UJMSAvKiBlbmFibGUgZml0X2Zvcm1hdF97ZXJyb3Isd2FybmluZ30oKSAqLworCisjZWxzZQorCisjaW5jbHVkZSA8Y29tbWFuZC5oPgorCisjZW5kaWYgLyogVVNFX0hPU1RDQyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorI2luY2x1ZGUgPGZkdC5oPgorI2luY2x1ZGUgPGxpYmZkdC5oPgorI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CisjZGVmaW5lIENPTkZJR19NRDUJCS8qIEZJVCBpbWFnZXMgbmVlZCBNRDUgc3VwcG9ydCAqLworI2RlZmluZSBDT05GSUdfU0hBMQkJLyogYW5kIFNIQTEgKi8KKyNlbmRpZgorCisvKgorICogT3BlcmF0aW5nIFN5c3RlbSBDb2RlcworICovCisjZGVmaW5lIElIX09TX0lOVkFMSUQJCTAJLyogSW52YWxpZCBPUwkqLworI2RlZmluZSBJSF9PU19PUEVOQlNECQkxCS8qIE9wZW5CU0QJKi8KKyNkZWZpbmUgSUhfT1NfTkVUQlNECQkyCS8qIE5ldEJTRAkqLworI2RlZmluZSBJSF9PU19GUkVFQlNECQkzCS8qIEZyZWVCU0QJKi8KKyNkZWZpbmUgSUhfT1NfNF80QlNECQk0CS8qIDQuNEJTRAkqLworI2RlZmluZSBJSF9PU19MSU5VWAkJNQkvKiBMaW51eAkqLworI2RlZmluZSBJSF9PU19TVlI0CQk2CS8qIFNWUjQJCSovCisjZGVmaW5lIElIX09TX0VTSVgJCTcJLyogRXNpeAkJKi8KKyNkZWZpbmUgSUhfT1NfU09MQVJJUwkJOAkvKiBTb2xhcmlzCSovCisjZGVmaW5lIElIX09TX0lSSVgJCTkJLyogSXJpeAkJKi8KKyNkZWZpbmUgSUhfT1NfU0NPCQkxMAkvKiBTQ08JCSovCisjZGVmaW5lIElIX09TX0RFTEwJCTExCS8qIERlbGwJCSovCisjZGVmaW5lIElIX09TX05DUgkJMTIJLyogTkNSCQkqLworI2RlZmluZSBJSF9PU19MWU5YT1MJCTEzCS8qIEx5bnhPUwkqLworI2RlZmluZSBJSF9PU19WWFdPUktTCQkxNAkvKiBWeFdvcmtzCSovCisjZGVmaW5lIElIX09TX1BTT1MJCTE1CS8qIHBTT1MJCSovCisjZGVmaW5lIElIX09TX1FOWAkJMTYJLyogUU5YCQkqLworI2RlZmluZSBJSF9PU19VX0JPT1QJCTE3CS8qIEZpcm13YXJlCSovCisjZGVmaW5lIElIX09TX1JURU1TCQkxOAkvKiBSVEVNUwkqLworI2RlZmluZSBJSF9PU19BUlRPUwkJMTkJLyogQVJUT1MJKi8KKyNkZWZpbmUgSUhfT1NfVU5JVFkJCTIwCS8qIFVuaXR5IE9TCSovCisjZGVmaW5lIElIX09TX0lOVEVHUklUWQkJMjEJLyogSU5URUdSSVRZCSovCisKKy8qCisgKiBDUFUgQXJjaGl0ZWN0dXJlIENvZGVzIChzdXBwb3J0ZWQgYnkgTGludXgpCisgKi8KKyNkZWZpbmUgSUhfQVJDSF9JTlZBTElECQkwCS8qIEludmFsaWQgQ1BVCSovCisjZGVmaW5lIElIX0FSQ0hfQUxQSEEJCTEJLyogQWxwaGEJKi8KKyNkZWZpbmUgSUhfQVJDSF9BUk0JCTIJLyogQVJNCQkqLworI2RlZmluZSBJSF9BUkNIX0kzODYJCTMJLyogSW50ZWwgeDg2CSovCisjZGVmaW5lIElIX0FSQ0hfSUE2NAkJNAkvKiBJQTY0CQkqLworI2RlZmluZSBJSF9BUkNIX01JUFMJCTUJLyogTUlQUwkJKi8KKyNkZWZpbmUgSUhfQVJDSF9NSVBTNjQJCTYJLyogTUlQUwkgNjQgQml0ICovCisjZGVmaW5lIElIX0FSQ0hfUFBDCQk3CS8qIFBvd2VyUEMJKi8KKyNkZWZpbmUgSUhfQVJDSF9TMzkwCQk4CS8qIElCTSBTMzkwCSovCisjZGVmaW5lIElIX0FSQ0hfU0gJCTkJLyogU3VwZXJICSovCisjZGVmaW5lIElIX0FSQ0hfU1BBUkMJCTEwCS8qIFNwYXJjCSovCisjZGVmaW5lIElIX0FSQ0hfU1BBUkM2NAkJMTEJLyogU3BhcmMgNjQgQml0ICovCisjZGVmaW5lIElIX0FSQ0hfTTY4SwkJMTIJLyogTTY4SwkJKi8KKyNkZWZpbmUgSUhfQVJDSF9NSUNST0JMQVpFCTE0CS8qIE1pY3JvQmxhemUgICAqLworI2RlZmluZSBJSF9BUkNIX05JT1MyCQkxNQkvKiBOaW9zLUlJCSovCisjZGVmaW5lIElIX0FSQ0hfQkxBQ0tGSU4JMTYJLyogQmxhY2tmaW4JKi8KKyNkZWZpbmUgSUhfQVJDSF9BVlIzMgkJMTcJLyogQVZSMzIJKi8KKyNkZWZpbmUgSUhfQVJDSF9TVDIwMAkgICAgICAgIDE4CS8qIFNUTWljcm9lbGVjdHJvbmljcyBTVDIwMCAgKi8KKworLyoKKyAqIEltYWdlIFR5cGVzCisgKgorICogIlN0YW5kYWxvbmUgUHJvZ3JhbXMiIGFyZSBkaXJlY3RseSBydW5uYWJsZSBpbiB0aGUgZW52aXJvbm1lbnQKKyAqCXByb3ZpZGVkIGJ5IFUtQm9vdDsgaXQgaXMgZXhwZWN0ZWQgdGhhdCAoaWYgdGhleSBiZWhhdmUKKyAqCXdlbGwpIHlvdSBjYW4gY29udGludWUgdG8gd29yayBpbiBVLUJvb3QgYWZ0ZXIgcmV0dXJuIGZyb20KKyAqCXRoZSBTdGFuZGFsb25lIFByb2dyYW0uCisgKiAiT1MgS2VybmVsIEltYWdlcyIgYXJlIHVzdWFsbHkgaW1hZ2VzIG9mIHNvbWUgRW1iZWRkZWQgT1Mgd2hpY2gKKyAqCXdpbGwgdGFrZSBvdmVyIGNvbnRyb2wgY29tcGxldGVseS4gVXN1YWxseSB0aGVzZSBwcm9ncmFtcworICoJd2lsbCBpbnN0YWxsIHRoZWlyIG93biBzZXQgb2YgZXhjZXB0aW9uIGhhbmRsZXJzLCBkZXZpY2UKKyAqCWRyaXZlcnMsIHNldCB1cCB0aGUgTU1VLCBldGMuIC0gdGhpcyBtZWFucywgdGhhdCB5b3UgY2Fubm90CisgKglleHBlY3QgdG8gcmUtZW50ZXIgVS1Cb290IGV4Y2VwdCBieSByZXNldHRpbmcgdGhlIENQVS4KKyAqICJSQU1EaXNrIEltYWdlcyIgYXJlIG1vcmUgb3IgbGVzcyBqdXN0IGRhdGEgYmxvY2tzLCBhbmQgdGhlaXIKKyAqCXBhcmFtZXRlcnMgKGFkZHJlc3MsIHNpemUpIGFyZSBwYXNzZWQgdG8gYW4gT1Mga2VybmVsIHRoYXQgaXMKKyAqCWJlaW5nIHN0YXJ0ZWQuCisgKiAiTXVsdGktRmlsZSBJbWFnZXMiIGNvbnRhaW4gc2V2ZXJhbCBpbWFnZXMsIHR5cGljYWxseSBhbiBPUworICoJKExpbnV4KSBrZXJuZWwgaW1hZ2UgYW5kIG9uZSBvciBtb3JlIGRhdGEgaW1hZ2VzIGxpa2UKKyAqCVJBTURpc2tzLiBUaGlzIGNvbnN0cnVjdCBpcyB1c2VmdWwgZm9yIGluc3RhbmNlIHdoZW4geW91IHdhbnQKKyAqCXRvIGJvb3Qgb3ZlciB0aGUgbmV0d29yayB1c2luZyBCT09UUCBldGMuLCB3aGVyZSB0aGUgYm9vdAorICoJc2VydmVyIHByb3ZpZGVzIGp1c3QgYSBzaW5nbGUgaW1hZ2UgZmlsZSwgYnV0IHlvdSB3YW50IHRvIGdldAorICoJZm9yIGluc3RhbmNlIGFuIE9TIGtlcm5lbCBhbmQgYSBSQU1EaXNrIGltYWdlLgorICoKKyAqCSJNdWx0aS1GaWxlIEltYWdlcyIgc3RhcnQgd2l0aCBhIGxpc3Qgb2YgaW1hZ2Ugc2l6ZXMsIGVhY2gKKyAqCWltYWdlIHNpemUgKGluIGJ5dGVzKSBzcGVjaWZpZWQgYnkgYW4gInVpbnQzMl90IiBpbiBuZXR3b3JrCisgKglieXRlIG9yZGVyLiBUaGlzIGxpc3QgaXMgdGVybWluYXRlZCBieSBhbiAiKHVpbnQzMl90KTAiLgorICoJSW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRlcm1pbmF0aW5nIDAgZm9sbG93IHRoZSBpbWFnZXMsIG9uZSBieQorICoJb25lLCBhbGwgYWxpZ25lZCBvbiAidWludDMyX3QiIGJvdW5kYXJpZXMgKHNpemUgcm91bmRlZCB1cCB0bworICoJYSBtdWx0aXBsZSBvZiA0IGJ5dGVzIC0gZXhjZXB0IGZvciB0aGUgbGFzdCBmaWxlKS4KKyAqCisgKiAiRmlybXdhcmUgSW1hZ2VzIiBhcmUgYmluYXJ5IGltYWdlcyBjb250YWluaW5nIGZpcm13YXJlIChsaWtlCisgKglVLUJvb3Qgb3IgRlBHQSBpbWFnZXMpIHdoaWNoIHVzdWFsbHkgd2lsbCBiZSBwcm9ncmFtbWVkIHRvCisgKglmbGFzaCBtZW1vcnkuCisgKgorICogIlNjcmlwdCBmaWxlcyIgYXJlIGNvbW1hbmQgc2VxdWVuY2VzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieQorICoJVS1Cb290J3MgY29tbWFuZCBpbnRlcnByZXRlcjsgdGhpcyBmZWF0dXJlIGlzIGVzcGVjaWFsbHkKKyAqCXVzZWZ1bCB3aGVuIHlvdSBjb25maWd1cmUgVS1Cb290IHRvIHVzZSBhIHJlYWwgc2hlbGwgKGh1c2gpCisgKglhcyBjb21tYW5kIGludGVycHJldGVyICg9PiBTaGVsbCBTY3JpcHRzKS4KKyAqLworCisjZGVmaW5lIElIX1RZUEVfSU5WQUxJRAkJMAkvKiBJbnZhbGlkIEltYWdlCQkqLworI2RlZmluZSBJSF9UWVBFX1NUQU5EQUxPTkUJMQkvKiBTdGFuZGFsb25lIFByb2dyYW0JCSovCisjZGVmaW5lIElIX1RZUEVfS0VSTkVMCQkyCS8qIE9TIEtlcm5lbCBJbWFnZQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9SQU1ESVNLCQkzCS8qIFJBTURpc2sgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfTVVMVEkJCTQJLyogTXVsdGktRmlsZSBJbWFnZQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9GSVJNV0FSRQk1CS8qIEZpcm13YXJlIEltYWdlCQkqLworI2RlZmluZSBJSF9UWVBFX1NDUklQVAkJNgkvKiBTY3JpcHQgZmlsZQkJCSovCisjZGVmaW5lIElIX1RZUEVfRklMRVNZU1RFTQk3CS8qIEZpbGVzeXN0ZW0gSW1hZ2UgKGFueSB0eXBlKQkqLworI2RlZmluZSBJSF9UWVBFX0ZMQVREVAkJOAkvKiBCaW5hcnkgRmxhdCBEZXZpY2UgVHJlZSBCbG9iCSovCisjZGVmaW5lIElIX1RZUEVfS1dCSU1BR0UJOQkvKiBLaXJrd29vZCBCb290IEltYWdlCQkqLworI2RlZmluZSBJSF9UWVBFX0lNWElNQUdFCTEwCS8qIEZyZWVzY2FsZSBJTVhCb290IEltYWdlCSovCisKKy8qCisgKiBDb21wcmVzc2lvbiBUeXBlcworICovCisjZGVmaW5lIElIX0NPTVBfTk9ORQkJMAkvKiAgTm8JIENvbXByZXNzaW9uIFVzZWQJKi8KKyNkZWZpbmUgSUhfQ09NUF9HWklQCQkxCS8qIGd6aXAJIENvbXByZXNzaW9uIFVzZWQJKi8KKyNkZWZpbmUgSUhfQ09NUF9CWklQMgkJMgkvKiBiemlwMiBDb21wcmVzc2lvbiBVc2VkCSovCisjZGVmaW5lIElIX0NPTVBfTFpNQQkJMwkvKiBsem1hICBDb21wcmVzc2lvbiBVc2VkCSovCisjZGVmaW5lIElIX0NPTVBfTFpPCQk0CS8qIGx6byAgIENvbXByZXNzaW9uIFVzZWQJKi8KKworI2RlZmluZSBJSF9NQUdJQwkweDI3MDUxOTU2CS8qIEltYWdlIE1hZ2ljIE51bWJlcgkJKi8KKyNkZWZpbmUgSUhfTk1MRU4JCTMyCS8qIEltYWdlIE5hbWUgTGVuZ3RoCQkqLworCisvKgorICogTGVnYWN5IGZvcm1hdCBpbWFnZSBoZWFkZXIsCisgKiBhbGwgZGF0YSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGFrYSBuYXR1cmFsIGFrYSBiaWdlbmRpYW4pLgorICovCit0eXBlZGVmIHN0cnVjdCBpbWFnZV9oZWFkZXIgeworCXVpbnQzMl90CWloX21hZ2ljOwkvKiBJbWFnZSBIZWFkZXIgTWFnaWMgTnVtYmVyCSovCisJdWludDMyX3QJaWhfaGNyYzsJLyogSW1hZ2UgSGVhZGVyIENSQyBDaGVja3N1bQkqLworCXVpbnQzMl90CWloX3RpbWU7CS8qIEltYWdlIENyZWF0aW9uIFRpbWVzdGFtcAkqLworCXVpbnQzMl90CWloX3NpemU7CS8qIEltYWdlIERhdGEgU2l6ZQkJKi8KKwl1aW50MzJfdAlpaF9sb2FkOwkvKiBEYXRhCSBMb2FkICBBZGRyZXNzCQkqLworCXVpbnQzMl90CWloX2VwOwkJLyogRW50cnkgUG9pbnQgQWRkcmVzcwkJKi8KKwl1aW50MzJfdAlpaF9kY3JjOwkvKiBJbWFnZSBEYXRhIENSQyBDaGVja3N1bQkqLworCXVpbnQ4X3QJCWloX29zOwkJLyogT3BlcmF0aW5nIFN5c3RlbQkJKi8KKwl1aW50OF90CQlpaF9hcmNoOwkvKiBDUFUgYXJjaGl0ZWN0dXJlCQkqLworCXVpbnQ4X3QJCWloX3R5cGU7CS8qIEltYWdlIFR5cGUJCQkqLworCXVpbnQ4X3QJCWloX2NvbXA7CS8qIENvbXByZXNzaW9uIFR5cGUJCSovCisJdWludDhfdAkJaWhfbmFtZVtJSF9OTUxFTl07CS8qIEltYWdlIE5hbWUJCSovCit9IGltYWdlX2hlYWRlcl90OworCit0eXBlZGVmIHN0cnVjdCBpbWFnZV9pbmZvIHsKKwl1bG9uZwkJc3RhcnQsIGVuZDsJCS8qIHN0YXJ0L2VuZCBvZiBibG9iICovCisJdWxvbmcJCWltYWdlX3N0YXJ0LCBpbWFnZV9sZW47IC8qIHN0YXJ0IG9mIGltYWdlIHdpdGhpbiBibG9iLCBsZW4gb2YgaW1hZ2UgKi8KKwl1bG9uZwkJbG9hZDsJCQkvKiBsb2FkIGFkZHIgZm9yIHRoZSBpbWFnZSAqLworCXVpbnQ4X3QJCWNvbXAsIHR5cGUsIG9zOwkJLyogY29tcHJlc3Npb24sIHR5cGUgb2YgaW1hZ2UsIG9zIHR5cGUgKi8KK30gaW1hZ2VfaW5mb190OworCisvKgorICogTGVnYWN5IGFuZCBGSVQgZm9ybWF0IGhlYWRlcnMgdXNlZCBieSBkb19ib290bSgpIGFuZCBkb19ib290bV88b3M+KCkKKyAqIHJvdXRpbmVzLgorICovCitzdHJ1Y3QgYmQ7CisKK3R5cGVkZWYgc3RydWN0IGJvb3RtX2hlYWRlcnMgeworCS8qCisJICogTGVnYWN5IG9zIGltYWdlIGhlYWRlciwgaWYgaXQgaXMgYSBtdWx0aSBjb21wb25lbnQgaW1hZ2UKKwkgKiB0aGVuIGJvb3RfZ2V0X3JhbWRpc2soKSBhbmQgZ2V0X2ZkdCgpIHdpbGwgYXR0ZW1wdCB0byBnZXQKKwkgKiBkYXRhIGZyb20gc2Vjb25kIGFuZCB0aGlyZCBjb21wb25lbnQgYWNjb3JkaW5nbHkuCisJICovCisJaW1hZ2VfaGVhZGVyX3QJKmxlZ2FjeV9oZHJfb3M7CQkvKiBpbWFnZSBoZWFkZXIgcG9pbnRlciAqLworCWltYWdlX2hlYWRlcl90CWxlZ2FjeV9oZHJfb3NfY29weTsJLyogaGVhZGVyIGNvcHkgKi8KKwl1bG9uZwkJbGVnYWN5X2hkcl92YWxpZDsKKworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKwljb25zdCBjaGFyCSpmaXRfdW5hbWVfY2ZnOwkvKiBjb25maWd1cmF0aW9uIG5vZGUgdW5pdCBuYW1lICovCisKKwl2b2lkCQkqZml0X2hkcl9vczsJLyogb3MgRklUIGltYWdlIGhlYWRlciAqLworCWNvbnN0IGNoYXIJKmZpdF91bmFtZV9vczsJLyogb3Mgc3ViaW1hZ2Ugbm9kZSB1bml0IG5hbWUgKi8KKwlpbnQJCWZpdF9ub2Zmc2V0X29zOwkvKiBvcyBzdWJpbWFnZSBub2RlIG9mZnNldCAqLworCisJdm9pZAkJKmZpdF9oZHJfcmQ7CS8qIGluaXQgcmFtZGlzayBGSVQgaW1hZ2UgaGVhZGVyICovCisJY29uc3QgY2hhcgkqZml0X3VuYW1lX3JkOwkvKiBpbml0IHJhbWRpc2sgc3ViaW1hZ2Ugbm9kZSB1bml0IG5hbWUgKi8KKwlpbnQJCWZpdF9ub2Zmc2V0X3JkOwkvKiBpbml0IHJhbWRpc2sgc3ViaW1hZ2Ugbm9kZSBvZmZzZXQgKi8KKworCXZvaWQJCSpmaXRfaGRyX2ZkdDsJLyogRkRUIGJsb2IgRklUIGltYWdlIGhlYWRlciAqLworCWNvbnN0IGNoYXIJKmZpdF91bmFtZV9mZHQ7CS8qIEZEVCBibG9iIHN1YmltYWdlIG5vZGUgdW5pdCBuYW1lICovCisJaW50CQlmaXRfbm9mZnNldF9mZHQ7LyogRkRUIGJsb2Igc3ViaW1hZ2Ugbm9kZSBvZmZzZXQgKi8KKyNlbmRpZgorCisjaWZuZGVmIFVTRV9IT1NUQ0MKKwlpbWFnZV9pbmZvX3QJb3M7CQkvKiBvcyBpbWFnZSBpbmZvICovCisJdWxvbmcJCWVwOwkJLyogZW50cnkgcG9pbnQgb2YgT1MgKi8KKworCXVsb25nCQlyZF9zdGFydCwgcmRfZW5kOy8qIHJhbWRpc2sgc3RhcnQvZW5kICovCisKKyNpZmRlZiBDT05GSUdfT0ZfTElCRkRUCisJY2hhcgkJKmZ0X2FkZHI7CS8qIGZsYXQgZGV2IHRyZWUgYWRkcmVzcyAqLworI2VuZGlmCisJdWxvbmcJCWZ0X2xlbjsJCS8qIGxlbmd0aCBvZiBmbGF0IGRldmljZSB0cmVlICovCisKKwl1bG9uZwkJaW5pdHJkX3N0YXJ0OworCXVsb25nCQlpbml0cmRfZW5kOworCXVsb25nCQljbWRsaW5lX3N0YXJ0OworCXVsb25nCQljbWRsaW5lX2VuZDsKKwlzdHJ1Y3QgYmQJKmtiZDsKKyNlbmRpZgorCisJaW50CQl2ZXJpZnk7CQkvKiBnZXRlbnYoInZlcmlmeSIpWzBdICE9ICduJyAqLworCisjZGVmaW5lCUJPT1RNX1NUQVRFX1NUQVJUCSgweDAwMDAwMDAxKQorI2RlZmluZQlCT09UTV9TVEFURV9MT0FET1MJKDB4MDAwMDAwMDIpCisjZGVmaW5lCUJPT1RNX1NUQVRFX1JBTURJU0sJKDB4MDAwMDAwMDQpCisjZGVmaW5lCUJPT1RNX1NUQVRFX0ZEVAkJKDB4MDAwMDAwMDgpCisjZGVmaW5lCUJPT1RNX1NUQVRFX09TX0NNRExJTkUJKDB4MDAwMDAwMTApCisjZGVmaW5lCUJPT1RNX1NUQVRFX09TX0JEX1QJKDB4MDAwMDAwMjApCisjZGVmaW5lCUJPT1RNX1NUQVRFX09TX1BSRVAJKDB4MDAwMDAwNDApCisjZGVmaW5lCUJPT1RNX1NUQVRFX09TX0dPCSgweDAwMDAwMDgwKQorCWludAkJc3RhdGU7CisKKyNpZmRlZiBDT05GSUdfTE1CCisJc3RydWN0IGxtYglsbWI7CQkvKiBmb3IgbWVtb3J5IG1nbXQgKi8KKyNlbmRpZgorfSBib290bV9oZWFkZXJzX3Q7CisKKy8qCisgKiBTb21lIHN5c3RlbXMgKGZvciBleGFtcGxlIExXTU9OKSBoYXZlIHZlcnkgc2hvcnQgd2F0Y2hkb2cgcGVyaW9kczsKKyAqIHdlIG11c3QgbWFrZSBzdXJlIHRvIHNwbGl0IGxvbmcgb3BlcmF0aW9ucyBsaWtlIG1lbW1vdmUoKSBvcgorICogY2hlY2tzdW0gY2FsY3VsYXRpb25zIGludG8gcmVhc29uYWJsZSBjaHVua3MuCisgKi8KKyNpZm5kZWYgQ0hVTktTWgorI2RlZmluZSBDSFVOS1NaICg2NCAqIDEwMjQpCisjZW5kaWYKKworI2lmbmRlZiBDSFVOS1NaX0NSQzMyCisjZGVmaW5lIENIVU5LU1pfQ1JDMzIgKDY0ICogMTAyNCkKKyNlbmRpZgorCisjaWZuZGVmIENIVU5LU1pfTUQ1CisjZGVmaW5lIENIVU5LU1pfTUQ1ICg2NCAqIDEwMjQpCisjZW5kaWYKKworI2lmbmRlZiBDSFVOS1NaX1NIQTEKKyNkZWZpbmUgQ0hVTktTWl9TSEExICg2NCAqIDEwMjQpCisjZW5kaWYKKworI2RlZmluZSB1aW1hZ2VfdG9fY3B1KHgpCQliZTMyX3RvX2NwdSh4KQorI2RlZmluZSBjcHVfdG9fdWltYWdlKHgpCQljcHVfdG9fYmUzMih4KQorCisvKgorICogVHJhbnNsYXRpb24gdGFibGUgZm9yIGVudHJpZXMgb2YgYSBzcGVjaWZpYyB0eXBlOyB1c2VkIGJ5CisgKiBnZXRfdGFibGVfZW50cnlfaWQoKSBhbmQgZ2V0X3RhYmxlX2VudHJ5X25hbWUoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgdGFibGVfZW50cnkgeworCWludAlpZDsKKwljaGFyCSpzbmFtZTsJCS8qIHNob3J0IChpbnB1dCkgbmFtZSB0byBmaW5kIHRhYmxlIGVudHJ5ICovCisJY2hhcgkqbG5hbWU7CQkvKiBsb25nIChvdXRwdXQpIG5hbWUgdG8gcHJpbnQgZm9yIG1lc3NhZ2VzICovCit9IHRhYmxlX2VudHJ5X3Q7CisKKy8qCisgKiBnZXRfdGFibGVfZW50cnlfaWQoKSBzY2FucyB0aGUgdHJhbnNsYXRpb24gdGFibGUgdHJ5aW5nIHRvIGZpbmQgYW4KKyAqIGVudHJ5IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc2hvcnQgbmFtZS4gSWYgYSBtYXRjaGluZyBlbnRyeSBpcworICogZm91bmQsIGl0J3MgaWQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqLworaW50IGdldF90YWJsZV9lbnRyeV9pZCAodGFibGVfZW50cnlfdCAqdGFibGUsCisJCWNvbnN0IGNoYXIgKnRhYmxlX25hbWUsIGNvbnN0IGNoYXIgKm5hbWUpOworLyoKKyAqIGdldF90YWJsZV9lbnRyeV9uYW1lKCkgc2NhbnMgdGhlIHRyYW5zbGF0aW9uIHRhYmxlIHRyeWluZyB0byBmaW5kCisgKiBhbiBlbnRyeSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGlkLiBJZiBhIG1hdGNoaW5nIGVudHJ5IGlzIGZvdW5kLAorICogaXRzIGxvbmcgbmFtZSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICovCitjaGFyICpnZXRfdGFibGVfZW50cnlfbmFtZSAodGFibGVfZW50cnlfdCAqdGFibGUsIGNoYXIgKm1zZywgaW50IGlkKTsKKworY29uc3QgY2hhciAqZ2VuaW1nX2dldF9vc19uYW1lICh1aW50OF90IG9zKTsKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfYXJjaF9uYW1lICh1aW50OF90IGFyY2gpOworY29uc3QgY2hhciAqZ2VuaW1nX2dldF90eXBlX25hbWUgKHVpbnQ4X3QgdHlwZSk7Citjb25zdCBjaGFyICpnZW5pbWdfZ2V0X2NvbXBfbmFtZSAodWludDhfdCBjb21wKTsKK2ludCBnZW5pbWdfZ2V0X29zX2lkIChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBnZW5pbWdfZ2V0X2FyY2hfaWQgKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGdlbmltZ19nZXRfdHlwZV9pZCAoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZ2VuaW1nX2dldF9jb21wX2lkIChjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgZ2VuaW1nX3ByaW50X3NpemUgKHVpbnQzMl90IHNpemUpOworCisjaWZuZGVmIFVTRV9IT1NUQ0MKKy8qIEltYWdlIGZvcm1hdCB0eXBlcywgcmV0dXJuZWQgYnkgX2dldF9mb3JtYXQoKSByb3V0aW5lICovCisjZGVmaW5lIElNQUdFX0ZPUk1BVF9JTlZBTElECTB4MDAKKyNkZWZpbmUgSU1BR0VfRk9STUFUX0xFR0FDWQkweDAxCS8qIGxlZ2FjeSBpbWFnZV9oZWFkZXIgYmFzZWQgZm9ybWF0ICovCisjZGVmaW5lIElNQUdFX0ZPUk1BVF9GSVQJMHgwMgkvKiBuZXcsIGxpYmZkdCBiYXNlZCBmb3JtYXQgKi8KKworaW50IGdlbmltZ19nZXRfZm9ybWF0ICh2b2lkICppbWdfYWRkcik7CitpbnQgZ2VuaW1nX2hhc19jb25maWcgKGJvb3RtX2hlYWRlcnNfdCAqaW1hZ2VzKTsKK3Vsb25nIGdlbmltZ19nZXRfaW1hZ2UgKHVsb25nIGltZ19hZGRyKTsKKworaW50IGJvb3RfZ2V0X3JhbWRpc2sgKGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdLCBib290bV9oZWFkZXJzX3QgKmltYWdlcywKKwkJdWludDhfdCBhcmNoLCB1bG9uZyAqcmRfc3RhcnQsIHVsb25nICpyZF9lbmQpOworCisKKyNpZmRlZiBDT05GSUdfT0ZfTElCRkRUCitpbnQgYm9vdF9nZXRfZmR0IChpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10sIGJvb3RtX2hlYWRlcnNfdCAqaW1hZ2VzLAorCQljaGFyICoqb2ZfZmxhdF90cmVlLCB1bG9uZyAqb2Zfc2l6ZSk7CitpbnQgYm9vdF9yZWxvY2F0ZV9mZHQgKHN0cnVjdCBsbWIgKmxtYiwgdWxvbmcgYm9vdG1hcF9iYXNlLAorCQljaGFyICoqb2ZfZmxhdF90cmVlLCB1bG9uZyAqb2Zfc2l6ZSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1BQQykgfHwgZGVmaW5lZChDT05GSUdfTTY4SykKK2ludCBib290X3JhbWRpc2tfaGlnaCAoc3RydWN0IGxtYiAqbG1iLCB1bG9uZyByZF9kYXRhLCB1bG9uZyByZF9sZW4sCisJCSAgdWxvbmcgKmluaXRyZF9zdGFydCwgdWxvbmcgKmluaXRyZF9lbmQpOworCitpbnQgYm9vdF9nZXRfY21kbGluZSAoc3RydWN0IGxtYiAqbG1iLCB1bG9uZyAqY21kX3N0YXJ0LCB1bG9uZyAqY21kX2VuZCwKKwkJCXVsb25nIGJvb3RtYXBfYmFzZSk7CitpbnQgYm9vdF9nZXRfa2JkIChzdHJ1Y3QgbG1iICpsbWIsIGJkX3QgKiprYmQsIHVsb25nIGJvb3RtYXBfYmFzZSk7CisjZW5kaWYgLyogQ09ORklHX1BQQyB8fCBDT05GSUdfTTY4SyAqLworI2VuZGlmIC8qICFVU0VfSE9TVENDICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTGVnYWN5IGZvcm1hdCBzcGVjaWZpYyBjb2RlIChwcmVmaXhlZCB3aXRoIGltYWdlXykgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBpbWFnZV9nZXRfaGVhZGVyX3NpemUgKHZvaWQpCit7CisJcmV0dXJuIChzaXplb2YgKGltYWdlX2hlYWRlcl90KSk7Cit9CisKKyNkZWZpbmUgaW1hZ2VfZ2V0X2hkcl9sKGYpIFwKKwlzdGF0aWMgaW5saW5lIHVpbnQzMl90IGltYWdlX2dldF8jI2YoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikgXAorCXsgXAorCQlyZXR1cm4gdWltYWdlX3RvX2NwdSAoaGRyLT5paF8jI2YpOyBcCisJfQoraW1hZ2VfZ2V0X2hkcl9sIChtYWdpYykJCS8qIGltYWdlX2dldF9tYWdpYyAqLworaW1hZ2VfZ2V0X2hkcl9sIChoY3JjKQkJLyogaW1hZ2VfZ2V0X2hjcmMgKi8KK2ltYWdlX2dldF9oZHJfbCAodGltZSkJCS8qIGltYWdlX2dldF90aW1lICovCitpbWFnZV9nZXRfaGRyX2wgKHNpemUpCQkvKiBpbWFnZV9nZXRfc2l6ZSAqLworaW1hZ2VfZ2V0X2hkcl9sIChsb2FkKQkJLyogaW1hZ2VfZ2V0X2xvYWQgKi8KK2ltYWdlX2dldF9oZHJfbCAoZXApCQkvKiBpbWFnZV9nZXRfZXAgKi8KK2ltYWdlX2dldF9oZHJfbCAoZGNyYykJCS8qIGltYWdlX2dldF9kY3JjICovCisKKyNkZWZpbmUgaW1hZ2VfZ2V0X2hkcl9iKGYpIFwKKwlzdGF0aWMgaW5saW5lIHVpbnQ4X3QgaW1hZ2VfZ2V0XyMjZihjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKSBcCisJeyBcCisJCXJldHVybiBoZHItPmloXyMjZjsgXAorCX0KK2ltYWdlX2dldF9oZHJfYiAob3MpCQkvKiBpbWFnZV9nZXRfb3MgKi8KK2ltYWdlX2dldF9oZHJfYiAoYXJjaCkJCS8qIGltYWdlX2dldF9hcmNoICovCitpbWFnZV9nZXRfaGRyX2IgKHR5cGUpCQkvKiBpbWFnZV9nZXRfdHlwZSAqLworaW1hZ2VfZ2V0X2hkcl9iIChjb21wKQkJLyogaW1hZ2VfZ2V0X2NvbXAgKi8KKworc3RhdGljIGlubGluZSBjaGFyICppbWFnZV9nZXRfbmFtZSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwlyZXR1cm4gKGNoYXIgKiloZHItPmloX25hbWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgaW1hZ2VfZ2V0X2RhdGFfc2l6ZSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwlyZXR1cm4gaW1hZ2VfZ2V0X3NpemUgKGhkcik7Cit9CisKKy8qKgorICogaW1hZ2VfZ2V0X2RhdGEgLSBnZXQgaW1hZ2UgcGF5bG9hZCBzdGFydCBhZGRyZXNzCisgKiBAaGRyOiBpbWFnZSBoZWFkZXIKKyAqCisgKiBpbWFnZV9nZXRfZGF0YSgpIHJldHVybnMgYWRkcmVzcyBvZiB0aGUgaW1hZ2UgcGF5bG9hZC4gRm9yIHNpbmdsZQorICogY29tcG9uZW50IGltYWdlcyBpdCBpcyBpbWFnZSBkYXRhIHN0YXJ0LiBGb3IgbXVsdGkgY29tcG9uZW50CisgKiBpbWFnZXMgaXQgcG9pbnRzIHRvIHRoZSBudWxsIHRlcm1pbmF0ZWQgdGFibGUgb2Ygc3ViLWltYWdlcyBzaXplcy4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGltYWdlIHBheWxvYWQgZGF0YSBzdGFydCBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgdWxvbmcgaW1hZ2VfZ2V0X2RhdGEgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJcmV0dXJuICgodWxvbmcpaGRyICsgaW1hZ2VfZ2V0X2hlYWRlcl9zaXplICgpKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBpbWFnZV9nZXRfaW1hZ2Vfc2l6ZSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwlyZXR1cm4gKGltYWdlX2dldF9zaXplIChoZHIpICsgaW1hZ2VfZ2V0X2hlYWRlcl9zaXplICgpKTsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgaW1hZ2VfZ2V0X2ltYWdlX2VuZCAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwlyZXR1cm4gKCh1bG9uZyloZHIgKyBpbWFnZV9nZXRfaW1hZ2Vfc2l6ZSAoaGRyKSk7Cit9CisKKyNkZWZpbmUgaW1hZ2Vfc2V0X2hkcl9sKGYpIFwKKwlzdGF0aWMgaW5saW5lIHZvaWQgaW1hZ2Vfc2V0XyMjZihpbWFnZV9oZWFkZXJfdCAqaGRyLCB1aW50MzJfdCB2YWwpIFwKKwl7IFwKKwkJaGRyLT5paF8jI2YgPSBjcHVfdG9fdWltYWdlICh2YWwpOyBcCisJfQoraW1hZ2Vfc2V0X2hkcl9sIChtYWdpYykJCS8qIGltYWdlX3NldF9tYWdpYyAqLworaW1hZ2Vfc2V0X2hkcl9sIChoY3JjKQkJLyogaW1hZ2Vfc2V0X2hjcmMgKi8KK2ltYWdlX3NldF9oZHJfbCAodGltZSkJCS8qIGltYWdlX3NldF90aW1lICovCitpbWFnZV9zZXRfaGRyX2wgKHNpemUpCQkvKiBpbWFnZV9zZXRfc2l6ZSAqLworaW1hZ2Vfc2V0X2hkcl9sIChsb2FkKQkJLyogaW1hZ2Vfc2V0X2xvYWQgKi8KK2ltYWdlX3NldF9oZHJfbCAoZXApCQkvKiBpbWFnZV9zZXRfZXAgKi8KK2ltYWdlX3NldF9oZHJfbCAoZGNyYykJCS8qIGltYWdlX3NldF9kY3JjICovCisKKyNkZWZpbmUgaW1hZ2Vfc2V0X2hkcl9iKGYpIFwKKwlzdGF0aWMgaW5saW5lIHZvaWQgaW1hZ2Vfc2V0XyMjZihpbWFnZV9oZWFkZXJfdCAqaGRyLCB1aW50OF90IHZhbCkgXAorCXsgXAorCQloZHItPmloXyMjZiA9IHZhbDsgXAorCX0KK2ltYWdlX3NldF9oZHJfYiAob3MpCQkvKiBpbWFnZV9zZXRfb3MgKi8KK2ltYWdlX3NldF9oZHJfYiAoYXJjaCkJCS8qIGltYWdlX3NldF9hcmNoICovCitpbWFnZV9zZXRfaGRyX2IgKHR5cGUpCQkvKiBpbWFnZV9zZXRfdHlwZSAqLworaW1hZ2Vfc2V0X2hkcl9iIChjb21wKQkJLyogaW1hZ2Vfc2V0X2NvbXAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGltYWdlX3NldF9uYW1lIChpbWFnZV9oZWFkZXJfdCAqaGRyLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cm5jcHkgKGltYWdlX2dldF9uYW1lIChoZHIpLCBuYW1lLCBJSF9OTUxFTik7Cit9CisKK2ludCBpbWFnZV9jaGVja19oY3JjIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKTsKK2ludCBpbWFnZV9jaGVja19kY3JjIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKTsKKyNpZm5kZWYgVVNFX0hPU1RDQworaW50IGdldGVudl95ZXNubyAoY2hhciAqdmFyKTsKK3Vsb25nIGdldGVudl9ib290bV9sb3codm9pZCk7CitwaHlzX3NpemVfdCBnZXRlbnZfYm9vdG1fc2l6ZSh2b2lkKTsKK3ZvaWQgbWVtbW92ZV93ZCAodm9pZCAqdG8sIHZvaWQgKmZyb20sIHNpemVfdCBsZW4sIHVsb25nIGNodW5rc3opOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IGltYWdlX2NoZWNrX21hZ2ljIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXJldHVybiAoaW1hZ2VfZ2V0X21hZ2ljIChoZHIpID09IElIX01BR0lDKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGltYWdlX2NoZWNrX3R5cGUgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIsIHVpbnQ4X3QgdHlwZSkKK3sKKwlyZXR1cm4gKGltYWdlX2dldF90eXBlIChoZHIpID09IHR5cGUpOworfQorc3RhdGljIGlubGluZSBpbnQgaW1hZ2VfY2hlY2tfYXJjaCAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkciwgdWludDhfdCBhcmNoKQoreworCXJldHVybiAoaW1hZ2VfZ2V0X2FyY2ggKGhkcikgPT0gYXJjaCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBpbWFnZV9jaGVja19vcyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkciwgdWludDhfdCBvcykKK3sKKwlyZXR1cm4gKGltYWdlX2dldF9vcyAoaGRyKSA9PSBvcyk7Cit9CisKK3Vsb25nIGltYWdlX211bHRpX2NvdW50IChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKTsKK3ZvaWQgaW1hZ2VfbXVsdGlfZ2V0aW1nIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyLCB1bG9uZyBpZHgsCisJCQl1bG9uZyAqZGF0YSwgdWxvbmcgKmxlbik7CisKK3ZvaWQgaW1hZ2VfcHJpbnRfY29udGVudHMgKGNvbnN0IHZvaWQgKmhkcik7CisKKyNpZm5kZWYgVVNFX0hPU1RDQworc3RhdGljIGlubGluZSBpbnQgaW1hZ2VfY2hlY2tfdGFyZ2V0X2FyY2ggKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisjaWYgZGVmaW5lZChfX0FSTV9fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX0FSTSkpCisjZWxpZiBkZWZpbmVkKF9fYXZyMzJfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9BVlIzMikpCisjZWxpZiBkZWZpbmVkKF9fYmZpbl9fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX0JMQUNLRklOKSkKKyNlbGlmIGRlZmluZWQoX19JMzg2X18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfSTM4NikpCisjZWxpZiBkZWZpbmVkKF9fTTY4S19fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX002OEspKQorI2VsaWYgZGVmaW5lZChfX21pY3JvYmxhemVfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9NSUNST0JMQVpFKSkKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfTUlQUykpCisjZWxpZiBkZWZpbmVkKF9fbmlvczJfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9OSU9TMikpCisjZWxpZiBkZWZpbmVkKF9fUFBDX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfUFBDKSkKKyNlbGlmIGRlZmluZWQoX19zaF9fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX1NIKSkKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX1NQQVJDKSkKKyNlbHNlCisjIGVycm9yIFVua25vd24gQ1BVIHR5cGUKKyNlbmRpZgorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorI2VuZGlmIC8qIFVTRV9IT1NUQ0MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBOZXcgdUltYWdlIGZvcm1hdCBzcGVjaWZpYyBjb2RlIChwcmVmaXhlZCB3aXRoIGZpdF8pICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisKKyNkZWZpbmUgRklUX0lNQUdFU19QQVRICQkiL2ltYWdlcyIKKyNkZWZpbmUgRklUX0NPTkZTX1BBVEgJCSIvY29uZmlndXJhdGlvbnMiCisKKy8qIGhhc2ggbm9kZSAqLworI2RlZmluZSBGSVRfSEFTSF9OT0RFTkFNRQkiaGFzaCIKKyNkZWZpbmUgRklUX0FMR09fUFJPUAkJImFsZ28iCisjZGVmaW5lIEZJVF9WQUxVRV9QUk9QCQkidmFsdWUiCisKKy8qIGltYWdlIG5vZGUgKi8KKyNkZWZpbmUgRklUX0RBVEFfUFJPUAkJImRhdGEiCisjZGVmaW5lIEZJVF9USU1FU1RBTVBfUFJPUAkidGltZXN0YW1wIgorI2RlZmluZSBGSVRfREVTQ19QUk9QCQkiZGVzY3JpcHRpb24iCisjZGVmaW5lIEZJVF9BUkNIX1BST1AJCSJhcmNoIgorI2RlZmluZSBGSVRfVFlQRV9QUk9QCQkidHlwZSIKKyNkZWZpbmUgRklUX09TX1BST1AJCSJvcyIKKyNkZWZpbmUgRklUX0NPTVBfUFJPUAkJImNvbXByZXNzaW9uIgorI2RlZmluZSBGSVRfRU5UUllfUFJPUAkJImVudHJ5IgorI2RlZmluZSBGSVRfTE9BRF9QUk9QCQkibG9hZCIKKworLyogY29uZmlndXJhdGlvbiBub2RlICovCisjZGVmaW5lIEZJVF9LRVJORUxfUFJPUAkJImtlcm5lbCIKKyNkZWZpbmUgRklUX1JBTURJU0tfUFJPUAkicmFtZGlzayIKKyNkZWZpbmUgRklUX0ZEVF9QUk9QCQkiZmR0IgorI2RlZmluZSBGSVRfREVGQVVMVF9QUk9QCSJkZWZhdWx0IgorCisjZGVmaW5lIEZJVF9NQVhfSEFTSF9MRU4JMjAJLyogbWF4KGNyYzMyX2xlbig0KSwgc2hhMV9sZW4oMjApKSAqLworCisvKiBjbWRsaW5lIGFyZ3VtZW50IGZvcm1hdCBwYXJzaW5nICovCitpbmxpbmUgaW50IGZpdF9wYXJzZV9jb25mIChjb25zdCBjaGFyICpzcGVjLCB1bG9uZyBhZGRyX2N1cnIsCisJCXVsb25nICphZGRyLCBjb25zdCBjaGFyICoqY29uZl9uYW1lKTsKK2lubGluZSBpbnQgZml0X3BhcnNlX3N1YmltYWdlIChjb25zdCBjaGFyICpzcGVjLCB1bG9uZyBhZGRyX2N1cnIsCisJCXVsb25nICphZGRyLCBjb25zdCBjaGFyICoqaW1hZ2VfbmFtZSk7CisKK3ZvaWQgZml0X3ByaW50X2NvbnRlbnRzIChjb25zdCB2b2lkICpmaXQpOwordm9pZCBmaXRfaW1hZ2VfcHJpbnQgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNvbnN0IGNoYXIgKnApOwordm9pZCBmaXRfaW1hZ2VfcHJpbnRfaGFzaCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY29uc3QgY2hhciAqcCk7CisKKy8qKgorICogZml0X2dldF9lbmQgLSBnZXQgRklUIGltYWdlIHNpemUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKgorICogcmV0dXJuczoKKyAqICAgICBzaXplIG9mIHRoZSBGSVQgaW1hZ2UgKGJsb2IpIGluIG1lbW9yeQorICovCitzdGF0aWMgaW5saW5lIHVsb25nIGZpdF9nZXRfc2l6ZSAoY29uc3Qgdm9pZCAqZml0KQoreworCXJldHVybiBmZHRfdG90YWxzaXplIChmaXQpOworfQorCisvKioKKyAqIGZpdF9nZXRfZW5kIC0gZ2V0IEZJVCBpbWFnZSBlbmQKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKgorICogcmV0dXJuczoKKyAqICAgICBlbmQgYWRkcmVzcyBvZiB0aGUgRklUIGltYWdlIChibG9iKSBpbiBtZW1vcnkKKyAqLworc3RhdGljIGlubGluZSB1bG9uZyBmaXRfZ2V0X2VuZCAoY29uc3Qgdm9pZCAqZml0KQoreworCXJldHVybiAodWxvbmcpZml0ICsgZmR0X3RvdGFsc2l6ZSAoZml0KTsKK30KKworLyoqCisgKiBmaXRfZ2V0X25hbWUgLSBnZXQgRklUIG5vZGUgbmFtZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqCisgKiByZXR1cm5zOgorICogICAgIE5VTEwsIG9uIGVycm9yCisgKiAgICAgcG9pbnRlciB0byBub2RlIG5hbWUsIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpmaXRfZ2V0X25hbWUgKGNvbnN0IHZvaWQgKmZpdF9oZHIsCisJCWludCBub2Zmc2V0LCBpbnQgKmxlbikKK3sKKwlyZXR1cm4gZmR0X2dldF9uYW1lIChmaXRfaGRyLCBub2Zmc2V0LCBsZW4pOworfQorCitpbnQgZml0X2dldF9kZXNjIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjaGFyICoqZGVzYyk7CitpbnQgZml0X2dldF90aW1lc3RhbXAgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHRpbWVfdCAqdGltZXN0YW1wKTsKKworaW50IGZpdF9pbWFnZV9nZXRfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBjb25zdCBjaGFyICppbWFnZV91bmFtZSk7CitpbnQgZml0X2ltYWdlX2dldF9vcyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqb3MpOworaW50IGZpdF9pbWFnZV9nZXRfYXJjaCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqYXJjaCk7CitpbnQgZml0X2ltYWdlX2dldF90eXBlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICp0eXBlKTsKK2ludCBmaXRfaW1hZ2VfZ2V0X2NvbXAgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKmNvbXApOworaW50IGZpdF9pbWFnZV9nZXRfbG9hZCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWxvbmcgKmxvYWQpOworaW50IGZpdF9pbWFnZV9nZXRfZW50cnkgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVsb25nICplbnRyeSk7CitpbnQgZml0X2ltYWdlX2dldF9kYXRhIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LAorCQkJCWNvbnN0IHZvaWQgKipkYXRhLCBzaXplX3QgKnNpemUpOworCitpbnQgZml0X2ltYWdlX2hhc2hfZ2V0X2FsZ28gKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNoYXIgKiphbGdvKTsKK2ludCBmaXRfaW1hZ2VfaGFzaF9nZXRfdmFsdWUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKip2YWx1ZSwKKwkJCQlpbnQgKnZhbHVlX2xlbik7CisKK2ludCBmaXRfc2V0X3RpbWVzdGFtcCAodm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdGltZV90IHRpbWVzdGFtcCk7CitpbnQgZml0X3NldF9oYXNoZXMgKHZvaWQgKmZpdCk7CitpbnQgZml0X2ltYWdlX3NldF9oYXNoZXMgKHZvaWQgKmZpdCwgaW50IGltYWdlX25vZmZzZXQpOworaW50IGZpdF9pbWFnZV9oYXNoX3NldF92YWx1ZSAodm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqdmFsdWUsCisJCQkJaW50IHZhbHVlX2xlbik7CisKK2ludCBmaXRfaW1hZ2VfY2hlY2tfaGFzaGVzIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0KTsKK2ludCBmaXRfYWxsX2ltYWdlX2NoZWNrX2hhc2hlcyAoY29uc3Qgdm9pZCAqZml0KTsKK2ludCBmaXRfaW1hZ2VfY2hlY2tfb3MgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3Qgb3MpOworaW50IGZpdF9pbWFnZV9jaGVja19hcmNoIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IGFyY2gpOworaW50IGZpdF9pbWFnZV9jaGVja190eXBlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IHR5cGUpOworaW50IGZpdF9pbWFnZV9jaGVja19jb21wIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IGNvbXApOworaW50IGZpdF9jaGVja19mb3JtYXQgKGNvbnN0IHZvaWQgKmZpdCk7CisKK2ludCBmaXRfY29uZl9nZXRfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBjb25zdCBjaGFyICpjb25mX3VuYW1lKTsKK2ludCBmaXRfY29uZl9nZXRfa2VybmVsX25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQpOworaW50IGZpdF9jb25mX2dldF9yYW1kaXNrX25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQpOworaW50IGZpdF9jb25mX2dldF9mZHRfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCk7CisKK3ZvaWQgZml0X2NvbmZfcHJpbnQgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNvbnN0IGNoYXIgKnApOworCisjaWZuZGVmIFVTRV9IT1NUQ0MKK3N0YXRpYyBpbmxpbmUgaW50IGZpdF9pbWFnZV9jaGVja190YXJnZXRfYXJjaCAoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9kZSkKK3sKKyNpZiBkZWZpbmVkKF9fQVJNX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX0FSTSkpCisjZWxpZiBkZWZpbmVkKF9fYXZyMzJfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfQVZSMzIpKQorI2VsaWYgZGVmaW5lZChfX2JmaW5fXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfQkxBQ0tGSU4pKQorI2VsaWYgZGVmaW5lZChfX0kzODZfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfSTM4NikpCisjZWxpZiBkZWZpbmVkKF9fTTY4S19fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9NNjhLKSkKKyNlbGlmIGRlZmluZWQoX19taWNyb2JsYXplX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX01JQ1JPQkxBWkUpKQorI2VsaWYgZGVmaW5lZChfX21pcHNfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfTUlQUykpCisjZWxpZiBkZWZpbmVkKF9fbmlvczJfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfTklPUzIpKQorI2VsaWYgZGVmaW5lZChfX1BQQ19fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9QUEMpKQorI2VsaWYgZGVmaW5lZChfX3NoX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX1NIKSkKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9TUEFSQykpCisjZWxzZQorIyBlcnJvciBVbmtub3duIENQVSB0eXBlCisjZW5kaWYKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBVU0VfSE9TVENDICovCisKKyNpZmRlZiBDT05GSUdfRklUX1ZFUkJPU0UKKyNkZWZpbmUgZml0X3Vuc3VwcG9ydGVkKG1zZykJcHJpbnRmICgiISAlczolZCAiIFwKKwkJCQkiRklUIGltYWdlcyBub3Qgc3VwcG9ydGVkIGZvciAnJXMnXG4iLCBcCisJCQkJX19GSUxFX18sIF9fTElORV9fLCAobXNnKSkKKworI2RlZmluZSBmaXRfdW5zdXBwb3J0ZWRfcmVzZXQobXNnKQlwcmludGYgKCIhICVzOiVkICIgXAorCQkJCSJGSVQgaW1hZ2VzIG5vdCBzdXBwb3J0ZWQgZm9yICclcycgIiBcCisJCQkJIi0gbXVzdCByZXNldCBib2FyZCB0byByZWNvdmVyIVxuIiwgXAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgKG1zZykpCisjZWxzZQorI2RlZmluZSBmaXRfdW5zdXBwb3J0ZWQobXNnKQorI2RlZmluZSBmaXRfdW5zdXBwb3J0ZWRfcmVzZXQobXNnKQorI2VuZGlmIC8qIENPTkZJR19GSVRfVkVSQk9TRSAqLworI2VuZGlmIC8qIENPTkZJR19GSVQgKi8KKworI2VuZGlmCS8qIF9fSU1BR0VfSF9fICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTliMGM4NgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaApAQCAtMCwwICsxLDY5IEBACisjaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfQklHX0VORElBTl9ICisjZGVmaW5lIF9MSU5VWF9CWVRFT1JERVJfQklHX0VORElBTl9ICisKKyNpZm5kZWYgX19CSUdfRU5ESUFOCisjZGVmaW5lIF9fQklHX0VORElBTiA0MzIxCisjZW5kaWYKKyNpZm5kZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECisjZGVmaW5lIF9fQklHX0VORElBTl9CSVRGSUVMRAorI2VuZGlmCisjZGVmaW5lCV9fQllURV9PUkRFUglfX0JJR19FTkRJQU4KKworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiLmg+CisKKyNkZWZpbmUgX19jb25zdGFudF9odG9ubCh4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9udG9obCh4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9odG9ucyh4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9udG9ocyh4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGU2NCh4KSBfX19zd2FiNjQoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlNjRfdG9fY3B1KHgpIF9fX3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoeCkgX19fc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTMyX3RvX2NwdSh4KSBfX19zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTE2KHgpIF9fX3N3YWIxNigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGUxNl90b19jcHUoeCkgX19fc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmU2NCh4KSAoKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTY0X3RvX2NwdSh4KSAoKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmUzMih4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTMyX3RvX2NwdSh4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmUxNih4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTE2X3RvX2NwdSh4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGU2NCh4KSBfX3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fbGU2NF90b19jcHUoeCkgX19zd2FiNjQoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTMyKHgpIF9fc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdSh4KSBfX3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMTYoeCkgX19zd2FiMTYoKHgpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1KHgpIF9fc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NCh4KSAoKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdSh4KSAoKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMih4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdSh4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNih4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19iZTE2X3RvX2NwdSh4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGU2NHAoeCkgX19zd2FiNjRwKCh4KSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdXAoeCkgX19zd2FiNjRwKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMnAoeCkgX19zd2FiMzJwKCh4KSkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdXAoeCkgX19zd2FiMzJwKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNnAoeCkgX19zd2FiMTZwKCh4KSkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdXAoeCkgX19zd2FiMTZwKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NHAoeCkgKCooX191NjQqKSh4KSkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdXAoeCkgKCooX191NjQqKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMnAoeCkgKCooX191MzIqKSh4KSkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdXAoeCkgKCooX191MzIqKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNnAoeCkgKCooX191MTYqKSh4KSkKKyNkZWZpbmUgX19iZTE2X3RvX2NwdXAoeCkgKCooX191MTYqKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGU2NHMoeCkgX19zd2FiNjRzKCh4KSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdXMoeCkgX19zd2FiNjRzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMnMoeCkgX19zd2FiMzJzKCh4KSkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdXMoeCkgX19zd2FiMzJzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNnMoeCkgX19zd2FiMTZzKCh4KSkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdXMoeCkgX19zd2FiMTZzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NHMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fYmU2NF90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19iZTMycyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2JlMTZzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9nZW5lcmljLmg+CisKKyNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX0JJR19FTkRJQU5fSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmZjg1MGYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9nZW5lcmljLmgKQEAgLTAsMCArMSwxODAgQEAKKyNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9HRU5FUklDX0gKKyNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9HRU5FUklDX0gKKworLyoKKyAqIGxpbnV4L2J5dGVvcmRlcl9nZW5lcmljLmgKKyAqIEdlbmVyaWMgQnl0ZS1yZW9yZGVyaW5nIHN1cHBvcnQKKyAqCisgKiBGcmFuY29pcy1SZW5lIFJpZGVhdSA8ZmFyZUB0dW5lcy5vcmc+IDE5OTcwNzA3CisgKiAgICBnYXRoZXJlZCBhbGwgdGhlIGdvb2QgaWRlYXMgZnJvbSBhbGwgYXNtLWZvby9ieXRlb3JkZXIuaCBpbnRvIG9uZSBmaWxlLAorICogICAgY2xlYW5lZCB0aGVtIHVwLgorICogICAgSSBob3BlIGl0IGlzIGNvbXBsaWFudCB3aXRoIG5vbi1HQ0MgY29tcGlsZXJzLgorICogICAgSSBkZWNpZGVkIHRvIHB1dCBfX0JZVEVPUkRFUl9IQVNfVTY0X18gaW4gYnl0ZW9yZGVyLmgsCisgKiAgICBiZWNhdXNlIEkgd2Fzbid0IHN1cmUgaXQgd291bGQgYmUgb2sgdG8gcHV0IGl0IGluIHR5cGVzLmgKKyAqICAgIFVwZ3JhZGVkIGl0IHRvIDIuMS40MworICogRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPiAxOTk3MTAxMgorICogICAgVXBncmFkZWQgaXQgdG8gMi4xLjU3CisgKiAgICB0byBwbGVhc2UgTGludXMgVC4sIHJlcGxhY2VkIGh1Z2UgI2lmZGVmJ3MgYmV0d2VlbiBsaXR0bGUvYmlnIGVuZGlhbgorICogICAgYnkgbmVzdGVkbHkgI2luY2x1ZGUnZCBmaWxlcy4KKyAqIEZyYW5jb2lzLVJlbmUgUmlkZWF1IDxmYXJlQHR1bmVzLm9yZz4gMTk5NzEyMDUKKyAqICAgIE1hZGUgaXQgdG8gMi4xLjcxOyBub3cgYSBmYWNlbGlmdDoKKyAqICAgIFB1dCBmaWxlcyB1bmRlciBpbmNsdWRlL2xpbnV4L2J5dGVvcmRlci8KKyAqICAgIFNwbGl0IHN3YWIgZnJvbSBnZW5lcmljIHN1cHBvcnQuCisgKgorICogVE9ETzoKKyAqICAgPSBSZWd1bGFyIGtlcm5lbCBtYWludGFpbmVycyBjb3VsZCBhbHNvIHJlcGxhY2UgYWxsIHRoZXNlIG1hbnVhbAorICogICAgYnl0ZXN3YXAgbWFjcm9zIHRoYXQgcmVtYWluLCBkaXNzZW1pbmF0ZWQgYW1vbmcgZHJpdmVycywKKyAqICAgIGFmdGVyIHNvbWUgZ3JlcCBvciB0aGUgc291cmNlcy4uLgorICogICA9IExpbnVzIG1pZ2h0IHdhbnQgdG8gcmVuYW1lIGFsbCB0aGVzZSBtYWNyb3MgYW5kIGZpbGVzIHRvIGZpdCBoaXMgdGFzdGUsCisgKiAgICB0byBmaXQgaGlzIHBlcnNvbmFsIG5hbWluZyBzY2hlbWUuCisgKiAgID0gaXQgc2VlbXMgdGhhdCBhIGZldyBkcml2ZXJzIHdvdWxkIGFsc28gYXBwcmVjaWF0ZQorICogICAgbnliYmxlIHN3YXBwaW5nIHN1cHBvcnQuLi4KKyAqICAgPSBldmVyeSBhcmNoaXRlY3R1cmUgY291bGQgYWRkIHRoZWlyIGJ5dGVzd2FwIG1hY3JvIGluIGFzbS9ieXRlb3JkZXIuaAorICogICAgc2VlIGhvdyBzb21lIGFyY2hpdGVjdHVyZXMgYWxyZWFkeSBkbyAoaTM4NiwgYWxwaGEsIHBwYywgZXRjKQorICogICA9IGNwdV90b19iZVhYIGFuZCBiZVhYX3RvX2NwdSBtaWdodCBzb21lIGRheSBuZWVkIHRvIGJlIHdlbGwKKyAqICAgIGRpc3Rpbmd1aXNoZWQgdGhyb3VnaG91dCB0aGUga2VybmVsLiBUaGlzIGlzIG5vdCB0aGUgY2FzZSBjdXJyZW50bHksCisgKiAgICBzaW5jZSBsaXR0bGUgZW5kaWFuLCBiaWcgZW5kaWFuLCBhbmQgcGRwIGVuZGlhbiBtYWNoaW5lcyBuZWVkbid0IGl0LgorICogICAgQnV0IHRoaXMgbWlnaHQgYmUgdGhlIGNhc2UgZm9yLCBzYXksIGEgcG9ydCBvZiBMaW51eCB0byAyMC8yMSBiaXQKKyAqICAgIGFyY2hpdGVjdHVyZXMgKGFuZCBGMjEgTGludXggYWRkaWN0IGFyb3VuZD8pLgorICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgdG8gYmUgZGVmaW5lZCBieSA8YXNtL2J5dGVvcmRlci5oPjoKKyAqCisgKiBDb252ZXJzaW9uIG9mIGxvbmcgYW5kIHNob3J0IGludCBiZXR3ZWVuIG5ldHdvcmsgYW5kIGhvc3QgZm9ybWF0CisgKgludG9obChfX3UzMiB4KQorICoJbnRvaHMoX191MTYgeCkKKyAqCWh0b25sKF9fdTMyIHgpCisgKglodG9ucyhfX3UxNiB4KQorICogSXQgc2VlbXMgdGhhdCBzb21lIHByb2dyYW1zICh3aGljaD8gd2hlcmU/IG9yIHBlcmhhcHMgYSBzdGFuZGFyZD8gUE9TSVg/KQorICogbWlnaHQgbGlrZSB0aGUgYWJvdmUgdG8gYmUgZnVuY3Rpb25zLCBub3QgbWFjcm9zICh3aHk/KS4KKyAqIGlmIHRoYXQncyB0cnVlLCB0aGVuIGRldGVjdCB0aGVtLCBhbmQgdGFrZSBtZWFzdXJlcy4KKyAqIEFueXdheSwgdGhlIG1lYXN1cmUgaXM6IGRlZmluZSBvbmx5IF9fX250b2hsIGFzIGEgbWFjcm8gaW5zdGVhZCwKKyAqIGFuZCBpbiBhIHNlcGFyYXRlIGZpbGUsIGhhdmUKKyAqIHVuc2lnbmVkIGxvbmcgaW5saW5lIG50b2hsKHgpe3JldHVybiBfX19udG9obCh4KTt9CisgKgorICogVGhlIHNhbWUgZm9yIGNvbnN0YW50IGFyZ3VtZW50cworICoJX19jb25zdGFudF9udG9obChfX3UzMiB4KQorICoJX19jb25zdGFudF9udG9ocyhfX3UxNiB4KQorICoJX19jb25zdGFudF9odG9ubChfX3UzMiB4KQorICoJX19jb25zdGFudF9odG9ucyhfX3UxNiB4KQorICoKKyAqIENvbnZlcnNpb24gb2YgWFgtYml0IGludGVnZXJzICgxNi0gMzItIG9yIDY0LSkKKyAqIGJldHdlZW4gbmF0aXZlIENQVSBmb3JtYXQgYW5kIGxpdHRsZS9iaWcgZW5kaWFuIGZvcm1hdAorICogNjQtYml0IHN0dWZmIG9ubHkgZGVmaW5lZCBmb3IgcHJvcGVyIGFyY2hpdGVjdHVyZXMKKyAqCWNwdV90b19bYmxdZVhYKF9fdVhYIHgpCisgKglbYmxdZVhYX3RvX2NwdShfX3VYWCB4KQorICoKKyAqIFRoZSBzYW1lLCBidXQgdGFrZXMgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSB0byBjb252ZXJ0CisgKgljcHVfdG9fW2JsXWVYWHAoX191WFggeCkKKyAqCVtibF1lWFhfdG9fY3B1cChfX3VYWCB4KQorICoKKyAqIFRoZSBzYW1lLCBidXQgY2hhbmdlIGluIHNpdHUKKyAqCWNwdV90b19bYmxdZVhYcyhfX3VYWCB4KQorICoJW2JsXWVYWF90b19jcHVzKF9fdVhYIHgpCisgKgorICogU2VlIGFzbS1mb28vYnl0ZW9yZGVyLmggZm9yIGV4YW1wbGVzIG9mIGhvdyB0byBwcm92aWRlCisgKiBhcmNoaXRlY3R1cmUtb3B0aW1pemVkIHZlcnNpb25zCisgKgorICovCisKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykKKy8qCisgKiBpbnNpZGUgdGhlIGtlcm5lbCwgd2UgY2FuIHVzZSBuaWNrbmFtZXM7CisgKiBvdXRzaWRlIG9mIGl0LCB3ZSBtdXN0IGF2b2lkIFBPU0lYIG5hbWVzcGFjZSBwb2xsdXRpb24uLi4KKyAqLworI2RlZmluZSBjcHVfdG9fbGU2NCBfX2NwdV90b19sZTY0CisjZGVmaW5lIGxlNjRfdG9fY3B1IF9fbGU2NF90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2xlMzIgX19jcHVfdG9fbGUzMgorI2RlZmluZSBsZTMyX3RvX2NwdSBfX2xlMzJfdG9fY3B1CisjZGVmaW5lIGNwdV90b19sZTE2IF9fY3B1X3RvX2xlMTYKKyNkZWZpbmUgbGUxNl90b19jcHUgX19sZTE2X3RvX2NwdQorI2RlZmluZSBjcHVfdG9fYmU2NCBfX2NwdV90b19iZTY0CisjZGVmaW5lIGJlNjRfdG9fY3B1IF9fYmU2NF90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2JlMzIgX19jcHVfdG9fYmUzMgorI2RlZmluZSBiZTMyX3RvX2NwdSBfX2JlMzJfdG9fY3B1CisjZGVmaW5lIGNwdV90b19iZTE2IF9fY3B1X3RvX2JlMTYKKyNkZWZpbmUgYmUxNl90b19jcHUgX19iZTE2X3RvX2NwdQorI2RlZmluZSBjcHVfdG9fbGU2NHAgX19jcHVfdG9fbGU2NHAKKyNkZWZpbmUgbGU2NF90b19jcHVwIF9fbGU2NF90b19jcHVwCisjZGVmaW5lIGNwdV90b19sZTMycCBfX2NwdV90b19sZTMycAorI2RlZmluZSBsZTMyX3RvX2NwdXAgX19sZTMyX3RvX2NwdXAKKyNkZWZpbmUgY3B1X3RvX2xlMTZwIF9fY3B1X3RvX2xlMTZwCisjZGVmaW5lIGxlMTZfdG9fY3B1cCBfX2xlMTZfdG9fY3B1cAorI2RlZmluZSBjcHVfdG9fYmU2NHAgX19jcHVfdG9fYmU2NHAKKyNkZWZpbmUgYmU2NF90b19jcHVwIF9fYmU2NF90b19jcHVwCisjZGVmaW5lIGNwdV90b19iZTMycCBfX2NwdV90b19iZTMycAorI2RlZmluZSBiZTMyX3RvX2NwdXAgX19iZTMyX3RvX2NwdXAKKyNkZWZpbmUgY3B1X3RvX2JlMTZwIF9fY3B1X3RvX2JlMTZwCisjZGVmaW5lIGJlMTZfdG9fY3B1cCBfX2JlMTZfdG9fY3B1cAorI2RlZmluZSBjcHVfdG9fbGU2NHMgX19jcHVfdG9fbGU2NHMKKyNkZWZpbmUgbGU2NF90b19jcHVzIF9fbGU2NF90b19jcHVzCisjZGVmaW5lIGNwdV90b19sZTMycyBfX2NwdV90b19sZTMycworI2RlZmluZSBsZTMyX3RvX2NwdXMgX19sZTMyX3RvX2NwdXMKKyNkZWZpbmUgY3B1X3RvX2xlMTZzIF9fY3B1X3RvX2xlMTZzCisjZGVmaW5lIGxlMTZfdG9fY3B1cyBfX2xlMTZfdG9fY3B1cworI2RlZmluZSBjcHVfdG9fYmU2NHMgX19jcHVfdG9fYmU2NHMKKyNkZWZpbmUgYmU2NF90b19jcHVzIF9fYmU2NF90b19jcHVzCisjZGVmaW5lIGNwdV90b19iZTMycyBfX2NwdV90b19iZTMycworI2RlZmluZSBiZTMyX3RvX2NwdXMgX19iZTMyX3RvX2NwdXMKKyNkZWZpbmUgY3B1X3RvX2JlMTZzIF9fY3B1X3RvX2JlMTZzCisjZGVmaW5lIGJlMTZfdG9fY3B1cyBfX2JlMTZfdG9fY3B1cworI2VuZGlmCisKKworLyoKKyAqIEhhbmRsZSBudG9obCBhbmQgc3VjaGVzLiBUaGVzZSBoYXZlIHZhcmlvdXMgY29tcGF0aWJpbGl0eQorICogaXNzdWVzIC0gbGlrZSB3ZSB3YW50IHRvIGdpdmUgdGhlIHByb3RvdHlwZSBldmVuIHRob3VnaCB3ZQorICogYWxzbyBoYXZlIGEgbWFjcm8gZm9yIHRoZW0gaW4gY2FzZSBzb21lIHN0cmFuZ2UgcHJvZ3JhbQorICogd2FudHMgdG8gdGFrZSB0aGUgYWRkcmVzcyBvZiB0aGUgdGhpbmcgb3Igc29tZXRoaW5nLi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlc2UgdXNlZCB0byByZXR1cm4gYSAibG9uZyIgaW4gbGliYzUsIGV2ZW4gdGhvdWdoCisgKiBsb25nIGlzIG9mdGVuIDY0LWJpdCB0aGVzZSBkYXlzLi4gVGh1cyB0aGUgY2FzdHMuCisgKgorICogVGhleSBoYXZlIHRvIGJlIG1hY3JvcyBpbiBvcmRlciB0byBkbyB0aGUgY29uc3RhbnQgZm9sZGluZworICogY29ycmVjdGx5IC0gaWYgdGhlIGFyZ3VtZW50IHBhc3NlZCBpbnRvIGEgaW5saW5lIGZ1bmN0aW9uCisgKiBpdCBpcyBubyBsb25nZXIgY29uc3RhbnQgYWNjb3JkaW5nIHRvIGdjYy4uCisgKi8KKworI3VuZGVmIG50b2hsCisjdW5kZWYgbnRvaHMKKyN1bmRlZiBodG9ubAorI3VuZGVmIGh0b25zCisKKy8qCisgKiBEbyB0aGUgcHJvdG90eXBlcy4gU29tZWJvZHkgbWlnaHQgd2FudCB0byB0YWtlIHRoZQorICogYWRkcmVzcyBvciBzb21lIHN1Y2ggc2ljayB0aGluZy4uCisgKi8KKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IChkZWZpbmVkIChfX0dMSUJDX18pICYmIF9fR0xJQkNfXyA+PSAyKQorZXh0ZXJuIF9fdTMyCQkJbnRvaGwoX191MzIpOworZXh0ZXJuIF9fdTMyCQkJaHRvbmwoX191MzIpOworI2Vsc2UKK2V4dGVybiB1bnNpZ25lZCBsb25nIGludAludG9obCh1bnNpZ25lZCBsb25nIGludCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQJaHRvbmwodW5zaWduZWQgbG9uZyBpbnQpOworI2VuZGlmCitleHRlcm4gdW5zaWduZWQgc2hvcnQgaW50CW50b2hzKHVuc2lnbmVkIHNob3J0IGludCk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgaW50CWh0b25zKHVuc2lnbmVkIHNob3J0IGludCk7CisKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+PSAyKQorCisjZGVmaW5lIF9fX2h0b25sKHgpIF9fY3B1X3RvX2JlMzIoeCkKKyNkZWZpbmUgX19faHRvbnMoeCkgX19jcHVfdG9fYmUxNih4KQorI2RlZmluZSBfX19udG9obCh4KSBfX2JlMzJfdG9fY3B1KHgpCisjZGVmaW5lIF9fX250b2hzKHgpIF9fYmUxNl90b19jcHUoeCkKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgKGRlZmluZWQgKF9fR0xJQkNfXykgJiYgX19HTElCQ19fID49IDIpCisjZGVmaW5lIGh0b25sKHgpIF9fX2h0b25sKHgpCisjZGVmaW5lIG50b2hsKHgpIF9fX250b2hsKHgpCisjZWxzZQorI2RlZmluZSBodG9ubCh4KSAoKHVuc2lnbmVkIGxvbmcpX19faHRvbmwoeCkpCisjZGVmaW5lIG50b2hsKHgpICgodW5zaWduZWQgbG9uZylfX19udG9obCh4KSkKKyNlbmRpZgorI2RlZmluZSBodG9ucyh4KSBfX19odG9ucyh4KQorI2RlZmluZSBudG9ocyh4KSBfX19udG9ocyh4KQorCisjZW5kaWYgLyogT1BUSU1JWkUgKi8KKworCisjZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9HRU5FUklDX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDZmM2VjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oCkBAIC0wLDAgKzEsNjkgQEAKKyNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9MSVRUTEVfRU5ESUFOX0gKKyNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9MSVRUTEVfRU5ESUFOX0gKKworI2lmbmRlZiBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOIDEyMzQKKyNlbmRpZgorI2lmbmRlZiBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECisjZW5kaWYKKyNkZWZpbmUJX19CWVRFX09SREVSCV9fTElUVExFX0VORElBTgorCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL3N3YWIuaD4KKworI2RlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpIF9fX2NvbnN0YW50X3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbnRvaGwoeCkgX19fY29uc3RhbnRfc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9odG9ucyh4KSBfX19jb25zdGFudF9zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X250b2hzKHgpIF9fX2NvbnN0YW50X3N3YWIxNigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlNjQoeCkgKChfX3U2NCkoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGU2NF90b19jcHUoeCkgKChfX3U2NCkoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGUzMl90b19jcHUoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGUxNl90b19jcHUoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlNjQoeCkgX19fY29uc3RhbnRfc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTY0X3RvX2NwdSh4KSBfX19jb25zdGFudF9zd2FiNjQoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTMyKHgpIF9fX2NvbnN0YW50X3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUzMl90b19jcHUoeCkgX19fY29uc3RhbnRfc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmUxNih4KSBfX19jb25zdGFudF9zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlMTZfdG9fY3B1KHgpIF9fX2NvbnN0YW50X3N3YWIxNigoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlNjQoeCkgKChfX3U2NCkoeCkpCisjZGVmaW5lIF9fbGU2NF90b19jcHUoeCkgKChfX3U2NCkoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMzIoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fbGUzMl90b19jcHUoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMTYoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fbGUxNl90b19jcHUoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlNjQoeCkgX19zd2FiNjQoKHgpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1KHgpIF9fc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMih4KSBfX3N3YWIzMigoeCkpCisjZGVmaW5lIF9fYmUzMl90b19jcHUoeCkgX19zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTE2KHgpIF9fc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19iZTE2X3RvX2NwdSh4KSBfX3N3YWIxNigoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlNjRwKHgpICgqKF9fdTY0KikoeCkpCisjZGVmaW5lIF9fbGU2NF90b19jcHVwKHgpICgqKF9fdTY0KikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMzJwKHgpICgqKF9fdTMyKikoeCkpCisjZGVmaW5lIF9fbGUzMl90b19jcHVwKHgpICgqKF9fdTMyKikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMTZwKHgpICgqKF9fdTE2KikoeCkpCisjZGVmaW5lIF9fbGUxNl90b19jcHVwKHgpICgqKF9fdTE2KikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlNjRwKHgpIF9fc3dhYjY0cCgoeCkpCisjZGVmaW5lIF9fYmU2NF90b19jcHVwKHgpIF9fc3dhYjY0cCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzJwKHgpIF9fc3dhYjMycCgoeCkpCisjZGVmaW5lIF9fYmUzMl90b19jcHVwKHgpIF9fc3dhYjMycCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTZwKHgpIF9fc3dhYjE2cCgoeCkpCisjZGVmaW5lIF9fYmUxNl90b19jcHVwKHgpIF9fc3dhYjE2cCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlNjRzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMnMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fbGUzMl90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19sZTE2cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2JlNjRzKHgpIF9fc3dhYjY0cygoeCkpCisjZGVmaW5lIF9fYmU2NF90b19jcHVzKHgpIF9fc3dhYjY0cygoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzJzKHgpIF9fc3dhYjMycygoeCkpCisjZGVmaW5lIF9fYmUzMl90b19jcHVzKHgpIF9fc3dhYjMycygoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTZzKHgpIF9fc3dhYjE2cygoeCkpCisjZGVmaW5lIF9fYmUxNl90b19jcHVzKHgpIF9fc3dhYjE2cygoeCkpCisKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorCisjZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9MSVRUTEVfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWIuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMWQ1NzBlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYi5oCkBAIC0wLDAgKzEsMTU4IEBACisjaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfU1dBQl9ICisjZGVmaW5lIF9MSU5VWF9CWVRFT1JERVJfU1dBQl9ICisKKy8qCisgKiBsaW51eC9ieXRlb3JkZXIvc3dhYi5oCisgKiBCeXRlLXN3YXBwaW5nLCBpbmRlcGVuZGVudGx5IGZyb20gQ1BVIGVuZGlhbm5lc3MKKyAqCXN3YWJYWFtwc10/KGZvbykKKyAqCisgKiBGcmFuY29pcy1SZW5lIFJpZGVhdSA8ZmFyZUB0dW5lcy5vcmc+IDE5OTcxMjA1CisgKiAgICBzZXBhcmF0ZWQgc3dhYiBmdW5jdGlvbnMgZnJvbSBjcHVfdG9fWFgsCisgKiAgICB0byBjbGVhbiB1cCBzdXBwb3J0IGZvciBiaXphcnJlLWVuZGlhbiBhcmNoaXRlY3R1cmVzLgorICoKKyAqIFNlZSBhc20taTM4Ni9ieXRlb3JkZXIuaCBhbmQgc3VjaGVzIGZvciBleGFtcGxlcyBvZiBob3cgdG8gcHJvdmlkZQorICogYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBvcHRpbWl6ZWQgdmVyc2lvbnMKKyAqCisgKi8KKworLyogY2FzdHMgYXJlIG5lY2Vzc2FyeSBmb3IgY29uc3RhbnRzLCBiZWNhdXNlIHdlIG5ldmVyIGtub3cgaG93IGZvciBzdXJlCisgKiBob3cgVS9VTC9VTEwgbWFwIHRvIF9fdTE2LCBfX3UzMiwgX191NjQuIEF0IGxlYXN0IG5vdCBpbiBhIHBvcnRhYmxlIHdheS4KKyAqLworI2RlZmluZSBfX19zd2FiMTYoeCkgXAorCSgoX191MTYpKCBcCisJCSgoKF9fdTE2KSh4KSAmIChfX3UxNikweDAwZmZVKSA8PCA4KSB8IFwKKwkJKCgoX191MTYpKHgpICYgKF9fdTE2KTB4ZmYwMFUpID4+IDgpICkpCisjZGVmaW5lIF9fX3N3YWIzMih4KSBcCisJKChfX3UzMikoIFwKKwkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMDAwZmZVTCkgPDwgMjQpIHwgXAorCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMDAwZmYwMFVMKSA8PCAgOCkgfCBcCisJCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwZmYwMDAwVUwpID4+ICA4KSB8IFwKKwkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4ZmYwMDAwMDBVTCkgPj4gMjQpICkpCisjZGVmaW5lIF9fX3N3YWI2NCh4KSBcCisJKChfX3U2NCkoIFwKKwkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMDAwMDAwMDAwZmZVTEwpIDw8IDU2KSB8IFwKKwkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8IFwKKwkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMDAwMDBmZjAwMDBVTEwpIDw8IDI0KSB8IFwKKwkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8IFwKKwkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8IFwKKwkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8IFwKKwkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8IFwKKwkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweGZmMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSApKQorCisvKgorICogcHJvdmlkZSBkZWZhdWx0cyB3aGVuIG5vIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBvcHRpbWl6YXRpb24gaXMgZGV0ZWN0ZWQKKyAqLworI2lmbmRlZiBfX2FyY2hfX3N3YWIxNgorIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjE2KHgpIF9fX3N3YWIxNih4KQorI2VuZGlmCisjaWZuZGVmIF9fYXJjaF9fc3dhYjMyCisjICBkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fc3dhYjMyKHgpCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiNjQKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWI2NCh4KSBfX19zd2FiNjQoeCkKKyNlbmRpZgorCisjaWZuZGVmIF9fYXJjaF9fc3dhYjE2cAorIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjE2cCh4KSBfX3N3YWIxNigqKHgpKQorI2VuZGlmCisjaWZuZGVmIF9fYXJjaF9fc3dhYjMycAorIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjMycCh4KSBfX3N3YWIzMigqKHgpKQorI2VuZGlmCisjaWZuZGVmIF9fYXJjaF9fc3dhYjY0cAorIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjY0cCh4KSBfX3N3YWI2NCgqKHgpKQorI2VuZGlmCisKKyNpZm5kZWYgX19hcmNoX19zd2FiMTZzCisjICBkZWZpbmUgX19hcmNoX19zd2FiMTZzKHgpIGRvIHsgKih4KSA9IF9fc3dhYjE2cCgoeCkpOyB9IHdoaWxlICgwKQorI2VuZGlmCisjaWZuZGVmIF9fYXJjaF9fc3dhYjMycworIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjMycyh4KSBkbyB7ICooeCkgPSBfX3N3YWIzMnAoKHgpKTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWI2NHMKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWI2NHMoeCkgZG8geyAqKHgpID0gX19zd2FiNjRwKCh4KSk7IH0gd2hpbGUgKDApCisjZW5kaWYKKworCisvKgorICogQWxsb3cgY29uc3RhbnQgZm9sZGluZworICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDIpICYmIGRlZmluZWQoX19PUFRJTUlaRV9fKQorIyAgZGVmaW5lIF9fc3dhYjE2KHgpIFwKKyhfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MTYpKHgpKSA/IFwKKyBfX19zd2FiMTYoKHgpKSA6IFwKKyBfX2Zzd2FiMTYoKHgpKSkKKyMgIGRlZmluZSBfX3N3YWIzMih4KSBcCisoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTMyKSh4KSkgPyBcCisgX19fc3dhYjMyKCh4KSkgOiBcCisgX19mc3dhYjMyKCh4KSkpCisjICBkZWZpbmUgX19zd2FiNjQoeCkgXAorKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3U2NCkoeCkpID8gXAorIF9fX3N3YWI2NCgoeCkpIDogXAorIF9fZnN3YWI2NCgoeCkpKQorI2Vsc2UKKyMgIGRlZmluZSBfX3N3YWIxNih4KSBfX2Zzd2FiMTYoeCkKKyMgIGRlZmluZSBfX3N3YWIzMih4KSBfX2Zzd2FiMzIoeCkKKyMgIGRlZmluZSBfX3N3YWI2NCh4KSBfX2Zzd2FiNjQoeCkKKyNlbmRpZiAvKiBPUFRJTUlaRSAqLworCisKK3N0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKGNvbnN0KSkgX191MTYgX19mc3dhYjE2KF9fdTE2IHgpCit7CisJcmV0dXJuIF9fYXJjaF9fc3dhYjE2KHgpOworfQorc3RhdGljIF9faW5saW5lX18gX191MTYgX19zd2FiMTZwKF9fdTE2ICp4KQoreworCXJldHVybiBfX2FyY2hfX3N3YWIxNnAoeCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc3dhYjE2cyhfX3UxNiAqYWRkcikKK3sKKwlfX2FyY2hfX3N3YWIxNnMoYWRkcik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKGNvbnN0KSkgX191MzIgX19mc3dhYjMyKF9fdTMyIHgpCit7CisJcmV0dXJuIF9fYXJjaF9fc3dhYjMyKHgpOworfQorc3RhdGljIF9faW5saW5lX18gX191MzIgX19zd2FiMzJwKF9fdTMyICp4KQoreworCXJldHVybiBfX2FyY2hfX3N3YWIzMnAoeCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc3dhYjMycyhfX3UzMiAqYWRkcikKK3sKKwlfX2FyY2hfX3N3YWIzMnMoYWRkcik7Cit9CisKKyNpZmRlZiBfX0JZVEVPUkRFUl9IQVNfVTY0X18KK3N0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKGNvbnN0KSkgX191NjQgX19mc3dhYjY0KF9fdTY0IHgpCit7CisjICBpZmRlZiBfX1NXQUJfNjRfVEhSVV8zMl9fCisJX191MzIgaCA9IHggPj4gMzI7CisJX191MzIgbCA9IHggJiAoKDFVTEw8PDMyKS0xKTsKKwlyZXR1cm4gKCgoX191NjQpX19zd2FiMzIobCkpIDw8IDMyKSB8ICgoX191NjQpKF9fc3dhYjMyKGgpKSk7CisjICBlbHNlCisJcmV0dXJuIF9fYXJjaF9fc3dhYjY0KHgpOworIyAgZW5kaWYKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTY0IF9fc3dhYjY0cChfX3U2NCAqeCkKK3sKKwlyZXR1cm4gX19hcmNoX19zd2FiNjRwKHgpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWI2NHMoX191NjQgKmFkZHIpCit7CisJX19hcmNoX19zd2FiNjRzKGFkZHIpOworfQorI2VuZGlmIC8qIF9fQllURU9SREVSX0hBU19VNjRfXyAqLworCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQorI2RlZmluZSBzd2FiMTYgX19zd2FiMTYKKyNkZWZpbmUgc3dhYjMyIF9fc3dhYjMyCisjZGVmaW5lIHN3YWI2NCBfX3N3YWI2NAorI2RlZmluZSBzd2FiMTZwIF9fc3dhYjE2cAorI2RlZmluZSBzd2FiMzJwIF9fc3dhYjMycAorI2RlZmluZSBzd2FiNjRwIF9fc3dhYjY0cAorI2RlZmluZSBzd2FiMTZzIF9fc3dhYjE2cworI2RlZmluZSBzd2FiMzJzIF9fc3dhYjMycworI2RlZmluZSBzd2FiNjRzIF9fc3dhYjY0cworI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9jb25maWcuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxOTRjYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvY29uZmlnLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9MSU5VWF9DT05GSUdfSAorI2RlZmluZSBfTElOVVhfQ09ORklHX0gKKworLyogI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+ICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9jdHlwZS5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9jdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYTM2MzkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2N0eXBlLmgKQEAgLTAsMCArMSw1NCBAQAorI2lmbmRlZiBfTElOVVhfQ1RZUEVfSAorI2RlZmluZSBfTElOVVhfQ1RZUEVfSAorCisvKgorICogTk9URSEgVGhpcyBjdHlwZSBkb2VzIG5vdCBoYW5kbGUgRU9GIGxpa2UgdGhlIHN0YW5kYXJkIEMKKyAqIGxpYnJhcnkgaXMgcmVxdWlyZWQgdG8uCisgKi8KKworI2RlZmluZSBfVQkweDAxCS8qIHVwcGVyICovCisjZGVmaW5lIF9MCTB4MDIJLyogbG93ZXIgKi8KKyNkZWZpbmUgX0QJMHgwNAkvKiBkaWdpdCAqLworI2RlZmluZSBfQwkweDA4CS8qIGNudHJsICovCisjZGVmaW5lIF9QCTB4MTAJLyogcHVuY3QgKi8KKyNkZWZpbmUgX1MJMHgyMAkvKiB3aGl0ZSBzcGFjZSAoc3BhY2UvbGYvdGFiKSAqLworI2RlZmluZSBfWAkweDQwCS8qIGhleCBkaWdpdCAqLworI2RlZmluZSBfU1AJMHg4MAkvKiBoYXJkIHNwYWNlICgweDIwKSAqLworCitleHRlcm4gdW5zaWduZWQgY2hhciBfY3R5cGVbXTsKKworI2RlZmluZSBfX2lzbWFzayh4KSAoX2N0eXBlWyhpbnQpKHVuc2lnbmVkIGNoYXIpKHgpXSkKKworI2RlZmluZSBpc2FsbnVtKGMpCSgoX19pc21hc2soYykmKF9VfF9MfF9EKSkgIT0gMCkKKyNkZWZpbmUgaXNhbHBoYShjKQkoKF9faXNtYXNrKGMpJihfVXxfTCkpICE9IDApCisjZGVmaW5lIGlzY250cmwoYykJKChfX2lzbWFzayhjKSYoX0MpKSAhPSAwKQorI2RlZmluZSBpc2RpZ2l0KGMpCSgoX19pc21hc2soYykmKF9EKSkgIT0gMCkKKyNkZWZpbmUgaXNncmFwaChjKQkoKF9faXNtYXNrKGMpJihfUHxfVXxfTHxfRCkpICE9IDApCisjZGVmaW5lIGlzbG93ZXIoYykJKChfX2lzbWFzayhjKSYoX0wpKSAhPSAwKQorI2RlZmluZSBpc3ByaW50KGMpCSgoX19pc21hc2soYykmKF9QfF9VfF9MfF9EfF9TUCkpICE9IDApCisjZGVmaW5lIGlzcHVuY3QoYykJKChfX2lzbWFzayhjKSYoX1ApKSAhPSAwKQorI2RlZmluZSBpc3NwYWNlKGMpCSgoX19pc21hc2soYykmKF9TKSkgIT0gMCkKKyNkZWZpbmUgaXN1cHBlcihjKQkoKF9faXNtYXNrKGMpJihfVSkpICE9IDApCisjZGVmaW5lIGlzeGRpZ2l0KGMpCSgoX19pc21hc2soYykmKF9EfF9YKSkgIT0gMCkKKworI2RlZmluZSBpc2FzY2lpKGMpICgoKHVuc2lnbmVkIGNoYXIpKGMpKTw9MHg3ZikKKyNkZWZpbmUgdG9hc2NpaShjKSAoKCh1bnNpZ25lZCBjaGFyKShjKSkmMHg3ZikKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIF9fdG9sb3dlcih1bnNpZ25lZCBjaGFyIGMpCit7CisJaWYgKGlzdXBwZXIoYykpCisJCWMgLT0gJ0EnLSdhJzsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIF9fdG91cHBlcih1bnNpZ25lZCBjaGFyIGMpCit7CisJaWYgKGlzbG93ZXIoYykpCisJCWMgLT0gJ2EnLSdBJzsKKwlyZXR1cm4gYzsKK30KKworI2RlZmluZSB0b2xvd2VyKGMpIF9fdG9sb3dlcihjKQorI2RlZmluZSB0b3VwcGVyKGMpIF9fdG91cHBlcihjKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvcG9zaXhfdHlwZXMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvcG9zaXhfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDM3ZTFmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oCkBAIC0wLDAgKzEsNDggQEAKKyNpZm5kZWYgX0xJTlVYX1BPU0lYX1RZUEVTX0gKKyNkZWZpbmUgX0xJTlVYX1BPU0lYX1RZUEVTX0gKKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorCisvKgorICogVGhpcyBhbGxvd3MgZm9yIDEwMjQgZmlsZSBkZXNjcmlwdG9yczogaWYgTlJfT1BFTiBpcyBldmVyIGdyb3duCisgKiBiZXlvbmQgdGhhdCB5b3UnbGwgaGF2ZSB0byBjaGFuZ2UgdGhpcyB0b28uIEJ1dCAxMDI0IGZkJ3Mgc2VlbSB0byBiZQorICogZW5vdWdoIGV2ZW4gZm9yIHN1Y2ggInJlYWwiIHVuaWNlcyBsaWtlIE9TRi8xLCBzbyBob3BlZnVsbHkgdGhpcyBpcworICogb25lIGxpbWl0IHRoYXQgZG9lc24ndCBoYXZlIHRvIGJlIGNoYW5nZWQgW2FnYWluXS4KKyAqCisgKiBOb3RlIHRoYXQgUE9TSVggd2FudHMgdGhlIEZEX0NMRUFSKGZkLGZkc2V0cCkgZGVmaW5lcyB0byBiZSBpbgorICogPHN5cy90aW1lLmg+IChhbmQgdGh1cyA8bGludXgvdGltZS5oPikgLSBidXQgdGhpcyBpcyBhIG1vcmUgbG9naWNhbAorICogcGxhY2UgZm9yIHRoZW0uIFNvbHZlZCBieSBoYXZpbmcgZHVtbXkgZGVmaW5lcyBpbiA8c3lzL3RpbWUuaD4uCisgKi8KKworLyoKKyAqIFRob3NlIG1hY3JvcyBtYXkgaGF2ZSBiZWVuIGRlZmluZWQgaW4gPGdudS90eXBlcy5oPi4gQnV0IHdlIGFsd2F5cworICogdXNlIHRoZSBvbmVzIGhlcmUuCisgKi8KKyN1bmRlZiBfX05GREJJVFMKKyNkZWZpbmUgX19ORkRCSVRTCSg4ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCisjdW5kZWYgX19GRF9TRVRTSVpFCisjZGVmaW5lIF9fRkRfU0VUU0laRQkxMDI0CisKKyN1bmRlZiBfX0ZEU0VUX0xPTkdTCisjZGVmaW5lIF9fRkRTRVRfTE9OR1MJKF9fRkRfU0VUU0laRS9fX05GREJJVFMpCisKKyN1bmRlZiBfX0ZERUxUCisjZGVmaW5lCV9fRkRFTFQoZCkJKChkKSAvIF9fTkZEQklUUykKKworI3VuZGVmIF9fRkRNQVNLCisjZGVmaW5lCV9fRkRNQVNLKGQpCSgxVUwgPDwgKChkKSAlIF9fTkZEQklUUykpCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGZkc19iaXRzIFtfX0ZEU0VUX0xPTkdTXTsKK30gX19rZXJuZWxfZmRfc2V0OworCisvKiBUeXBlIG9mIGEgc2lnbmFsIGhhbmRsZXIuICAqLwordHlwZWRlZiB2b2lkICgqX19rZXJuZWxfc2lnaGFuZGxlcl90KShpbnQpOworCisvKiBUeXBlIG9mIGEgU1lTViBJUEMga2V5LiAgKi8KK3R5cGVkZWYgaW50IF9fa2VybmVsX2tleV90OworCisjaW5jbHVkZSA8YXNtL3Bvc2l4X3R5cGVzLmg+CisKKyNlbmRpZiAvKiBfTElOVVhfUE9TSVhfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9zdGF0LmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOTQyMmNiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9zdGF0LmgKQEAgLTAsMCArMSwxMzIgQEAKKyNpZm5kZWYgX0xJTlVYX1NUQVRfSAorI2RlZmluZSBfTElOVVhfU1RBVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgU19JRk1UICAwMDE3MDAwMAkvKiB0eXBlIG9mIGZpbGUgKi8KKyNkZWZpbmUgU19JRlNPQ0sgMDE0MDAwMAkvKiBuYW1lZCBzb2NrZXQgKi8KKyNkZWZpbmUgU19JRkxOSwkgMDEyMDAwMAkvKiBzeW1ib2xpYyBsaW5rICovCisjZGVmaW5lIFNfSUZSRUcgIDAxMDAwMDAJLyogcmVndWxhciAqLworI2RlZmluZSBTX0lGQkxLICAwMDYwMDAwCS8qIGJsb2NrIHNwZWNpYWwgKi8KKyNkZWZpbmUgU19JRkRJUiAgMDA0MDAwMAkvKiBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgU19JRkNIUiAgMDAyMDAwMAkvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLworI2RlZmluZSBTX0lGSUZPICAwMDEwMDAwCS8qIGZpZm8gKi8KKyNkZWZpbmUgU19JU1VJRCAgMDAwNDAwMAkvKiBzZXQgdXNlciBpZCBvbiBleGVjdXRpb24gKi8KKyNkZWZpbmUgU19JU0dJRCAgMDAwMjAwMAkvKiBzZXQgZ3JvdXAgaWQgb24gZXhlY3V0aW9uICovCisjZGVmaW5lIFNfSVNWVFggIDAwMDEwMDAJLyogc2F2ZSBzd2FwcGVkIHRleHQgZXZlbiBhZnRlciB1c2UgKi8KKworI2RlZmluZSBTX0lTTE5LKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGTE5LKQorI2RlZmluZSBTX0lTUkVHKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGUkVHKQorI2RlZmluZSBTX0lTRElSKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGRElSKQorI2RlZmluZSBTX0lTQ0hSKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGQ0hSKQorI2RlZmluZSBTX0lTQkxLKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGQkxLKQorI2RlZmluZSBTX0lTRklGTyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRklGTykKKyNkZWZpbmUgU19JU1NPQ0sobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZTT0NLKQorCisjZGVmaW5lIFNfSVJXWFUgMDA3MDAJCS8qIHJ3eCBmb3Igb3duZXIgKi8KKyNkZWZpbmUgU19JUlVTUiAwMDQwMAkJLyogcmVhZCBwZXJtaXNzaW9uIGZvciBvd25lciAqLworI2RlZmluZSBTX0lXVVNSIDAwMjAwCQkvKiB3cml0ZSBwZXJtaXNzaW9uIGZvciBvd25lciAqLworI2RlZmluZSBTX0lYVVNSIDAwMTAwCQkvKiBleGVjdXRlL3NlYXJjaCBwZXJtaXNzaW9uIGZvciBvd25lciAqLworCisjZGVmaW5lIFNfSVJXWEcgMDAwNzAJCS8qIHJ3eCBmb3IgZ3JvdXAgKi8KKyNkZWZpbmUgU19JUkdSUCAwMDA0MAkJLyogcmVhZCBwZXJtaXNzaW9uIGZvciBncm91cCAqLworI2RlZmluZSBTX0lXR1JQIDAwMDIwCQkvKiB3cml0ZSBwZXJtaXNzaW9uIGZvciBncm91cCAqLworI2RlZmluZSBTX0lYR1JQIDAwMDEwCQkvKiBleGVjdXRlL3NlYXJjaCBwZXJtaXNzaW9uIGZvciBncm91cCAqLworCisjZGVmaW5lIFNfSVJXWE8gMDAwMDcJCS8qIHJ3eCBmb3Igb3RoZXIgKi8KKyNkZWZpbmUgU19JUk9USCAwMDAwNAkJLyogcmVhZCBwZXJtaXNzaW9uIGZvciBvdGhlciAqLworI2RlZmluZSBTX0lXT1RIIDAwMDAyCQkvKiByZWFkIHBlcm1pc3Npb24gZm9yIG90aGVyICovCisjZGVmaW5lIFNfSVhPVEggMDAwMDEJCS8qIGV4ZWN1dGUvc2VhcmNoIHBlcm1pc3Npb24gZm9yIG90aGVyICovCisKKyNpZmRlZglfX1BQQ19fCisKK3N0cnVjdCBzdGF0IHsKKwlkZXZfdAkJc3RfZGV2OwkJLyogZmlsZSBzeXN0ZW0gaWQgKi8KKwlpbm9fdAkJc3RfaW5vOwkJLyogZmlsZSBpZCAqLworCW1vZGVfdAkJc3RfbW9kZTsJLyogb3duZXJzaGlwL3Byb3RlY3Rpb24gKi8KKwlubGlua190CQlzdF9ubGluazsJLyogbnVtYmVyIG9mIGxpbmtzICovCisJdWlkX3QgCQlzdF91aWQ7CQkvKiB1c2VyIGlkICovCisJZ2lkX3QgCQlzdF9naWQ7CQkvKiBncm91cCBpZCAqLworCWRldl90CQlzdF9yZGV2OworCW9mZl90CQlzdF9zaXplOwkvKiBmaWxlIHNpemUgaW4gIyBvZiBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgIAlzdF9ibGtzaXplOwkvKiBibG9jayBzaXplICovCisJdW5zaWduZWQgbG9uZyAgCXN0X2Jsb2NrczsJLyogZmlsZSBzaXplIGluICMgb2YgYmxvY2tzICovCisJdW5zaWduZWQgbG9uZyAgCXN0X2F0aW1lOwkvKiB0aW1lIGZpbGUgd2FzIGxhc3QgYWNjZXNzZWQgKi8KKwl1bnNpZ25lZCBsb25nICAJX191bnVzZWQxOworCXVuc2lnbmVkIGxvbmcgIAlzdF9tdGltZTsJLyogdGltZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkICovCisJdW5zaWduZWQgbG9uZyAgCV9fdW51c2VkMjsKKwl1bnNpZ25lZCBsb25nICAJc3RfY3RpbWU7CS8qIHRpbWUgZmlsZSBzdGF0dXMgd2FzIGxhc3QgY2hhbmdlZCAqLworCXVuc2lnbmVkIGxvbmcgIAlfX3VudXNlZDM7CisJdW5zaWduZWQgbG9uZyAgCV9fdW51c2VkNDsKKwl1bnNpZ25lZCBsb25nICAJX191bnVzZWQ1OworfTsKKworI2VuZGlmCS8qIF9fUFBDX18gKi8KKworI2lmIGRlZmluZWQgKF9fQVJNX18pIHx8IGRlZmluZWQgKF9fSTM4Nl9fKSB8fCBkZWZpbmVkIChfX002OEtfXykgfHwgZGVmaW5lZCAoX19ibGFja2Zpbl9fKQorCitzdHJ1Y3Qgc3RhdCB7CisJdW5zaWduZWQgc2hvcnQgc3RfZGV2OworCXVuc2lnbmVkIHNob3J0IF9fcGFkMTsKKwl1bnNpZ25lZCBsb25nIHN0X2lubzsKKwl1bnNpZ25lZCBzaG9ydCBzdF9tb2RlOworCXVuc2lnbmVkIHNob3J0IHN0X25saW5rOworCXVuc2lnbmVkIHNob3J0IHN0X3VpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9naWQ7CisJdW5zaWduZWQgc2hvcnQgc3RfcmRldjsKKwl1bnNpZ25lZCBzaG9ydCBfX3BhZDI7CisJdW5zaWduZWQgbG9uZyAgc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nICBzdF9ibGtzaXplOworCXVuc2lnbmVkIGxvbmcgIHN0X2Jsb2NrczsKKwl1bnNpZ25lZCBsb25nICBzdF9hdGltZTsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDE7CisJdW5zaWduZWQgbG9uZyAgc3RfbXRpbWU7CisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQyOworCXVuc2lnbmVkIGxvbmcgIHN0X2N0aW1lOworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkMzsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDQ7CisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQ1OworfTsKKworI2VuZGlmCS8qIF9fQVJNX18gKi8KKworI2lmIGRlZmluZWQgKF9fTUlQU19fKQorCitzdHJ1Y3Qgc3RhdCB7CisJZGV2X3QgICAgICAgICAgIHN0X2RldjsKKwlsb25nICAgICAgICAgICAgc3RfcGFkMVszXTsKKwlpbm9fdCAgICAgICAgICAgc3RfaW5vOworCW1vZGVfdCAgICAgICAgICBzdF9tb2RlOworCW5saW5rX3QgICAgICAgICBzdF9ubGluazsKKwl1aWRfdCAgICAgICAgICAgc3RfdWlkOworCWdpZF90ICAgICAgICAgICBzdF9naWQ7CisJZGV2X3QgICAgICAgICAgIHN0X3JkZXY7CisJbG9uZyAgICAgICAgICAgIHN0X3BhZDJbMl07CisJb2ZmX3QgICAgICAgICAgIHN0X3NpemU7CisJbG9uZyAgICAgICAgICAgIHN0X3BhZDM7CisJLyoKKwkgKiBBY3R1YWxseSB0aGlzIHNob3VsZCBiZSB0aW1lc3RydWNfdCBzdF9hdGltZSwgc3RfbXRpbWUgYW5kIHN0X2N0aW1lCisJICogYnV0IHdlIGRvbid0IGhhdmUgaXQgdW5kZXIgTGludXguCisJICovCisJdGltZV90ICAgICAgICAgIHN0X2F0aW1lOworCWxvbmcgICAgICAgICAgICByZXNlcnZlZDA7CisJdGltZV90ICAgICAgICAgIHN0X210aW1lOworCWxvbmcgICAgICAgICAgICByZXNlcnZlZDE7CisJdGltZV90ICAgICAgICAgIHN0X2N0aW1lOworCWxvbmcgICAgICAgICAgICByZXNlcnZlZDI7CisJbG9uZyAgICAgICAgICAgIHN0X2Jsa3NpemU7CisJbG9uZyAgICAgICAgICAgIHN0X2Jsb2NrczsKKwlsb25nICAgICAgICAgICAgc3RfcGFkNFsxNF07Cit9OworCisjZW5kaWYJLyogX19NSVBTX18gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9zdGRkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWUzNGMyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9zdGRkZWYuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9MSU5VWF9TVERERUZfSAorI2RlZmluZSBfTElOVVhfU1REREVGX0gKKworI3VuZGVmIE5VTEwKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBOVUxMIDAKKyNlbHNlCisjZGVmaW5lIE5VTEwgKCh2b2lkICopMCkKKyNlbmRpZgorCisjaWZuZGVmIF9TSVpFX1QKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2VuZGlmCisKKyN1bmRlZiBvZmZzZXRvZgorI2RlZmluZSBvZmZzZXRvZihUWVBFLCBNRU1CRVIpICgoc2l6ZV90KSAmKChUWVBFICopMCktPk1FTUJFUikKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0cmluZy5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjM5MDM5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9zdHJpbmcuaApAQCAtMCwwICsxLDg5IEBACisjaWZuZGVmIF9MSU5VWF9TVFJJTkdfSF8KKyNkZWZpbmUgX0xJTlVYX1NUUklOR19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JLyogZm9yIHNpemVfdCAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBmb3IgTlVMTCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBjaGFyICogX19fc3RydG9rOworZXh0ZXJuIGNoYXIgKiBzdHJwYnJrKGNvbnN0IGNoYXIgKixjb25zdCBjaGFyICopOworZXh0ZXJuIGNoYXIgKiBzdHJ0b2soY2hhciAqLGNvbnN0IGNoYXIgKik7CitleHRlcm4gY2hhciAqIHN0cnNlcChjaGFyICoqLGNvbnN0IGNoYXIgKik7CitleHRlcm4gX19rZXJuZWxfc2l6ZV90IHN0cnNwbihjb25zdCBjaGFyICosY29uc3QgY2hhciAqKTsKKworCisvKgorICogSW5jbHVkZSBtYWNoaW5lIHNwZWNpZmljIGlubGluZSByb3V0aW5lcworICovCisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkNQWQorZXh0ZXJuIGNoYXIgKiBzdHJjcHkoY2hhciAqLGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTkNQWQorZXh0ZXJuIGNoYXIgKiBzdHJuY3B5KGNoYXIgKixjb25zdCBjaGFyICosIF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ0FUCitleHRlcm4gY2hhciAqIHN0cmNhdChjaGFyICosIGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTkNBVAorZXh0ZXJuIGNoYXIgKiBzdHJuY2F0KGNoYXIgKiwgY29uc3QgY2hhciAqLCBfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkNNUAorZXh0ZXJuIGludCBzdHJjbXAoY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTkNNUAorZXh0ZXJuIGludCBzdHJuY21wKGNvbnN0IGNoYXIgKixjb25zdCBjaGFyICosX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmIDAgLyogbm90IHVzZWQgLSB3YXM6ICNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTklDTVAgKi8KK2V4dGVybiBpbnQgc3RybmljbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ0hSCitleHRlcm4gY2hhciAqIHN0cmNocihjb25zdCBjaGFyICosaW50KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJSQ0hSCitleHRlcm4gY2hhciAqIHN0cnJjaHIoY29uc3QgY2hhciAqLGludCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSU1RSCitleHRlcm4gY2hhciAqIHN0cnN0cihjb25zdCBjaGFyICosY29uc3QgY2hhciAqKTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJMRU4KK2V4dGVybiBfX2tlcm5lbF9zaXplX3Qgc3RybGVuKGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTkxFTgorZXh0ZXJuIF9fa2VybmVsX3NpemVfdCBzdHJubGVuKGNvbnN0IGNoYXIgKixfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkRVUAorZXh0ZXJuIGNoYXIgKiBzdHJkdXAoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJTV0FCCitleHRlcm4gY2hhciAqIHN0cnN3YWIoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTVNFVAorZXh0ZXJuIHZvaWQgKiBtZW1zZXQodm9pZCAqLGludCxfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTUNQWQorZXh0ZXJuIHZvaWQgKiBtZW1jcHkodm9pZCAqLGNvbnN0IHZvaWQgKixfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTU1PVkUKK2V4dGVybiB2b2lkICogbWVtbW92ZSh2b2lkICosY29uc3Qgdm9pZCAqLF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNU0NBTgorZXh0ZXJuIHZvaWQgKiBtZW1zY2FuKHZvaWQgKixpbnQsX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DTVAKK2V4dGVybiBpbnQgbWVtY21wKGNvbnN0IHZvaWQgKixjb25zdCB2b2lkICosX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DSFIKK2V4dGVybiB2b2lkICogbWVtY2hyKGNvbnN0IHZvaWQgKixpbnQsX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0xJTlVYX1NUUklOR19IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC90aW1lLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZjEyYjk5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC90aW1lLmgKQEAgLTAsMCArMSwxNTggQEAKKyNpZm5kZWYgX0xJTlVYX1RJTUVfSAorI2RlZmluZSBfTElOVVhfVElNRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIF9ERUZVTihhLGIsYykgYShjKQorI2RlZmluZSBfQ09OU1QgY29uc3QKKyNkZWZpbmUgX0FORCAsCisKKyNkZWZpbmUgX1JFRU5UX09OTFkKKworI2RlZmluZSBTRUNTUEVSTUlOCTYwTAorI2RlZmluZSBNSU5TUEVSSE9VUgk2MEwKKyNkZWZpbmUgSE9VUlNQRVJEQVkJMjRMCisjZGVmaW5lIFNFQ1NQRVJIT1VSCShTRUNTUEVSTUlOICogTUlOU1BFUkhPVVIpCisjZGVmaW5lIFNFQ1NQRVJEQVkJKFNFQ1NQRVJIT1VSICogSE9VUlNQRVJEQVkpCisjZGVmaW5lIERBWVNQRVJXRUVLCTcKKyNkZWZpbmUgTU9OU1BFUllFQVIJMTIKKworI2RlZmluZSBZRUFSX0JBU0UJMTkwMAorI2RlZmluZSBFUE9DSF9ZRUFSICAgICAgMTk3MAorI2RlZmluZSBFUE9DSF9XREFZICAgICAgNAorCisjZGVmaW5lIGlzbGVhcCh5KSAoKCgoeSkgJSA0KSA9PSAwICYmICgoeSkgJSAxMDApICE9IDApIHx8ICgoeSkgJSA0MDApID09IDApCisKKworLyogVXNlZCBieSBvdGhlciB0aW1lIGZ1bmN0aW9ucy4gICovCitzdHJ1Y3QgdG0geworICAgIGludCB0bV9zZWM7ICAgICAgICAgICAgICAgICAgIC8qIFNlY29uZHMuICAgICBbMC02MF0gKDEgbGVhcCBzZWNvbmQpICovCisgICAgaW50IHRtX21pbjsgICAgICAgICAgICAgICAgICAgLyogTWludXRlcy4gICAgIFswLTU5XSAqLworICAgIGludCB0bV9ob3VyOyAgICAgICAgICAgICAgICAgIC8qIEhvdXJzLiAgICAgICBbMC0yM10gKi8KKyAgICBpbnQgdG1fbWRheTsgICAgICAgICAgICAgICAgICAvKiBEYXkuICAgICAgICAgWzEtMzFdICovCisgICAgaW50IHRtX21vbjsgICAgICAgICAgICAgICAgICAgLyogTW9udGguICAgICAgIFswLTExXSAqLworICAgIGludCB0bV95ZWFyOyAgICAgICAgICAgICAgICAgIC8qIFllYXIgLSAxOTAwLiAgKi8KKyAgICBpbnQgdG1fd2RheTsgICAgICAgICAgICAgICAgICAvKiBEYXkgb2Ygd2Vlay4gWzAtNl0gKi8KKyAgICBpbnQgdG1feWRheTsgICAgICAgICAgICAgICAgICAvKiBEYXlzIGluIHllYXIuWzAtMzY1XSAqLworICAgIGludCB0bV9pc2RzdDsgICAgICAgICAgICAgICAgIC8qIERTVC4gICAgICAgICBbLTEvMC8xXSovCisKKyMgaWZkZWYgX19VU0VfQlNECisgICAgbG9uZyBpbnQgdG1fZ210b2ZmOyAgICAgICAgICAgLyogU2Vjb25kcyBlYXN0IG9mIFVUQy4gICovCisgICAgX19jb25zdCBjaGFyICp0bV96b25lOyAgICAgICAgLyogVGltZXpvbmUgYWJicmV2aWF0aW9uLiAgKi8KKyMgZWxzZQorICAgIGxvbmcgaW50IF9fdG1fZ210b2ZmOyAgICAgICAgIC8qIFNlY29uZHMgZWFzdCBvZiBVVEMuICAqLworICAgIF9fY29uc3QgY2hhciAqX190bV96b25lOyAgICAgIC8qIFRpbWV6b25lIGFiYnJldmlhdGlvbi4gICovCisjIGVuZGlmCit9OworCitzdGF0aWMgaW5saW5lIGNoYXIgKgorX0RFRlVOIChhc2N0aW1lX3IsICh0aW1fcCwgcmVzdWx0KSwKKwlfQ09OU1Qgc3RydWN0IHRtICp0aW1fcCBfQU5ECisJY2hhciAqcmVzdWx0KQoreworICAgIHN0YXRpYyBfQ09OU1QgY2hhciBkYXlfbmFtZVs3XVszXSA9IHsKKwkiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IgorICAgIH07CisgICAgc3RhdGljIF9DT05TVCBjaGFyIG1vbl9uYW1lWzEyXVszXSA9IHsKKwkiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAorCSJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIKKyAgICB9OworCisgICAgc3ByaW50ZiAocmVzdWx0LCAiJS4zcyAlLjNzICUuMmQgJS4yZDolLjJkOiUuMmQgJWRcbiIsCisJICAgIGRheV9uYW1lW3RpbV9wLT50bV93ZGF5XSwKKwkgICAgbW9uX25hbWVbdGltX3AtPnRtX21vbl0sCisJICAgIHRpbV9wLT50bV9tZGF5LCB0aW1fcC0+dG1faG91ciwgdGltX3AtPnRtX21pbiwKKwkgICAgdGltX3AtPnRtX3NlYywgMTkwMCArIHRpbV9wLT50bV95ZWFyKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0bSAqCitfREVGVU4gKGxvY2FsdGltZV9yLCAodGltX3AsIHJlcyksCisJX0NPTlNUIHRpbWVfdCAqIHRpbV9wIF9BTkQKKwlzdHJ1Y3QgdG0gKnJlcykKK3sKKyAgICBzdGF0aWMgX0NPTlNUIGludCBtb25fbGVuZ3Roc1syXVtNT05TUEVSWUVBUl0gPSB7CisgICAgICB7MzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMX0sCisgICAgICB7MzEsIDI5LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMX0KKyAgICB9IDsKKworICAgIHN0YXRpYyBfQ09OU1QgaW50IHllYXJfbGVuZ3Roc1syXSA9IHsKKyAgICAgIDM2NSwKKyAgICAgIDM2NgorICAgIH0gOworCisgICAgbG9uZyBkYXlzLCByZW07CisgICAgaW50IHk7CisgICAgaW50IHlsZWFwOworICAgIF9DT05TVCBpbnQgKmlwOworCisgICAgZGF5cyA9ICgobG9uZykgKnRpbV9wKSAvIFNFQ1NQRVJEQVk7CisgICAgcmVtID0gKChsb25nKSAqdGltX3ApICUgU0VDU1BFUkRBWTsKKyAgICB3aGlsZSAocmVtIDwgMCkKKyAgICB7CisJcmVtICs9IFNFQ1NQRVJEQVk7CisJLS1kYXlzOworICAgIH0KKyAgICB3aGlsZSAocmVtID49IFNFQ1NQRVJEQVkpCisgICAgeworCXJlbSAtPSBTRUNTUEVSREFZOworCSsrZGF5czsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIGhvdXIsIG1pbiwgYW5kIHNlYyAqLworICAgIHJlcy0+dG1faG91ciA9IChpbnQpIChyZW0gLyBTRUNTUEVSSE9VUik7CisgICAgcmVtICU9IFNFQ1NQRVJIT1VSOworICAgIHJlcy0+dG1fbWluID0gKGludCkgKHJlbSAvIFNFQ1NQRVJNSU4pOworICAgIHJlcy0+dG1fc2VjID0gKGludCkgKHJlbSAlIFNFQ1NQRVJNSU4pOworCisgICAgLyogY29tcHV0ZSBkYXkgb2Ygd2VlayAqLworICAgIGlmICgocmVzLT50bV93ZGF5ID0gKChFUE9DSF9XREFZICsgZGF5cykgJSBEQVlTUEVSV0VFSykpIDwgMCkKKwlyZXMtPnRtX3dkYXkgKz0gREFZU1BFUldFRUs7CisKKyAgICAvKiBjb21wdXRlIHllYXIgJiBkYXkgb2YgeWVhciAqLworICAgIHkgPSBFUE9DSF9ZRUFSOworICAgIGlmIChkYXlzID49IDApCisgICAgeworCWZvciAoOzspCisJeworCSAgICB5bGVhcCA9IGlzbGVhcCh5KTsKKwkgICAgaWYgKGRheXMgPCB5ZWFyX2xlbmd0aHNbeWxlYXBdKQorCQlicmVhazsKKwkgICAgeSsrOworCSAgICBkYXlzIC09IHllYXJfbGVuZ3Roc1t5bGVhcF07CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCWRvCisJeworCSAgICAtLXk7CisJICAgIHlsZWFwID0gaXNsZWFwKHkpOworCSAgICBkYXlzICs9IHllYXJfbGVuZ3Roc1t5bGVhcF07CisJfSB3aGlsZSAoZGF5cyA8IDApOworICAgIH0KKworICAgIHJlcy0+dG1feWVhciA9IHkgLSBZRUFSX0JBU0U7CisgICAgcmVzLT50bV95ZGF5ID0gZGF5czsKKyAgICBpcCA9IG1vbl9sZW5ndGhzW3lsZWFwXTsKKyAgICBmb3IgKHJlcy0+dG1fbW9uID0gMDsgZGF5cyA+PSBpcFtyZXMtPnRtX21vbl07ICsrcmVzLT50bV9tb24pCisJZGF5cyAtPSBpcFtyZXMtPnRtX21vbl07CisgICAgcmVzLT50bV9tZGF5ID0gZGF5cyArIDE7CisKKyAgICAvKiBzZXQgZGF5bGlnaHQgc2F2aW5nIHRpbWUgZmxhZyAqLworICAgIHJlcy0+dG1faXNkc3QgPSAtMTsKKworICAgIHJldHVybiAocmVzKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICoKK19ERUZVTiAoY3RpbWVfciwgKHRpbV9wLCByZXN1bHQpLAorCV9DT05TVCB0aW1lX3QgKiB0aW1fcCBfQU5ECisJY2hhciAqIHJlc3VsdCkKKworeworICAgIHN0cnVjdCB0bSB0bTsKKyAgICByZXR1cm4gYXNjdGltZV9yIChsb2NhbHRpbWVfciAodGltX3AsICZ0bSksIHJlc3VsdCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC90eXBlcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNDgwOGYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKQEAgLTAsMCArMSwxMzAgQEAKKyNpZm5kZWYgX0xJTlVYX1RZUEVTX0gKKyNkZWZpbmUgX0xJTlVYX1RZUEVTX0gKKworI2lmZGVmCV9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvcG9zaXhfdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmbmRlZiBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMKKwordHlwZWRlZiBfX2tlcm5lbF9mZF9zZXQJCWZkX3NldDsKK3R5cGVkZWYgX19rZXJuZWxfZGV2X3QJCWRldl90OwordHlwZWRlZiBfX2tlcm5lbF9pbm9fdAkJaW5vX3Q7Cit0eXBlZGVmIF9fa2VybmVsX21vZGVfdAkJbW9kZV90OwordHlwZWRlZiBfX2tlcm5lbF9ubGlua190CW5saW5rX3Q7Cit0eXBlZGVmIF9fa2VybmVsX29mZl90CQlvZmZfdDsKK3R5cGVkZWYgX19rZXJuZWxfcGlkX3QJCXBpZF90OwordHlwZWRlZiBfX2tlcm5lbF9kYWRkcl90CWRhZGRyX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2tleV90CQlrZXlfdDsKK3R5cGVkZWYgX19rZXJuZWxfc3VzZWNvbmRzX3QJc3VzZWNvbmRzX3Q7CisKKyNpZmRlZiBfX0tFUk5FTF9fCit0eXBlZGVmIF9fa2VybmVsX3VpZDMyX3QJdWlkX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2dpZDMyX3QJZ2lkX3Q7Cit0eXBlZGVmIF9fa2VybmVsX3VpZDE2X3QgICAgICAgIHVpZDE2X3Q7Cit0eXBlZGVmIF9fa2VybmVsX2dpZDE2X3QgICAgICAgIGdpZDE2X3Q7CisKKyNpZmRlZiBDT05GSUdfVUlEMTYKKy8qIFRoaXMgaXMgZGVmaW5lZCBieSBpbmNsdWRlL2FzbS17YXJjaH0vcG9zaXhfdHlwZXMuaCAqLwordHlwZWRlZiBfX2tlcm5lbF9vbGRfdWlkX3QJb2xkX3VpZF90OwordHlwZWRlZiBfX2tlcm5lbF9vbGRfZ2lkX3QJb2xkX2dpZF90OworI2VuZGlmIC8qIENPTkZJR19VSUQxNiAqLworCisvKiBsaWJjNSBpbmNsdWRlcyB0aGlzIGZpbGUgdG8gZGVmaW5lIHVpZF90LCB0aHVzIHVpZF90IGNhbiBuZXZlciBjaGFuZ2UKKyAqIHdoZW4gaXQgaXMgaW5jbHVkZWQgYnkgbm9uLWtlcm5lbCBjb2RlCisgKi8KKyNlbHNlCit0eXBlZGVmIF9fa2VybmVsX3VpZF90CQl1aWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfZ2lkX3QJCWdpZF90OworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykKK3R5cGVkZWYgX19rZXJuZWxfbG9mZl90CQlsb2ZmX3Q7CisjZW5kaWYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIGFsc28gcHJvdGVjdGVkIGJ5IGluZGl2aWR1YWwgaWZkZWZzIGZvcgorICogaGlzdG9yaWNhbCByZWFzb25zOgorICovCisjaWZuZGVmIF9TSVpFX1QKKyNkZWZpbmUgX1NJWkVfVAordHlwZWRlZiBfX2tlcm5lbF9zaXplX3QJCXNpemVfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9TU0laRV9UCisjZGVmaW5lIF9TU0laRV9UCit0eXBlZGVmIF9fa2VybmVsX3NzaXplX3QJc3NpemVfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9QVFJESUZGX1QKKyNkZWZpbmUgX1BUUkRJRkZfVAordHlwZWRlZiBfX2tlcm5lbF9wdHJkaWZmX3QJcHRyZGlmZl90OworI2VuZGlmCisKKyNpZm5kZWYgX1RJTUVfVAorI2RlZmluZSBfVElNRV9UCit0eXBlZGVmIF9fa2VybmVsX3RpbWVfdAkJdGltZV90OworI2VuZGlmCisKKyNpZm5kZWYgX0NMT0NLX1QKKyNkZWZpbmUgX0NMT0NLX1QKK3R5cGVkZWYgX19rZXJuZWxfY2xvY2tfdAljbG9ja190OworI2VuZGlmCisKKyNpZm5kZWYgX0NBRERSX1QKKyNkZWZpbmUgX0NBRERSX1QKK3R5cGVkZWYgX19rZXJuZWxfY2FkZHJfdAljYWRkcl90OworI2VuZGlmCisKKy8qIGJzZCAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1X2NoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQl1X3Nob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVfaW50OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCQl1X2xvbmc7CisKKy8qIHN5c3YgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdW5jaGFyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJdXNob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJCXVsb25nOworCisjaWZuZGVmIF9fQklUX1RZUEVTX0RFRklORURfXworI2RlZmluZSBfX0JJVF9UWVBFU19ERUZJTkVEX18KKwordHlwZWRlZgkJX191OAkJdV9pbnQ4X3Q7Cit0eXBlZGVmCQlfX3M4CQlpbnQ4X3Q7Cit0eXBlZGVmCQlfX3UxNgkJdV9pbnQxNl90OwordHlwZWRlZgkJX19zMTYJCWludDE2X3Q7Cit0eXBlZGVmCQlfX3UzMgkJdV9pbnQzMl90OwordHlwZWRlZgkJX19zMzIJCWludDMyX3Q7CisKKyNlbmRpZiAvKiAhKF9fQklUX1RZUEVTX0RFRklORURfXykgKi8KKwordHlwZWRlZgkJX191OAkJdWludDhfdDsKK3R5cGVkZWYJCV9fdTE2CQl1aW50MTZfdDsKK3R5cGVkZWYJCV9fdTMyCQl1aW50MzJfdDsKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykKK3R5cGVkZWYJCV9fdTY0CQl1aW50NjRfdDsKK3R5cGVkZWYJCV9fdTY0CQl1X2ludDY0X3Q7Cit0eXBlZGVmCQlfX3M2NAkJaW50NjRfdDsKKyNlbmRpZgorCisjZW5kaWYgLyogX19LRVJORUxfU1RSSUNUX05BTUVTICovCisKKy8qCisgKiBCZWxvdyBhcmUgdHJ1bHkgTGludXgtc3BlY2lmaWMgdHlwZXMgdGhhdCBzaG91bGQgbmV2ZXIgY29sbGlkZSB3aXRoCisgKiBhbnkgYXBwbGljYXRpb24vbGlicmFyeSB0aGF0IHdhbnRzIGxpbnV4L3R5cGVzLmguCisgKi8KKworc3RydWN0IHVzdGF0IHsKKwlfX2tlcm5lbF9kYWRkcl90CWZfdGZyZWU7CisJX19rZXJuZWxfaW5vX3QJCWZfdGlub2RlOworCWNoYXIJCQlmX2ZuYW1lWzZdOworCWNoYXIJCQlmX2ZwYWNrWzZdOworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9UWVBFU19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL21hbGxvYy5oIGIveC1sb2FkZXIvaW5jbHVkZS9tYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzE1NGIwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9tYWxsb2MuaApAQCAtMCwwICsxLDk0MiBAQAorLyoKKyAgQSB2ZXJzaW9uIG9mIG1hbGxvYy9mcmVlL3JlYWxsb2Mgd3JpdHRlbiBieSBEb3VnIExlYSBhbmQgcmVsZWFzZWQgdG8gdGhlCisgIHB1YmxpYyBkb21haW4uICBTZW5kIHF1ZXN0aW9ucy9jb21tZW50cy9jb21wbGFpbnRzL3BlcmZvcm1hbmNlIGRhdGEKKyAgdG8gZGxAY3Mub3N3ZWdvLmVkdQorCisqIFZFUlNJT04gMi42LjYgIFN1biBNYXIgIDUgMTk6MTA6MDMgMjAwMCAgRG91ZyBMZWEgIChkbCBhdCBnZWUpCisKKyAgIE5vdGU6IFRoZXJlIG1heSBiZSBhbiB1cGRhdGVkIHZlcnNpb24gb2YgdGhpcyBtYWxsb2Mgb2J0YWluYWJsZSBhdAorCSAgIGZ0cDovL2cub3N3ZWdvLmVkdS9wdWIvbWlzYy9tYWxsb2MuYworCSBDaGVjayBiZWZvcmUgaW5zdGFsbGluZyEKKworKiBXaHkgdXNlIHRoaXMgbWFsbG9jPworCisgIFRoaXMgaXMgbm90IHRoZSBmYXN0ZXN0LCBtb3N0IHNwYWNlLWNvbnNlcnZpbmcsIG1vc3QgcG9ydGFibGUsIG9yCisgIG1vc3QgdHVuYWJsZSBtYWxsb2MgZXZlciB3cml0dGVuLiBIb3dldmVyIGl0IGlzIGFtb25nIHRoZSBmYXN0ZXN0CisgIHdoaWxlIGFsc28gYmVpbmcgYW1vbmcgdGhlIG1vc3Qgc3BhY2UtY29uc2VydmluZywgcG9ydGFibGUgYW5kIHR1bmFibGUuCisgIENvbnNpc3RlbnQgYmFsYW5jZSBhY3Jvc3MgdGhlc2UgZmFjdG9ycyByZXN1bHRzIGluIGEgZ29vZCBnZW5lcmFsLXB1cnBvc2UKKyAgYWxsb2NhdG9yLiBGb3IgYSBoaWdoLWxldmVsIGRlc2NyaXB0aW9uLCBzZWUKKyAgICAgaHR0cDovL2cub3N3ZWdvLmVkdS9kbC9odG1sL21hbGxvYy5odG1sCisKKyogU3lub3BzaXMgb2YgcHVibGljIHJvdXRpbmVzCisKKyAgKE11Y2ggZnVsbGVyIGRlc2NyaXB0aW9ucyBhcmUgY29udGFpbmVkIGluIHRoZSBwcm9ncmFtIGRvY3VtZW50YXRpb24gYmVsb3cuKQorCisgIG1hbGxvYyhzaXplX3Qgbik7CisgICAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBuZXdseSBhbGxvY2F0ZWQgY2h1bmsgb2YgYXQgbGVhc3QgbiBieXRlcywgb3IgbnVsbAorICAgICBpZiBubyBzcGFjZSBpcyBhdmFpbGFibGUuCisgIGZyZWUoVm9pZF90KiBwKTsKKyAgICAgUmVsZWFzZSB0aGUgY2h1bmsgb2YgbWVtb3J5IHBvaW50ZWQgdG8gYnkgcCwgb3Igbm8gZWZmZWN0IGlmIHAgaXMgbnVsbC4KKyAgcmVhbGxvYyhWb2lkX3QqIHAsIHNpemVfdCBuKTsKKyAgICAgUmV0dXJuIGEgcG9pbnRlciB0byBhIGNodW5rIG9mIHNpemUgbiB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGRhdGEKKyAgICAgYXMgZG9lcyBjaHVuayBwIHVwIHRvIHRoZSBtaW5pbXVtIG9mIChuLCBwJ3Mgc2l6ZSkgYnl0ZXMsIG9yIG51bGwKKyAgICAgaWYgbm8gc3BhY2UgaXMgYXZhaWxhYmxlLiBUaGUgcmV0dXJuZWQgcG9pbnRlciBtYXkgb3IgbWF5IG5vdCBiZQorICAgICB0aGUgc2FtZSBhcyBwLiBJZiBwIGlzIG51bGwsIGVxdWl2YWxlbnQgdG8gbWFsbG9jLiAgVW5sZXNzIHRoZQorICAgICAjZGVmaW5lIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUyBiZWxvdyBpcyBzZXQsIHJlYWxsb2Mgd2l0aCBhCisgICAgIHNpemUgYXJndW1lbnQgb2YgemVybyAocmUpYWxsb2NhdGVzIGEgbWluaW11bS1zaXplZCBjaHVuay4KKyAgbWVtYWxpZ24oc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IG4pOworICAgICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGNodW5rIG9mIG4gYnl0ZXMsIGFsaWduZWQKKyAgICAgaW4gYWNjb3JkIHdpdGggdGhlIGFsaWdubWVudCBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSBhIHBvd2VyIG9mCisgICAgIHR3by4KKyAgdmFsbG9jKHNpemVfdCBuKTsKKyAgICAgRXF1aXZhbGVudCB0byBtZW1hbGlnbihwYWdlc2l6ZSwgbiksIHdoZXJlIHBhZ2VzaXplIGlzIHRoZSBwYWdlCisgICAgIHNpemUgb2YgdGhlIHN5c3RlbSAob3IgYXMgbmVhciB0byB0aGlzIGFzIGNhbiBiZSBmaWd1cmVkIG91dCBmcm9tCisgICAgIGFsbCB0aGUgaW5jbHVkZXMvZGVmaW5lcyBiZWxvdy4pCisgIHB2YWxsb2Moc2l6ZV90IG4pOworICAgICBFcXVpdmFsZW50IHRvIHZhbGxvYyhtaW5pbXVtLXBhZ2UtdGhhdC1ob2xkcyhuKSksIHRoYXQgaXMsCisgICAgIHJvdW5kIHVwIG4gdG8gbmVhcmVzdCBwYWdlc2l6ZS4KKyAgY2FsbG9jKHNpemVfdCB1bml0LCBzaXplX3QgcXVhbnRpdHkpOworICAgICBSZXR1cm5zIGEgcG9pbnRlciB0byBxdWFudGl0eSAqIHVuaXQgYnl0ZXMsIHdpdGggYWxsIGxvY2F0aW9ucworICAgICBzZXQgdG8gemVyby4KKyAgY2ZyZWUoVm9pZF90KiBwKTsKKyAgICAgRXF1aXZhbGVudCB0byBmcmVlKHApLgorICBtYWxsb2NfdHJpbShzaXplX3QgcGFkKTsKKyAgICAgUmVsZWFzZSBhbGwgYnV0IHBhZCBieXRlcyBvZiBmcmVlZCB0b3AtbW9zdCBtZW1vcnkgYmFjaworICAgICB0byB0aGUgc3lzdGVtLiBSZXR1cm4gMSBpZiBzdWNjZXNzZnVsLCBlbHNlIDAuCisgIG1hbGxvY191c2FibGVfc2l6ZShWb2lkX3QqIHApOworICAgICBSZXBvcnQgdGhlIG51bWJlciB1c2FibGUgYWxsb2NhdGVkIGJ5dGVzIGFzc29jaWF0ZWQgd2l0aCBhbGxvY2F0ZWQKKyAgICAgY2h1bmsgcC4gVGhpcyBtYXkgb3IgbWF5IG5vdCByZXBvcnQgbW9yZSBieXRlcyB0aGFuIHdlcmUgcmVxdWVzdGVkLAorICAgICBkdWUgdG8gYWxpZ25tZW50IGFuZCBtaW5pbXVtIHNpemUgY29uc3RyYWludHMuCisgIG1hbGxvY19zdGF0cygpOworICAgICBQcmludHMgYnJpZWYgc3VtbWFyeSBzdGF0aXN0aWNzIG9uIHN0ZGVyci4KKyAgbWFsbGluZm8oKQorICAgICBSZXR1cm5zIChieSBjb3B5KSBhIHN0cnVjdCBjb250YWluaW5nIHZhcmlvdXMgc3VtbWFyeSBzdGF0aXN0aWNzLgorICBtYWxsb3B0KGludCBwYXJhbWV0ZXJfbnVtYmVyLCBpbnQgcGFyYW1ldGVyX3ZhbHVlKQorICAgICBDaGFuZ2VzIG9uZSBvZiB0aGUgdHVuYWJsZSBwYXJhbWV0ZXJzIGRlc2NyaWJlZCBiZWxvdy4gUmV0dXJucworICAgICAxIGlmIHN1Y2Nlc3NmdWwgaW4gY2hhbmdpbmcgdGhlIHBhcmFtZXRlciwgZWxzZSAwLgorCisqIFZpdGFsIHN0YXRpc3RpY3M6CisKKyAgQWxpZ25tZW50OiAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LWJ5dGUKKyAgICAgICA4IGJ5dGUgYWxpZ25tZW50IGlzIGN1cnJlbnRseSBoYXJkd2lyZWQgaW50byB0aGUgZGVzaWduLiAgVGhpcworICAgICAgIHNlZW1zIHRvIHN1ZmZpY2UgZm9yIGFsbCBjdXJyZW50IG1hY2hpbmVzIGFuZCBDIGNvbXBpbGVycy4KKworICBBc3N1bWVkIHBvaW50ZXIgcmVwcmVzZW50YXRpb246ICAgICAgIDQgb3IgOCBieXRlcworICAgICAgIENvZGUgZm9yIDgtYnl0ZSBwb2ludGVycyBpcyB1bnRlc3RlZCBieSBtZSBidXQgaGFzIHdvcmtlZAorICAgICAgIHJlbGlhYmx5IGJ5IFdvbGZyYW0gR2xvZ2VyLCB3aG8gY29udHJpYnV0ZWQgbW9zdCBvZiB0aGUKKyAgICAgICBjaGFuZ2VzIHN1cHBvcnRpbmcgdGhpcy4KKworICBBc3N1bWVkIHNpemVfdCAgcmVwcmVzZW50YXRpb246ICAgICAgIDQgb3IgOCBieXRlcworICAgICAgIE5vdGUgdGhhdCBzaXplX3QgaXMgYWxsb3dlZCB0byBiZSA0IGJ5dGVzIGV2ZW4gaWYgcG9pbnRlcnMgYXJlIDguCisKKyAgTWluaW11bSBvdmVyaGVhZCBwZXIgYWxsb2NhdGVkIGNodW5rOiA0IG9yIDggYnl0ZXMKKyAgICAgICBFYWNoIG1hbGxvY2VkIGNodW5rIGhhcyBhIGhpZGRlbiBvdmVyaGVhZCBvZiA0IGJ5dGVzIGhvbGRpbmcgc2l6ZQorICAgICAgIGFuZCBzdGF0dXMgaW5mb3JtYXRpb24uCisKKyAgTWluaW11bSBhbGxvY2F0ZWQgc2l6ZTogNC1ieXRlIHB0cnM6ICAxNiBieXRlcyAgICAoaW5jbHVkaW5nIDQgb3ZlcmhlYWQpCisJCQkgIDgtYnl0ZSBwdHJzOiAgMjQvMzIgYnl0ZXMgKGluY2x1ZGluZywgNC84IG92ZXJoZWFkKQorCisgICAgICAgV2hlbiBhIGNodW5rIGlzIGZyZWVkLCAxMiAoZm9yIDRieXRlIHB0cnMpIG9yIDIwIChmb3IgOCBieXRlCisgICAgICAgcHRycyBidXQgNCBieXRlIHNpemUpIG9yIDI0IChmb3IgOC84KSBhZGRpdGlvbmFsIGJ5dGVzIGFyZQorICAgICAgIG5lZWRlZDsgNCAoOCkgZm9yIGEgdHJhaWxpbmcgc2l6ZSBmaWVsZAorICAgICAgIGFuZCA4ICgxNikgYnl0ZXMgZm9yIGZyZWUgbGlzdCBwb2ludGVycy4gVGh1cywgdGhlIG1pbmltdW0KKyAgICAgICBhbGxvY2F0YWJsZSBzaXplIGlzIDE2LzI0LzMyIGJ5dGVzLgorCisgICAgICAgRXZlbiBhIHJlcXVlc3QgZm9yIHplcm8gYnl0ZXMgKGkuZS4sIG1hbGxvYygwKSkgcmV0dXJucyBhCisgICAgICAgcG9pbnRlciB0byBzb21ldGhpbmcgb2YgdGhlIG1pbmltdW0gYWxsb2NhdGFibGUgc2l6ZS4KKworICBNYXhpbXVtIGFsbG9jYXRlZCBzaXplOiA0LWJ5dGUgc2l6ZV90OiAyXjMxIC0gIDggYnl0ZXMKKwkJCSAgOC1ieXRlIHNpemVfdDogMl42MyAtIDE2IGJ5dGVzCisKKyAgICAgICBJdCBpcyBhc3N1bWVkIHRoYXQgKHBvc3NpYmx5IHNpZ25lZCkgc2l6ZV90IGJpdCB2YWx1ZXMgc3VmZmljZSB0bworICAgICAgIHJlcHJlc2VudCBjaHVuayBzaXplcy4gYFBvc3NpYmx5IHNpZ25lZCcgaXMgZHVlIHRvIHRoZSBmYWN0CisgICAgICAgdGhhdCBgc2l6ZV90JyBtYXkgYmUgZGVmaW5lZCBvbiBhIHN5c3RlbSBhcyBlaXRoZXIgYSBzaWduZWQgb3IKKyAgICAgICBhbiB1bnNpZ25lZCB0eXBlLiBUbyBiZSBjb25zZXJ2YXRpdmUsIHZhbHVlcyB0aGF0IHdvdWxkIGFwcGVhcgorICAgICAgIGFzIG5lZ2F0aXZlIG51bWJlcnMgYXJlIGF2b2lkZWQuCisgICAgICAgUmVxdWVzdHMgZm9yIHNpemVzIHdpdGggYSBuZWdhdGl2ZSBzaWduIGJpdCB3aGVuIHRoZSByZXF1ZXN0CisgICAgICAgc2l6ZSBpcyB0cmVhZGVkIGFzIGEgbG9uZyB3aWxsIHJldHVybiBudWxsLgorCisgIE1heGltdW0gb3ZlcmhlYWQgd2FzdGFnZSBwZXIgYWxsb2NhdGVkIGNodW5rOiBub3JtYWxseSAxNSBieXRlcworCisgICAgICAgQWxpZ25ubWVudCBkZW1hbmRzLCBwbHVzIHRoZSBtaW5pbXVtIGFsbG9jYXRhYmxlIHNpemUgcmVzdHJpY3Rpb24KKyAgICAgICBtYWtlIHRoZSBub3JtYWwgd29yc3QtY2FzZSB3YXN0YWdlIDE1IGJ5dGVzIChpLmUuLCB1cCB0byAxNQorICAgICAgIG1vcmUgYnl0ZXMgd2lsbCBiZSBhbGxvY2F0ZWQgdGhhbiB3ZXJlIHJlcXVlc3RlZCBpbiBtYWxsb2MpLCB3aXRoCisgICAgICAgdHdvIGV4Y2VwdGlvbnM6CisJIDEuIEJlY2F1c2UgcmVxdWVzdHMgZm9yIHplcm8gYnl0ZXMgYWxsb2NhdGUgbm9uLXplcm8gc3BhY2UsCisJICAgIHRoZSB3b3JzdCBjYXNlIHdhc3RhZ2UgZm9yIGEgcmVxdWVzdCBvZiB6ZXJvIGJ5dGVzIGlzIDI0IGJ5dGVzLgorCSAyLiBGb3IgcmVxdWVzdHMgPj0gbW1hcF90aHJlc2hvbGQgdGhhdCBhcmUgc2VydmljZWQgdmlhCisJICAgIG1tYXAoKSwgdGhlIHdvcnN0IGNhc2Ugd2FzdGFnZSBpcyA4IGJ5dGVzIHBsdXMgdGhlIHJlbWFpbmRlcgorCSAgICBmcm9tIGEgc3lzdGVtIHBhZ2UgKHRoZSBtaW5pbWFsIG1tYXAgdW5pdCk7IHR5cGljYWxseSA0MDk2IGJ5dGVzLgorCisqIExpbWl0YXRpb25zCisKKyAgICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXJlIE5PVCBjdXJyZW50bHkgc3VwcG9ydGVkCisKKyAgICAqIE5vIHVzZXItZGVmaW5hYmxlIGhvb2tzIGZvciBjYWxsYmFja3MgYW5kIHRoZSBsaWtlLgorICAgICogTm8gYXV0b21hdGVkIG1lY2hhbmlzbSBmb3IgZnVsbHkgY2hlY2tpbmcgdGhhdCBhbGwgYWNjZXNzZXMKKyAgICAgIHRvIG1hbGxvY2VkIG1lbW9yeSBzdGF5IHdpdGhpbiB0aGVpciBib3VuZHMuCisgICAgKiBObyBzdXBwb3J0IGZvciBjb21wYWN0aW9uLgorCisqIFN5bm9wc2lzIG9mIGNvbXBpbGUtdGltZSBvcHRpb25zOgorCisgICAgUGVvcGxlIGhhdmUgcmVwb3J0ZWQgdXNpbmcgcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBtYWxsb2Mgb24gYWxsCisgICAgdmVyc2lvbnMgb2YgVW5peCwgc29tZXRpbWVzIGJ5IHR3ZWFraW5nIHNvbWUgb2YgdGhlIGRlZmluZXMKKyAgICBiZWxvdy4gSXQgaGFzIGJlZW4gdGVzdGVkIG1vc3QgZXh0ZW5zaXZlbHkgb24gU29sYXJpcyBhbmQKKyAgICBMaW51eC4gSXQgaXMgYWxzbyByZXBvcnRlZCB0byB3b3JrIG9uIFdJTjMyIHBsYXRmb3Jtcy4KKyAgICBQZW9wbGUgaGF2ZSBhbHNvIHJlcG9ydGVkIGFkYXB0aW5nIHRoaXMgbWFsbG9jIGZvciB1c2UgaW4KKyAgICBzdGFuZC1hbG9uZSBlbWJlZGRlZCBzeXN0ZW1zLgorCisgICAgVGhlIGltcGxlbWVudGF0aW9uIGlzIGluIHN0cmFpZ2h0LCBoYW5kLXR1bmVkIEFOU0kgQy4gIEFtb25nIG90aGVyCisgICAgY29uc2VxdWVuY2VzLCBpdCB1c2VzIGEgbG90IG9mIG1hY3Jvcy4gIEJlY2F1c2Ugb2YgdGhpcywgdG8gYmUgYXQKKyAgICBhbGwgdXNhYmxlLCB0aGlzIGNvZGUgc2hvdWxkIGJlIGNvbXBpbGVkIHVzaW5nIGFuIG9wdGltaXppbmcgY29tcGlsZXIKKyAgICAoZm9yIGV4YW1wbGUgZ2NjIC1PMikgdGhhdCBjYW4gc2ltcGxpZnkgZXhwcmVzc2lvbnMgYW5kIGNvbnRyb2wKKyAgICBwYXRocy4KKworICBfX1NURF9DICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGRlcml2ZWQgZnJvbSBDIGNvbXBpbGVyIGRlZmluZXMpCisgICAgIE5vbnplcm8gaWYgdXNpbmcgQU5TSS1zdGFuZGFyZCBDIGNvbXBpbGVyLCBhIEMrKyBjb21waWxlciwgb3IKKyAgICAgYSBDIGNvbXBpbGVyIHN1ZmZpY2llbnRseSBjbG9zZSB0byBBTlNJIHRvIGdldCBhd2F5IHdpdGggaXQuCisgIERFQlVHICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogTk9UIGRlZmluZWQpCisgICAgIERlZmluZSB0byBlbmFibGUgZGVidWdnaW5nLiBBZGRzIGZhaXJseSBleHRlbnNpdmUgYXNzZXJ0aW9uLWJhc2VkCisgICAgIGNoZWNraW5nIHRvIGhlbHAgdHJhY2sgZG93biBtZW1vcnkgZXJyb3JzLCBidXQgbm90aWNlYWJseSBzbG93cyBkb3duCisgICAgIGV4ZWN1dGlvbi4KKyAgUkVBTExPQ19aRVJPX0JZVEVTX0ZSRUVTIChkZWZhdWx0OiBOT1QgZGVmaW5lZCkKKyAgICAgRGVmaW5lIHRoaXMgaWYgeW91IHRoaW5rIHRoYXQgcmVhbGxvYyhwLCAwKSBzaG91bGQgYmUgZXF1aXZhbGVudAorICAgICB0byBmcmVlKHApLiBPdGhlcndpc2UsIHNpbmNlIG1hbGxvYyByZXR1cm5zIGEgdW5pcXVlIHBvaW50ZXIgZm9yCisgICAgIG1hbGxvYygwKSwgc28gZG9lcyByZWFsbG9jKHAsIDApLgorICBIQVZFX01FTUNQWSAgICAgICAgICAgICAgIChkZWZhdWx0OiBkZWZpbmVkKQorICAgICBEZWZpbmUgaWYgeW91IGFyZSBub3Qgb3RoZXJ3aXNlIHVzaW5nIEFOU0kgU1REIEMsIGJ1dCBzdGlsbAorICAgICBoYXZlIG1lbWNweSBhbmQgbWVtc2V0IGluIHlvdXIgQyBsaWJyYXJ5IGFuZCB3YW50IHRvIHVzZSB0aGVtLgorICAgICBPdGhlcndpc2UsIHNpbXBsZSBpbnRlcm5hbCB2ZXJzaW9ucyBhcmUgc3VwcGxpZWQuCisgIFVTRV9NRU1DUFkgICAgICAgICAgICAgICAoZGVmYXVsdDogMSBpZiBIQVZFX01FTUNQWSBpcyBkZWZpbmVkLCAwIG90aGVyd2lzZSkKKyAgICAgRGVmaW5lIGFzIDEgaWYgeW91IHdhbnQgdGhlIEMgbGlicmFyeSB2ZXJzaW9ucyBvZiBtZW1zZXQgYW5kCisgICAgIG1lbWNweSBjYWxsZWQgaW4gcmVhbGxvYyBhbmQgY2FsbG9jIChvdGhlcndpc2UgbWFjcm8gdmVyc2lvbnMgYXJlIHVzZWQpLgorICAgICBBdCBsZWFzdCBvbiBzb21lIHBsYXRmb3JtcywgdGhlIHNpbXBsZSBtYWNybyB2ZXJzaW9ucyB1c3VhbGx5CisgICAgIG91dHBlcmZvcm0gbGliYyB2ZXJzaW9ucy4KKyAgSEFWRV9NTUFQICAgICAgICAgICAgICAgICAoZGVmYXVsdDogZGVmaW5lZCBhcyAxKQorICAgICBEZWZpbmUgdG8gbm9uLXplcm8gdG8gb3B0aW9uYWxseSBtYWtlIG1hbGxvYygpIHVzZSBtbWFwKCkgdG8KKyAgICAgYWxsb2NhdGUgdmVyeSBsYXJnZSBibG9ja3MuCisgIEhBVkVfTVJFTUFQICAgICAgICAgICAgICAgICAoZGVmYXVsdDogZGVmaW5lZCBhcyAwIHVubGVzcyBMaW51eCBsaWJjIHNldCkKKyAgICAgRGVmaW5lIHRvIG5vbi16ZXJvIHRvIG9wdGlvbmFsbHkgbWFrZSByZWFsbG9jKCkgdXNlIG1yZW1hcCgpIHRvCisgICAgIHJlYWxsb2NhdGUgdmVyeSBsYXJnZSBibG9ja3MuCisgIG1hbGxvY19nZXRwYWdlc2l6ZSAgICAgICAgKGRlZmF1bHQ6IGRlcml2ZWQgZnJvbSBzeXN0ZW0gI2luY2x1ZGVzKQorICAgICBFaXRoZXIgYSBjb25zdGFudCBvciByb3V0aW5lIGNhbGwgcmV0dXJuaW5nIHRoZSBzeXN0ZW0gcGFnZSBzaXplLgorICBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19IIChkZWZhdWx0OiBOT1QgZGVmaW5lZCkKKyAgICAgT3B0aW9uYWxseSBkZWZpbmUgaWYgeW91IGFyZSBvbiBhIHN5c3RlbSB3aXRoIGEgL3Vzci9pbmNsdWRlL21hbGxvYy5oCisgICAgIHRoYXQgZGVjbGFyZXMgc3RydWN0IG1hbGxpbmZvLiBJdCBpcyBub3QgYXQgYWxsIG5lY2Vzc2FyeSB0bworICAgICBkZWZpbmUgdGhpcyBldmVuIGlmIHlvdSBkbywgYnV0IHdpbGwgZW5zdXJlIGNvbnNpc3RlbmN5LgorICBJTlRFUk5BTF9TSVpFX1QgICAgICAgICAgIChkZWZhdWx0OiBzaXplX3QpCisgICAgIERlZmluZSB0byBhIDMyLWJpdCB0eXBlIChwcm9iYWJseSBgdW5zaWduZWQgaW50JykgaWYgeW91IGFyZSBvbiBhCisgICAgIDY0LWJpdCBtYWNoaW5lLCB5ZXQgZG8gbm90IHdhbnQgb3IgbmVlZCB0byBhbGxvdyBtYWxsb2MgcmVxdWVzdHMgb2YKKyAgICAgZ3JlYXRlciB0aGFuIDJeMzEgdG8gYmUgaGFuZGxlZC4gVGhpcyBzYXZlcyBzcGFjZSwgZXNwZWNpYWxseSBmb3IKKyAgICAgdmVyeSBzbWFsbCBjaHVua3MuCisgIElOVEVSTkFMX0xJTlVYX0NfTElCICAgICAgKGRlZmF1bHQ6IE5PVCBkZWZpbmVkKQorICAgICBEZWZpbmVkIG9ubHkgd2hlbiBjb21waWxlZCBhcyBwYXJ0IG9mIExpbnV4IGxpYmMuCisgICAgIEFsc28gbm90ZSB0aGF0IHRoZXJlIGlzIHNvbWUgb2RkIGludGVybmFsIG5hbWUtbWFuZ2xpbmcgdmlhIGRlZmluZXMKKyAgICAgKGZvciBleGFtcGxlLCBpbnRlcm5hbGx5LCBgbWFsbG9jJyBpcyBuYW1lZCBgbUFMTE9jJykgbmVlZGVkCisgICAgIHdoZW4gY29tcGlsaW5nIGluIHRoaXMgY2FzZS4gVGhlc2UgbG9vayBmdW5ueSBidXQgZG9uJ3Qgb3RoZXJ3aXNlCisgICAgIGFmZmVjdCBhbnl0aGluZy4KKyAgV0lOMzIgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogdW5kZWZpbmVkKQorICAgICBEZWZpbmUgdGhpcyBvbiBNUyB3aW4gKDk1LCBudCkgcGxhdGZvcm1zIHRvIGNvbXBpbGUgaW4gc2JyayBlbXVsYXRpb24uCisgIExBQ0tTX1VOSVNURF9IICAgICAgICAgICAgKGRlZmF1bHQ6IHVuZGVmaW5lZCBpZiBub3QgV0lOMzIpCisgICAgIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgYSA8dW5pc3RkLmg+LgorICBMQUNLU19TWVNfUEFSQU1fSCAgICAgICAgIChkZWZhdWx0OiB1bmRlZmluZWQgaWYgbm90IFdJTjMyKQorICAgICBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGEgPHN5cy9wYXJhbS5oPi4KKyAgTU9SRUNPUkUgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogc2JyaykKKyAgICAgVGhlIG5hbWUgb2YgdGhlIHJvdXRpbmUgdG8gY2FsbCB0byBvYnRhaW4gbW9yZSBtZW1vcnkgZnJvbSB0aGUgc3lzdGVtLgorICBNT1JFQ09SRV9GQUlMVVJFICAgICAgICAgIChkZWZhdWx0OiAtMSkKKyAgICAgVGhlIHZhbHVlIHJldHVybmVkIHVwb24gZmFpbHVyZSBvZiBNT1JFQ09SRS4KKyAgTU9SRUNPUkVfQ0xFQVJTICAgICAgICAgICAoZGVmYXVsdCAxKQorICAgICBUcnVlICgxKSBpZiB0aGUgcm91dGluZSBtYXBwZWQgdG8gTU9SRUNPUkUgemVyb2VzIG91dCBtZW1vcnkgKHdoaWNoCisgICAgIGhvbGRzIGZvciBzYnJrKS4KKyAgREVGQVVMVF9UUklNX1RIUkVTSE9MRAorICBERUZBVUxUX1RPUF9QQUQKKyAgREVGQVVMVF9NTUFQX1RIUkVTSE9MRAorICBERUZBVUxUX01NQVBfTUFYCisgICAgIERlZmF1bHQgdmFsdWVzIG9mIHR1bmFibGUgcGFyYW1ldGVycyAoZGVzY3JpYmVkIGluIGRldGFpbCBiZWxvdykKKyAgICAgY29udHJvbGxpbmcgaW50ZXJhY3Rpb24gd2l0aCBob3N0IHN5c3RlbSByb3V0aW5lcyAoc2JyaywgbW1hcCwgZXRjKS4KKyAgICAgVGhlc2UgdmFsdWVzIG1heSBhbHNvIGJlIGNoYW5nZWQgZHluYW1pY2FsbHkgdmlhIG1hbGxvcHQoKS4gVGhlCisgICAgIHByZXNldCBkZWZhdWx0cyBhcmUgdGhvc2UgdGhhdCBnaXZlIGJlc3QgcGVyZm9ybWFuY2UgZm9yIHR5cGljYWwKKyAgICAgcHJvZ3JhbXMvc3lzdGVtcy4KKyAgVVNFX0RMX1BSRUZJWCAgICAgICAgICAgICAoZGVmYXVsdDogdW5kZWZpbmVkKQorICAgICBQcmVmaXggYWxsIHB1YmxpYyByb3V0aW5lcyB3aXRoIHRoZSBzdHJpbmcgJ2RsJy4gIFVzZWZ1bCB0bworICAgICBxdWlja2x5IGF2b2lkIHByb2NlZHVyZSBkZWNsYXJhdGlvbiBjb25mbGljdHMgYW5kIGxpbmtlciBzeW1ib2wKKyAgICAgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCisKKworKi8KKworDAorCisKKy8qIFByZWxpbWluYXJpZXMgKi8KKworI2lmbmRlZiBfX1NURF9DCisjaWZkZWYgX19TVERDX18KKyNkZWZpbmUgX19TVERfQyAgICAgMQorI2Vsc2UKKyNpZiBfX2NwbHVzcGx1cworI2RlZmluZSBfX1NURF9DICAgICAxCisjZWxzZQorI2RlZmluZSBfX1NURF9DICAgICAwCisjZW5kaWYgLypfX2NwbHVzcGx1cyovCisjZW5kaWYgLypfX1NURENfXyovCisjZW5kaWYgLypfX1NURF9DKi8KKworI2lmbmRlZiBWb2lkX3QKKyNpZiAoX19TVERfQyB8fCBkZWZpbmVkKFdJTjMyKSkKKyNkZWZpbmUgVm9pZF90ICAgICAgdm9pZAorI2Vsc2UKKyNkZWZpbmUgVm9pZF90ICAgICAgY2hhcgorI2VuZGlmCisjZW5kaWYgLypWb2lkX3QqLworCisjaWYgX19TVERfQworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBmb3Igc2l6ZV90ICovCisjZWxzZQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCS8qIF9fU1REX0MgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgMAkvKiBub3QgZm9yIFUtQm9vdCAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CS8qIG5lZWRlZCBmb3IgbWFsbG9jX3N0YXRzICovCisjZW5kaWYKKworCisvKgorICBDb21waWxlLXRpbWUgb3B0aW9ucworKi8KKworCisvKgorICAgIERlYnVnZ2luZzoKKworICAgIEJlY2F1c2UgZnJlZWQgY2h1bmtzIG1heSBiZSBvdmVyd3JpdHRlbiB3aXRoIGxpbmsgZmllbGRzLCB0aGlzCisgICAgbWFsbG9jIHdpbGwgb2Z0ZW4gZGllIHdoZW4gZnJlZWQgbWVtb3J5IGlzIG92ZXJ3cml0dGVuIGJ5IHVzZXIKKyAgICBwcm9ncmFtcy4gIFRoaXMgY2FuIGJlIHZlcnkgZWZmZWN0aXZlIChhbGJlaXQgaW4gYW4gYW5ub3lpbmcgd2F5KQorICAgIGluIGhlbHBpbmcgdHJhY2sgZG93biBkYW5nbGluZyBwb2ludGVycy4KKworICAgIElmIHlvdSBjb21waWxlIHdpdGggLURERUJVRywgYSBudW1iZXIgb2YgYXNzZXJ0aW9uIGNoZWNrcyBhcmUKKyAgICBlbmFibGVkIHRoYXQgd2lsbCBjYXRjaCBtb3JlIG1lbW9yeSBlcnJvcnMuIFlvdSBwcm9iYWJseSB3b24ndCBiZQorICAgIGFibGUgdG8gbWFrZSBtdWNoIHNlbnNlIG9mIHRoZSBhY3R1YWwgYXNzZXJ0aW9uIGVycm9ycywgYnV0IHRoZXkKKyAgICBzaG91bGQgaGVscCB5b3UgbG9jYXRlIGluY29ycmVjdGx5IG92ZXJ3cml0dGVuIG1lbW9yeS4gIFRoZQorICAgIGNoZWNraW5nIGlzIGZhaXJseSBleHRlbnNpdmUsIGFuZCB3aWxsIHNsb3cgZG93biBleGVjdXRpb24KKyAgICBub3RpY2VhYmx5LiBDYWxsaW5nIG1hbGxvY19zdGF0cyBvciBtYWxsaW5mbyB3aXRoIERFQlVHIHNldCB3aWxsCisgICAgYXR0ZW1wdCB0byBjaGVjayBldmVyeSBub24tbW1hcHBlZCBhbGxvY2F0ZWQgYW5kIGZyZWUgY2h1bmsgaW4gdGhlCisgICAgY291cnNlIG9mIGNvbXB1dGluZyB0aGUgc3VtbW1hcmllcy4gKEJ5IG5hdHVyZSwgbW1hcHBlZCByZWdpb25zCisgICAgY2Fubm90IGJlIGNoZWNrZWQgdmVyeSBtdWNoIGF1dG9tYXRpY2FsbHkuKQorCisgICAgU2V0dGluZyBERUJVRyBtYXkgYWxzbyBiZSBoZWxwZnVsIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIG1vZGlmeQorICAgIHRoaXMgY29kZS4gVGhlIGFzc2VydGlvbnMgaW4gdGhlIGNoZWNrIHJvdXRpbmVzIHNwZWxsIG91dCBpbiBtb3JlCisgICAgZGV0YWlsIHRoZSBhc3N1bXB0aW9ucyBhbmQgaW52YXJpYW50cyB1bmRlcmx5aW5nIHRoZSBhbGdvcml0aG1zLgorCisqLworCisjaWZkZWYgREVCVUcKKy8qICNpbmNsdWRlIDxhc3NlcnQuaD4gKi8KKyNkZWZpbmUgYXNzZXJ0KHgpICgodm9pZCkwKQorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0KHgpICgodm9pZCkwKQorI2VuZGlmCisKKworLyoKKyAgSU5URVJOQUxfU0laRV9UIGlzIHRoZSB3b3JkLXNpemUgdXNlZCBmb3IgaW50ZXJuYWwgYm9va2tlZXBpbmcKKyAgb2YgY2h1bmsgc2l6ZXMuIE9uIGEgNjQtYml0IG1hY2hpbmUsIHlvdSBjYW4gcmVkdWNlIG1hbGxvYworICBvdmVyaGVhZCBieSBkZWZpbmluZyBJTlRFUk5BTF9TSVpFX1QgdG8gYmUgYSAzMiBiaXQgYHVuc2lnbmVkIGludCcKKyAgYXQgdGhlIGV4cGVuc2Ugb2Ygbm90IGJlaW5nIGFibGUgdG8gaGFuZGxlIHJlcXVlc3RzIGdyZWF0ZXIgdGhhbgorICAyXjMxLiBUaGlzIGxpbWl0YXRpb24gaXMgaGFyZGx5IGV2ZXIgYSBjb25jZXJuOyB5b3UgYXJlIGVuY291cmFnZWQKKyAgdG8gc2V0IHRoaXMuIEhvd2V2ZXIsIHRoZSBkZWZhdWx0IHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgc2l6ZV90LgorKi8KKworI2lmbmRlZiBJTlRFUk5BTF9TSVpFX1QKKyNkZWZpbmUgSU5URVJOQUxfU0laRV9UIHNpemVfdAorI2VuZGlmCisKKy8qCisgIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUyBzaG91bGQgYmUgc2V0IGlmIGEgY2FsbCB0bworICByZWFsbG9jIHdpdGggemVybyBieXRlcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgYSBjYWxsIHRvIGZyZWUuCisgIFNvbWUgcGVvcGxlIHRoaW5rIGl0IHNob3VsZC4gT3RoZXJ3aXNlLCBzaW5jZSB0aGlzIG1hbGxvYworICByZXR1cm5zIGEgdW5pcXVlIHBvaW50ZXIgZm9yIG1hbGxvYygwKSwgc28gZG9lcyByZWFsbG9jKHAsIDApLgorKi8KKworCisvKiAgICNkZWZpbmUgUkVBTExPQ19aRVJPX0JZVEVTX0ZSRUVTICovCisKKworLyoKKyAgV0lOMzIgY2F1c2VzIGFuIGVtdWxhdGlvbiBvZiBzYnJrIHRvIGJlIGNvbXBpbGVkIGluCisgIG1tYXAtYmFzZWQgb3B0aW9ucyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gV0lOMzIuCisqLworCisvKiAjZGVmaW5lIFdJTjMyICovCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgTU9SRUNPUkUgd3NicmsKKyNkZWZpbmUgSEFWRV9NTUFQIDAKKworI2RlZmluZSBMQUNLU19VTklTVERfSAorI2RlZmluZSBMQUNLU19TWVNfUEFSQU1fSAorCisvKgorICBJbmNsdWRlICd3aW5kb3dzLmgnIHRvIGdldCB0aGUgbmVjZXNzYXJ5IGRlY2xhcmF0aW9ucyBmb3IgdGhlCisgIE1pY3Jvc29mdCBWaXN1YWwgQysrIGRhdGEgc3RydWN0dXJlcyBhbmQgcm91dGluZXMgdXNlZCBpbiB0aGUgJ3NicmsnCisgIGVtdWxhdGlvbi4KKworICBEZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiBzbyB0aGF0IG9ubHkgdGhlIGVzc2VudGlhbCBNaWNyb3NvZnQKKyAgVmlzdWFsIEMrKyBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLgorKi8KKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisKKy8qCisgIEhBVkVfTUVNQ1BZIHNob3VsZCBiZSBkZWZpbmVkIGlmIHlvdSBhcmUgbm90IG90aGVyd2lzZSB1c2luZworICBBTlNJIFNURCBDLCBidXQgc3RpbGwgaGF2ZSBtZW1jcHkgYW5kIG1lbXNldCBpbiB5b3VyIEMgbGlicmFyeQorICBhbmQgd2FudCB0byB1c2UgdGhlbSBpbiBjYWxsb2MgYW5kIHJlYWxsb2MuIE90aGVyd2lzZSBzaW1wbGUKKyAgbWFjcm8gdmVyc2lvbnMgYXJlIGRlZmluZWQgaGVyZS4KKworICBVU0VfTUVNQ1BZIHNob3VsZCBiZSBkZWZpbmVkIGFzIDEgaWYgeW91IGFjdHVhbGx5IHdhbnQgdG8KKyAgaGF2ZSBtZW1zZXQgYW5kIG1lbWNweSBjYWxsZWQuIFBlb3BsZSByZXBvcnQgdGhhdCB0aGUgbWFjcm8KKyAgdmVyc2lvbnMgYXJlIG9mdGVuIGVub3VnaCBmYXN0ZXIgdGhhbiBsaWJjIHZlcnNpb25zIG9uIG1hbnkKKyAgc3lzdGVtcyB0aGF0IGl0IGlzIGJldHRlciB0byB1c2UgdGhlbS4KKworKi8KKworI2RlZmluZSBIQVZFX01FTUNQWQorCisjaWZuZGVmIFVTRV9NRU1DUFkKKyNpZmRlZiBIQVZFX01FTUNQWQorI2RlZmluZSBVU0VfTUVNQ1BZIDEKKyNlbHNlCisjZGVmaW5lIFVTRV9NRU1DUFkgMAorI2VuZGlmCisjZW5kaWYKKworI2lmIChfX1NURF9DIHx8IGRlZmluZWQoSEFWRV9NRU1DUFkpKQorCisjaWYgX19TVERfQwordm9pZCogbWVtc2V0KHZvaWQqLCBpbnQsIHNpemVfdCk7Cit2b2lkKiBtZW1jcHkodm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworI2Vsc2UKKyNpZmRlZiBXSU4zMgorLyogT24gV2luMzIgcGxhdGZvcm1zLCAnbWVtc2V0KCknIGFuZCAnbWVtY3B5KCknIGFyZSBhbHJlYWR5IGRlY2xhcmVkIGluICovCisvKiAnd2luZG93cy5oJyAqLworI2Vsc2UKK1ZvaWRfdCogbWVtc2V0KCk7CitWb2lkX3QqIG1lbWNweSgpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgVVNFX01FTUNQWQorCisvKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgb25seSBpbnZva2VkIHdpdGggKDJuKzEpLW11bHRpcGxlcyBvZgorICAgSU5URVJOQUxfU0laRV9UIHVuaXRzLCB3aXRoIGEgcG9zaXRpdmUgaW50ZWdlciBuLiBUaGlzIGlzIGV4cGxvaXRlZAorICAgZm9yIGZhc3QgaW5saW5lIGV4ZWN1dGlvbiB3aGVuIG4gaXMgc21hbGwuICovCisKKyNkZWZpbmUgTUFMTE9DX1pFUk8oY2hhcnAsIG5ieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfU0laRV9UIG16c3ogPSAobmJ5dGVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYobXpzeiA8PSA5KnNpemVvZihtenN6KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJTlRFUk5BTF9TSVpFX1QqIG16ID0gKElOVEVSTkFMX1NJWkVfVCopIChjaGFycCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZihtenN6ID49IDUqc2l6ZW9mKG16c3opKSB7ICAgICAqbXorKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICpteisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYobXpzeiA+PSA3KnNpemVvZihtenN6KSkgeyAgICpteisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm16KysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYobXpzeiA+PSA5KnNpemVvZihtenN6KSkgeyAqbXorKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICpteisrID0gMDsgfX19ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm16KysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbXorKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICpteiAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgbWVtc2V0KChjaGFycCksIDAsIG16c3opOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIE1BTExPQ19DT1BZKGRlc3Qsc3JjLG5ieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1NJWkVfVCBtY3N6ID0gKG5ieXRlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmKG1jc3ogPD0gOSpzaXplb2YobWNzeikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSU5URVJOQUxfU0laRV9UKiBtY3NyYyA9IChJTlRFUk5BTF9TSVpFX1QqKSAoc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSU5URVJOQUxfU0laRV9UKiBtY2RzdCA9IChJTlRFUk5BTF9TSVpFX1QqKSAoZGVzdCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYobWNzeiA+PSA1KnNpemVvZihtY3N6KSkgeyAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmKG1jc3ogPj0gNypzaXplb2YobWNzeikpIHsgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgXAorCWlmKG1jc3ogPj0gOSpzaXplb2YobWNzeikpIHsgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyB9fX0gICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbWNkc3QgICA9ICptY3NyYyAgOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIG1lbWNweShkZXN0LCBzcmMsIG1jc3opOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKworI2Vsc2UgLyogIVVTRV9NRU1DUFkgKi8KKworLyogVXNlIER1ZmYncyBkZXZpY2UgZm9yIGdvb2QgemVyb2luZy9jb3B5aW5nIHBlcmZvcm1hbmNlLiAqLworCisjZGVmaW5lIE1BTExPQ19aRVJPKGNoYXJwLCBuYnl0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1NJWkVfVCogbXpwID0gKElOVEVSTkFMX1NJWkVfVCopKGNoYXJwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGxvbmcgbWN0bXAgPSAobmJ5dGVzKS9zaXplb2YoSU5URVJOQUxfU0laRV9UKSwgbWNuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChtY3RtcCA8IDgpIG1jbiA9IDA7IGVsc2UgeyBtY24gPSAobWN0bXAtMSkvODsgbWN0bXAgJT0gODsgfSAgICAgICAgICAgICBcCisgIHN3aXRjaCAobWN0bXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAwOiBmb3IoOzspIHsgKm16cCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSA3OiAgICAgICAgICAgKm16cCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSA2OiAgICAgICAgICAgKm16cCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSA1OiAgICAgICAgICAgKm16cCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSA0OiAgICAgICAgICAgKm16cCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAzOiAgICAgICAgICAgKm16cCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAyOiAgICAgICAgICAgKm16cCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAxOiAgICAgICAgICAgKm16cCsrID0gMDsgaWYobWNuIDw9IDApIGJyZWFrOyBtY24tLTsgfSAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgTUFMTE9DX0NPUFkoZGVzdCxzcmMsbmJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfU0laRV9UKiBtY3NyYyA9IChJTlRFUk5BTF9TSVpFX1QqKSBzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfU0laRV9UKiBtY2RzdCA9IChJTlRFUk5BTF9TSVpFX1QqKSBkZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbG9uZyBtY3RtcCA9IChuYnl0ZXMpL3NpemVvZihJTlRFUk5BTF9TSVpFX1QpLCBtY247ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKG1jdG1wIDwgOCkgbWNuID0gMDsgZWxzZSB7IG1jbiA9IChtY3RtcC0xKS84OyBtY3RtcCAlPSA4OyB9ICAgICAgICAgICAgIFwKKyAgc3dpdGNoIChtY3RtcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDA6IGZvcig7OykgeyAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDc6ICAgICAgICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDY6ICAgICAgICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDU6ICAgICAgICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDQ6ICAgICAgICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDM6ICAgICAgICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDI6ICAgICAgICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDE6ICAgICAgICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyBpZihtY24gPD0gMCkgYnJlYWs7IG1jbi0tOyB9ICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKworI2VuZGlmCisKKworLyoKKyAgRGVmaW5lIEhBVkVfTU1BUCB0byBvcHRpb25hbGx5IG1ha2UgbWFsbG9jKCkgdXNlIG1tYXAoKSB0bworICBhbGxvY2F0ZSB2ZXJ5IGxhcmdlIGJsb2Nrcy4gIFRoZXNlIHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlCisgIG9wZXJhdGluZyBzeXN0ZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgYSBmcmVlKCkuCisqLworCisvKioqCisjaWZuZGVmIEhBVkVfTU1BUAorI2RlZmluZSBIQVZFX01NQVAgMQorI2VuZGlmCisqKiovCisjdW5kZWYJSEFWRV9NTUFQCS8qIE5vdCBhdmFpbGFibGUgZm9yIFUtQm9vdCAqLworCisvKgorICBEZWZpbmUgSEFWRV9NUkVNQVAgdG8gbWFrZSByZWFsbG9jKCkgdXNlIG1yZW1hcCgpIHRvIHJlLWFsbG9jYXRlCisgIGxhcmdlIGJsb2Nrcy4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgcG9zc2libGUgb24gTGludXggd2l0aAorICBrZXJuZWwgdmVyc2lvbnMgbmV3ZXIgdGhhbiAxLjMuNzcuCisqLworCisvKioqCisjaWZuZGVmIEhBVkVfTVJFTUFQCisjaWZkZWYgSU5URVJOQUxfTElOVVhfQ19MSUIKKyNkZWZpbmUgSEFWRV9NUkVNQVAgMQorI2Vsc2UKKyNkZWZpbmUgSEFWRV9NUkVNQVAgMAorI2VuZGlmCisjZW5kaWYKKyoqKi8KKyN1bmRlZglIQVZFX01SRU1BUAkvKiBOb3QgYXZhaWxhYmxlIGZvciBVLUJvb3QgKi8KKworI2lmIEhBVkVfTU1BUAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaWYgIWRlZmluZWQoTUFQX0FOT05ZTU9VUykgJiYgZGVmaW5lZChNQVBfQU5PTikKKyNkZWZpbmUgTUFQX0FOT05ZTU9VUyBNQVBfQU5PTgorI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX01NQVAgKi8KKworLyoKKyAgQWNjZXNzIHRvIHN5c3RlbSBwYWdlIHNpemUuIFRvIHRoZSBleHRlbnQgcG9zc2libGUsIHRoaXMgbWFsbG9jCisgIG1hbmFnZXMgbWVtb3J5IGZyb20gdGhlIHN5c3RlbSBpbiBwYWdlLXNpemUgdW5pdHMuCisKKyAgVGhlIGZvbGxvd2luZyBtZWNoYW5pY3MgZm9yIGdldHBhZ2VzaXplIHdlcmUgYWRhcHRlZCBmcm9tCisgIGJzZC9nbnUgZ2V0cGFnZXNpemUuaAorKi8KKworI2RlZmluZQlMQUNLU19VTklTVERfSAkvKiBTaG9ydGN1dCBmb3IgVS1Cb290ICovCisjZGVmaW5lCW1hbGxvY19nZXRwYWdlc2l6ZQk0MDk2CisKKyNpZm5kZWYgTEFDS1NfVU5JU1REX0gKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgbWFsbG9jX2dldHBhZ2VzaXplCisjICBpZmRlZiBfU0NfUEFHRVNJWkUgICAgICAgICAvKiBzb21lIFNWUjQgc3lzdGVtcyBvbWl0IGFuIHVuZGVyc2NvcmUgKi8KKyMgICAgaWZuZGVmIF9TQ19QQUdFX1NJWkUKKyMgICAgICBkZWZpbmUgX1NDX1BBR0VfU0laRSBfU0NfUEFHRVNJWkUKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZmRlZiBfU0NfUEFHRV9TSVpFCisjICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgc3lzY29uZihfU0NfUEFHRV9TSVpFKQorIyAgZWxzZQorIyAgICBpZiBkZWZpbmVkKEJTRCkgfHwgZGVmaW5lZChER1VYKSB8fCBkZWZpbmVkKEhBVkVfR0VUUEFHRVNJWkUpCisgICAgICAgZXh0ZXJuIHNpemVfdCBnZXRwYWdlc2l6ZSgpOworIyAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgZ2V0cGFnZXNpemUoKQorIyAgICBlbHNlCisjICAgICAgaWZkZWYgV0lOMzIKKyMgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgKDQwOTYpIC8qIFRCRDogVXNlICdHZXRTeXN0ZW1JbmZvJyBpbnN0ZWFkICovCisjICAgICAgZWxzZQorIyAgICAgICAgaWZuZGVmIExBQ0tTX1NZU19QQVJBTV9ICisjICAgICAgICAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgICAgICAgZW5kaWYKKyMgICAgICAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKKyMgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBFWEVDX1BBR0VTSVpFCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGlmZGVmIE5CUEcKKyMgICAgICAgICAgICBpZm5kZWYgQ0xTSVpFCisjICAgICAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIE5CUEcKKyMgICAgICAgICAgICBlbHNlCisjICAgICAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIChOQlBHICogQ0xTSVpFKQorIyAgICAgICAgICAgIGVuZGlmCisjICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICBpZmRlZiBOQlBDCisjICAgICAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIE5CUEMKKyMgICAgICAgICAgICBlbHNlCisjICAgICAgICAgICAgICBpZmRlZiBQQUdFU0laRQorIyAgICAgICAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIFBBR0VTSVpFCisjICAgICAgICAgICAgICBlbHNlCisjICAgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgKDQwOTYpIC8qIGp1c3QgZ3Vlc3MgKi8KKyMgICAgICAgICAgICAgIGVuZGlmCisjICAgICAgICAgICAgZW5kaWYKKyMgICAgICAgICAgZW5kaWYKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworCisvKgorCisgIFRoaXMgdmVyc2lvbiBvZiBtYWxsb2Mgc3VwcG9ydHMgdGhlIHN0YW5kYXJkIFNWSUQvWFBHIG1hbGxpbmZvCisgIHJvdXRpbmUgdGhhdCByZXR1cm5zIGEgc3RydWN0IGNvbnRhaW5pbmcgdGhlIHNhbWUga2luZCBvZgorICBpbmZvcm1hdGlvbiB5b3UgY2FuIGdldCBmcm9tIG1hbGxvY19zdGF0cy4gSXQgc2hvdWxkIHdvcmsgb24KKyAgYW55IFNWSUQvWFBHIGNvbXBsaWFudCBzeXN0ZW0gdGhhdCBoYXMgYSAvdXNyL2luY2x1ZGUvbWFsbG9jLmgKKyAgZGVmaW5pbmcgc3RydWN0IG1hbGxpbmZvLiAoSWYgeW91J2QgbGlrZSB0byBpbnN0YWxsIHN1Y2ggYSB0aGluZworICB5b3Vyc2VsZiwgY3V0IG91dCB0aGUgcHJlbGltaW5hcnkgZGVjbGFyYXRpb25zIGFzIGRlc2NyaWJlZCBhYm92ZQorICBhbmQgYmVsb3cgYW5kIHNhdmUgdGhlbSBpbiBhIG1hbGxvYy5oIGZpbGUuIEJ1dCB0aGVyZSdzIG5vCisgIGNvbXBlbGxpbmcgcmVhc29uIHRvIGJvdGhlciB0byBkbyB0aGlzLikKKworICBUaGUgbWFpbiBkZWNsYXJhdGlvbiBuZWVkZWQgaXMgdGhlIG1hbGxpbmZvIHN0cnVjdCB0aGF0IGlzIHJldHVybmVkCisgIChieS1jb3B5KSBieSBtYWxsaW5mbygpLiAgVGhlIFNWSUQvWFBHIG1hbGxvaW5mbyBzdHJ1Y3QgY29udGFpbnMgYQorICBidW5jaCBvZiBmaWVsZHMsIG1vc3Qgb2Ygd2hpY2ggYXJlIG5vdCBldmVuIG1lYW5pbmdmdWwgaW4gdGhpcworICB2ZXJzaW9uIG9mIG1hbGxvYy4gU29tZSBvZiB0aGVzZSBmaWVsZHMgYXJlIGFyZSBpbnN0ZWFkIGZpbGxlZCBieQorICBtYWxsaW5mbygpIHdpdGggb3RoZXIgbnVtYmVycyB0aGF0IG1pZ2h0IHBvc3NpYmx5IGJlIG9mIGludGVyZXN0LgorCisgIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggc2hvdWxkIGJlIHNldCBpZiB5b3UgaGF2ZSBhCisgIC91c3IvaW5jbHVkZS9tYWxsb2MuaCBmaWxlIHRoYXQgaW5jbHVkZXMgYSBkZWNsYXJhdGlvbiBvZiBzdHJ1Y3QKKyAgbWFsbGluZm8uICBJZiBzbywgaXQgaXMgaW5jbHVkZWQ7IGVsc2UgYW4gU1ZJRDIvWFBHMiBjb21wbGlhbnQKKyAgdmVyc2lvbiBpcyBkZWNsYXJlZCBiZWxvdy4gIFRoZXNlIG11c3QgYmUgcHJlY2lzZWx5IHRoZSBzYW1lIGZvcgorICBtYWxsaW5mbygpIHRvIHdvcmsuCisKKyovCisKKy8qICNkZWZpbmUgSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSCAqLworCisjaWYgSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSAorI2luY2x1ZGUgIi91c3IvaW5jbHVkZS9tYWxsb2MuaCIKKyNlbHNlCisKKy8qIFNWSUQyL1hQRyBtYWxsaW5mbyBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IG1hbGxpbmZvIHsKKyAgaW50IGFyZW5hOyAgICAvKiB0b3RhbCBzcGFjZSBhbGxvY2F0ZWQgZnJvbSBzeXN0ZW0gKi8KKyAgaW50IG9yZGJsa3M7ICAvKiBudW1iZXIgb2Ygbm9uLWludXNlIGNodW5rcyAqLworICBpbnQgc21ibGtzOyAgIC8qIHVudXNlZCAtLSBhbHdheXMgemVybyAqLworICBpbnQgaGJsa3M7ICAgIC8qIG51bWJlciBvZiBtbWFwcGVkIHJlZ2lvbnMgKi8KKyAgaW50IGhibGtoZDsgICAvKiB0b3RhbCBzcGFjZSBpbiBtbWFwcGVkIHJlZ2lvbnMgKi8KKyAgaW50IHVzbWJsa3M7ICAvKiB1bnVzZWQgLS0gYWx3YXlzIHplcm8gKi8KKyAgaW50IGZzbWJsa3M7ICAvKiB1bnVzZWQgLS0gYWx3YXlzIHplcm8gKi8KKyAgaW50IHVvcmRibGtzOyAvKiB0b3RhbCBhbGxvY2F0ZWQgc3BhY2UgKi8KKyAgaW50IGZvcmRibGtzOyAvKiB0b3RhbCBub24taW51c2Ugc3BhY2UgKi8KKyAgaW50IGtlZXBjb3N0OyAvKiB0b3AtbW9zdCwgcmVsZWFzYWJsZSAodmlhIG1hbGxvY190cmltKSBzcGFjZSAqLworfTsKKworLyogU1ZJRDIvWFBHIG1hbGxvcHQgb3B0aW9ucyAqLworCisjZGVmaW5lIE1fTVhGQVNUICAxICAgIC8qIFVOVVNFRCBpbiB0aGlzIG1hbGxvYyAqLworI2RlZmluZSBNX05MQkxLUyAgMiAgICAvKiBVTlVTRUQgaW4gdGhpcyBtYWxsb2MgKi8KKyNkZWZpbmUgTV9HUkFJTiAgIDMgICAgLyogVU5VU0VEIGluIHRoaXMgbWFsbG9jICovCisjZGVmaW5lIE1fS0VFUCAgICA0ICAgIC8qIFVOVVNFRCBpbiB0aGlzIG1hbGxvYyAqLworCisjZW5kaWYKKworLyogbWFsbG9wdCBvcHRpb25zIHRoYXQgYWN0dWFsbHkgZG8gc29tZXRoaW5nICovCisKKyNkZWZpbmUgTV9UUklNX1RIUkVTSE9MRCAgICAtMQorI2RlZmluZSBNX1RPUF9QQUQgICAgICAgICAgIC0yCisjZGVmaW5lIE1fTU1BUF9USFJFU0hPTEQgICAgLTMKKyNkZWZpbmUgTV9NTUFQX01BWCAgICAgICAgICAtNAorCisKKyNpZm5kZWYgREVGQVVMVF9UUklNX1RIUkVTSE9MRAorI2RlZmluZSBERUZBVUxUX1RSSU1fVEhSRVNIT0xEICgxMjggKiAxMDI0KQorI2VuZGlmCisKKy8qCisgICAgTV9UUklNX1RIUkVTSE9MRCBpcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgdW51c2VkIHRvcC1tb3N0IG1lbW9yeQorICAgICAgdG8ga2VlcCBiZWZvcmUgcmVsZWFzaW5nIHZpYSBtYWxsb2NfdHJpbSBpbiBmcmVlKCkuCisKKyAgICAgIEF1dG9tYXRpYyB0cmltbWluZyBpcyBtYWlubHkgdXNlZnVsIGluIGxvbmctbGl2ZWQgcHJvZ3JhbXMuCisgICAgICBCZWNhdXNlIHRyaW1taW5nIHZpYSBzYnJrIGNhbiBiZSBzbG93IG9uIHNvbWUgc3lzdGVtcywgYW5kIGNhbgorICAgICAgc29tZXRpbWVzIGJlIHdhc3RlZnVsIChpbiBjYXNlcyB3aGVyZSBwcm9ncmFtcyBpbW1lZGlhdGVseQorICAgICAgYWZ0ZXJ3YXJkIGFsbG9jYXRlIG1vcmUgbGFyZ2UgY2h1bmtzKSB0aGUgdmFsdWUgc2hvdWxkIGJlIGhpZ2gKKyAgICAgIGVub3VnaCBzbyB0aGF0IHlvdXIgb3ZlcmFsbCBzeXN0ZW0gcGVyZm9ybWFuY2Ugd291bGQgaW1wcm92ZSBieQorICAgICAgcmVsZWFzaW5nLgorCisgICAgICBUaGUgdHJpbSB0aHJlc2hvbGQgYW5kIHRoZSBtbWFwIGNvbnRyb2wgcGFyYW1ldGVycyAoc2VlIGJlbG93KQorICAgICAgY2FuIGJlIHRyYWRlZCBvZmYgd2l0aCBvbmUgYW5vdGhlci4gVHJpbW1pbmcgYW5kIG1tYXBwaW5nIGFyZQorICAgICAgdHdvIGRpZmZlcmVudCB3YXlzIG9mIHJlbGVhc2luZyB1bnVzZWQgbWVtb3J5IGJhY2sgdG8gdGhlCisgICAgICBzeXN0ZW0uIEJldHdlZW4gdGhlc2UgdHdvLCBpdCBpcyBvZnRlbiBwb3NzaWJsZSB0byBrZWVwCisgICAgICBzeXN0ZW0tbGV2ZWwgZGVtYW5kcyBvZiBhIGxvbmctbGl2ZWQgcHJvZ3JhbSBkb3duIHRvIGEgYmFyZQorICAgICAgbWluaW11bS4gRm9yIGV4YW1wbGUsIGluIG9uZSB0ZXN0IHN1aXRlIG9mIHNlc3Npb25zIG1lYXN1cmluZworICAgICAgdGhlIFhGODYgWCBzZXJ2ZXIgb24gTGludXgsIHVzaW5nIGEgdHJpbSB0aHJlc2hvbGQgb2YgMTI4SyBhbmQgYQorICAgICAgbW1hcCB0aHJlc2hvbGQgb2YgMTkySyBsZWQgdG8gbmVhci1taW5pbWFsIGxvbmcgdGVybSByZXNvdXJjZQorICAgICAgY29uc3VtcHRpb24uCisKKyAgICAgIElmIHlvdSBhcmUgdXNpbmcgdGhpcyBtYWxsb2MgaW4gYSBsb25nLWxpdmVkIHByb2dyYW0sIGl0IHNob3VsZAorICAgICAgcGF5IHRvIGV4cGVyaW1lbnQgd2l0aCB0aGVzZSB2YWx1ZXMuICBBcyBhIHJvdWdoIGd1aWRlLCB5b3UKKyAgICAgIG1pZ2h0IHNldCB0byBhIHZhbHVlIGNsb3NlIHRvIHRoZSBhdmVyYWdlIHNpemUgb2YgYSBwcm9jZXNzCisgICAgICAocHJvZ3JhbSkgcnVubmluZyBvbiB5b3VyIHN5c3RlbS4gIFJlbGVhc2luZyB0aGlzIG11Y2ggbWVtb3J5CisgICAgICB3b3VsZCBhbGxvdyBzdWNoIGEgcHJvY2VzcyB0byBydW4gaW4gbWVtb3J5LiAgR2VuZXJhbGx5LCBpdCdzCisgICAgICB3b3J0aCBpdCB0byB0dW5lIGZvciB0cmltbWluZyByYXRoZXIgdGhhbSBtZW1vcnkgbWFwcGluZyB3aGVuIGEKKyAgICAgIHByb2dyYW0gdW5kZXJnb2VzIHBoYXNlcyB3aGVyZSBzZXZlcmFsIGxhcmdlIGNodW5rcyBhcmUKKyAgICAgIGFsbG9jYXRlZCBhbmQgcmVsZWFzZWQgaW4gd2F5cyB0aGF0IGNhbiByZXVzZSBlYWNoIG90aGVyJ3MKKyAgICAgIHN0b3JhZ2UsIHBlcmhhcHMgbWl4ZWQgd2l0aCBwaGFzZXMgd2hlcmUgdGhlcmUgYXJlIG5vIHN1Y2gKKyAgICAgIGNodW5rcyBhdCBhbGwuICBBbmQgaW4gd2VsbC1iZWhhdmVkIGxvbmctbGl2ZWQgcHJvZ3JhbXMsCisgICAgICBjb250cm9sbGluZyByZWxlYXNlIG9mIGxhcmdlIGJsb2NrcyB2aWEgdHJpbW1pbmcgdmVyc3VzIG1hcHBpbmcKKyAgICAgIGlzIHVzdWFsbHkgZmFzdGVyLgorCisgICAgICBIb3dldmVyLCBpbiBtb3N0IHByb2dyYW1zLCB0aGVzZSBwYXJhbWV0ZXJzIHNlcnZlIG1haW5seSBhcworICAgICAgcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSBzeXN0ZW0tbGV2ZWwgZWZmZWN0cyBvZiBjYXJyeWluZyBhcm91bmQKKyAgICAgIG1hc3NpdmUgYW1vdW50cyBvZiB1bm5lZWRlZCBtZW1vcnkuIFNpbmNlIGZyZXF1ZW50IGNhbGxzIHRvCisgICAgICBzYnJrLCBtbWFwLCBhbmQgbXVubWFwIG90aGVyd2lzZSBkZWdyYWRlIHBlcmZvcm1hbmNlLCB0aGUgZGVmYXVsdAorICAgICAgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHJlbGF0aXZlbHkgaGlnaCB2YWx1ZXMgdGhhdCBzZXJ2ZSBvbmx5IGFzCisgICAgICBzYWZlZ3VhcmRzLgorCisgICAgICBUaGUgZGVmYXVsdCB0cmltIHZhbHVlIGlzIGhpZ2ggZW5vdWdoIHRvIGNhdXNlIHRyaW1taW5nIG9ubHkgaW4KKyAgICAgIGZhaXJseSBleHRyZW1lIChieSBjdXJyZW50IG1lbW9yeSBjb25zdW1wdGlvbiBzdGFuZGFyZHMpIGNhc2VzLgorICAgICAgSXQgbXVzdCBiZSBncmVhdGVyIHRoYW4gcGFnZSBzaXplIHRvIGhhdmUgYW55IHVzZWZ1bCBlZmZlY3QuICBUbworICAgICAgZGlzYWJsZSB0cmltbWluZyBjb21wbGV0ZWx5LCB5b3UgY2FuIHNldCB0byAodW5zaWduZWQgbG9uZykoLTEpOworCisKKyovCisKKworI2lmbmRlZiBERUZBVUxUX1RPUF9QQUQKKyNkZWZpbmUgREVGQVVMVF9UT1BfUEFEICAgICAgICAoMCkKKyNlbmRpZgorCisvKgorICAgIE1fVE9QX1BBRCBpcyB0aGUgYW1vdW50IG9mIGV4dHJhIGBwYWRkaW5nJyBzcGFjZSB0byBhbGxvY2F0ZSBvcgorICAgICAgcmV0YWluIHdoZW5ldmVyIHNicmsgaXMgY2FsbGVkLiBJdCBpcyB1c2VkIGluIHR3byB3YXlzIGludGVybmFsbHk6CisKKyAgICAgICogV2hlbiBzYnJrIGlzIGNhbGxlZCB0byBleHRlbmQgdGhlIHRvcCBvZiB0aGUgYXJlbmEgdG8gc2F0aXNmeQorCWEgbmV3IG1hbGxvYyByZXF1ZXN0LCB0aGlzIG11Y2ggcGFkZGluZyBpcyBhZGRlZCB0byB0aGUgc2JyaworCXJlcXVlc3QuCisKKyAgICAgICogV2hlbiBtYWxsb2NfdHJpbSBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBmcm9tIGZyZWUoKSwKKwlpdCBpcyB1c2VkIGFzIHRoZSBgcGFkJyBhcmd1bWVudC4KKworICAgICAgSW4gYm90aCBjYXNlcywgdGhlIGFjdHVhbCBhbW91bnQgb2YgcGFkZGluZyBpcyByb3VuZGVkCisgICAgICBzbyB0aGF0IHRoZSBlbmQgb2YgdGhlIGFyZW5hIGlzIGFsd2F5cyBhIHN5c3RlbSBwYWdlIGJvdW5kYXJ5LgorCisgICAgICBUaGUgbWFpbiByZWFzb24gZm9yIHVzaW5nIHBhZGRpbmcgaXMgdG8gYXZvaWQgY2FsbGluZyBzYnJrIHNvCisgICAgICBvZnRlbi4gSGF2aW5nIGV2ZW4gYSBzbWFsbCBwYWQgZ3JlYXRseSByZWR1Y2VzIHRoZSBsaWtlbGlob29kCisgICAgICB0aGF0IG5lYXJseSBldmVyeSBtYWxsb2MgcmVxdWVzdCBkdXJpbmcgcHJvZ3JhbSBzdGFydC11cCAob3IKKyAgICAgIGFmdGVyIHRyaW1taW5nKSB3aWxsIGludm9rZSBzYnJrLCB3aGljaCBuZWVkbGVzc2x5IHdhc3RlcworICAgICAgdGltZS4KKworICAgICAgQXV0b21hdGljIHJvdW5kaW5nLXVwIHRvIHBhZ2Utc2l6ZSB1bml0cyBpcyBub3JtYWxseSBzdWZmaWNpZW50CisgICAgICB0byBhdm9pZCBtZWFzdXJhYmxlIG92ZXJoZWFkLCBzbyB0aGUgZGVmYXVsdCBpcyAwLiAgSG93ZXZlciwgaW4KKyAgICAgIHN5c3RlbXMgd2hlcmUgc2JyayBpcyByZWxhdGl2ZWx5IHNsb3csIGl0IGNhbiBwYXkgdG8gaW5jcmVhc2UKKyAgICAgIHRoaXMgdmFsdWUsIGF0IHRoZSBleHBlbnNlIG9mIGNhcnJ5aW5nIGFyb3VuZCBtb3JlIG1lbW9yeSB0aGFuCisgICAgICB0aGUgcHJvZ3JhbSBuZWVkcy4KKworKi8KKworCisjaWZuZGVmIERFRkFVTFRfTU1BUF9USFJFU0hPTEQKKyNkZWZpbmUgREVGQVVMVF9NTUFQX1RIUkVTSE9MRCAoMTI4ICogMTAyNCkKKyNlbmRpZgorCisvKgorCisgICAgTV9NTUFQX1RIUkVTSE9MRCBpcyB0aGUgcmVxdWVzdCBzaXplIHRocmVzaG9sZCBmb3IgdXNpbmcgbW1hcCgpCisgICAgICB0byBzZXJ2aWNlIGEgcmVxdWVzdC4gUmVxdWVzdHMgb2YgYXQgbGVhc3QgdGhpcyBzaXplIHRoYXQgY2Fubm90CisgICAgICBiZSBhbGxvY2F0ZWQgdXNpbmcgYWxyZWFkeS1leGlzdGluZyBzcGFjZSB3aWxsIGJlIHNlcnZpY2VkIHZpYSBtbWFwLgorICAgICAgKElmIGVub3VnaCBub3JtYWwgZnJlZWQgc3BhY2UgYWxyZWFkeSBleGlzdHMgaXQgaXMgdXNlZCBpbnN0ZWFkLikKKworICAgICAgVXNpbmcgbW1hcCBzZWdyZWdhdGVzIHJlbGF0aXZlbHkgbGFyZ2UgY2h1bmtzIG9mIG1lbW9yeSBzbyB0aGF0CisgICAgICB0aGV5IGNhbiBiZSBpbmRpdmlkdWFsbHkgb2J0YWluZWQgYW5kIHJlbGVhc2VkIGZyb20gdGhlIGhvc3QKKyAgICAgIHN5c3RlbS4gQSByZXF1ZXN0IHNlcnZpY2VkIHRocm91Z2ggbW1hcCBpcyBuZXZlciByZXVzZWQgYnkgYW55CisgICAgICBvdGhlciByZXF1ZXN0IChhdCBsZWFzdCBub3QgZGlyZWN0bHk7IHRoZSBzeXN0ZW0gbWF5IGp1c3Qgc28KKyAgICAgIGhhcHBlbiB0byByZW1hcCBzdWNjZXNzaXZlIHJlcXVlc3RzIHRvIHRoZSBzYW1lIGxvY2F0aW9ucykuCisKKyAgICAgIFNlZ3JlZ2F0aW5nIHNwYWNlIGluIHRoaXMgd2F5IGhhcyB0aGUgYmVuZWZpdCB0aGF0IG1tYXBwZWQgc3BhY2UKKyAgICAgIGNhbiBBTFdBWVMgYmUgaW5kaXZpZHVhbGx5IHJlbGVhc2VkIGJhY2sgdG8gdGhlIHN5c3RlbSwgd2hpY2gKKyAgICAgIGhlbHBzIGtlZXAgdGhlIHN5c3RlbSBsZXZlbCBtZW1vcnkgZGVtYW5kcyBvZiBhIGxvbmctbGl2ZWQKKyAgICAgIHByb2dyYW0gbG93LiBNYXBwZWQgbWVtb3J5IGNhbiBuZXZlciBiZWNvbWUgYGxvY2tlZCcgYmV0d2VlbgorICAgICAgb3RoZXIgY2h1bmtzLCBhcyBjYW4gaGFwcGVuIHdpdGggbm9ybWFsbHkgYWxsb2NhdGVkIGNodW5rcywgd2hpY2gKKyAgICAgIG1lbmFzIHRoYXQgZXZlbiB0cmltbWluZyB2aWEgbWFsbG9jX3RyaW0gd291bGQgbm90IHJlbGVhc2UgdGhlbS4KKworICAgICAgSG93ZXZlciwgaXQgaGFzIHRoZSBkaXNhZHZhbnRhZ2VzIHRoYXQ6CisKKwkgMS4gVGhlIHNwYWNlIGNhbm5vdCBiZSByZWNsYWltZWQsIGNvbnNvbGlkYXRlZCwgYW5kIHRoZW4KKwkgICAgdXNlZCB0byBzZXJ2aWNlIGxhdGVyIHJlcXVlc3RzLCBhcyBoYXBwZW5zIHdpdGggbm9ybWFsIGNodW5rcy4KKwkgMi4gSXQgY2FuIGxlYWQgdG8gbW9yZSB3YXN0YWdlIGJlY2F1c2Ugb2YgbW1hcCBwYWdlIGFsaWdubWVudAorCSAgICByZXF1aXJlbWVudHMKKwkgMy4gSXQgY2F1c2VzIG1hbGxvYyBwZXJmb3JtYW5jZSB0byBiZSBtb3JlIGRlcGVuZGVudCBvbiBob3N0CisJICAgIHN5c3RlbSBtZW1vcnkgbWFuYWdlbWVudCBzdXBwb3J0IHJvdXRpbmVzIHdoaWNoIG1heSB2YXJ5IGluCisJICAgIGltcGxlbWVudGF0aW9uIHF1YWxpdHkgYW5kIG1heSBpbXBvc2UgYXJiaXRyYXJ5CisJICAgIGxpbWl0YXRpb25zLiBHZW5lcmFsbHksIHNlcnZpY2luZyBhIHJlcXVlc3QgdmlhIG5vcm1hbAorCSAgICBtYWxsb2Mgc3RlcHMgaXMgZmFzdGVyIHRoYW4gZ29pbmcgdGhyb3VnaCBhIHN5c3RlbSdzIG1tYXAuCisKKyAgICAgIEFsbCB0b2dldGhlciwgdGhlc2UgY29uc2lkZXJhdGlvbnMgc2hvdWxkIGxlYWQgeW91IHRvIHVzZSBtbWFwCisgICAgICBvbmx5IGZvciByZWxhdGl2ZWx5IGxhcmdlIHJlcXVlc3RzLgorCisKKyovCisKKworI2lmbmRlZiBERUZBVUxUX01NQVBfTUFYCisjaWYgSEFWRV9NTUFQCisjZGVmaW5lIERFRkFVTFRfTU1BUF9NQVggICAgICAgKDY0KQorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9NTUFQX01BWCAgICAgICAoMCkKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgICAgTV9NTUFQX01BWCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgdG8gc2ltdWx0YW5lb3VzbHkKKyAgICAgIHNlcnZpY2UgdXNpbmcgbW1hcC4gVGhpcyBwYXJhbWV0ZXIgZXhpc3RzIGJlY2F1c2U6CisKKwkgMS4gU29tZSBzeXN0ZW1zIGhhdmUgYSBsaW1pdGVkIG51bWJlciBvZiBpbnRlcm5hbCB0YWJsZXMgZm9yCisJICAgIHVzZSBieSBtbWFwLgorCSAyLiBJbiBtb3N0IHN5c3RlbXMsIG92ZXJyZWxpYW5jZSBvbiBtbWFwIGNhbiBkZWdyYWRlIG92ZXJhbGwKKwkgICAgcGVyZm9ybWFuY2UuCisJIDMuIElmIGEgcHJvZ3JhbSBhbGxvY2F0ZXMgbWFueSBsYXJnZSByZWdpb25zLCBpdCBpcyBwcm9iYWJseQorCSAgICBiZXR0ZXIgb2ZmIHVzaW5nIG5vcm1hbCBzYnJrLWJhc2VkIGFsbG9jYXRpb24gcm91dGluZXMgdGhhdAorCSAgICBjYW4gcmVjbGFpbSBhbmQgcmVhbGxvY2F0ZSBub3JtYWwgaGVhcCBtZW1vcnkuIFVzaW5nIGEKKwkgICAgc21hbGwgdmFsdWUgYWxsb3dzIHRyYW5zaXRpb24gaW50byB0aGlzIG1vZGUgYWZ0ZXIgdGhlCisJICAgIGZpcnN0IGZldyBhbGxvY2F0aW9ucy4KKworICAgICAgU2V0dGluZyB0byAwIGRpc2FibGVzIGFsbCB1c2Ugb2YgbW1hcC4gIElmIEhBVkVfTU1BUCBpcyBub3Qgc2V0LAorICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgaXMgMCwgYW5kIGF0dGVtcHRzIHRvIHNldCBpdCB0byBub24temVybyB2YWx1ZXMKKyAgICAgIGluIG1hbGxvcHQgd2lsbCBmYWlsLgorKi8KKworCisvKgorICAgIFVTRV9ETF9QUkVGSVggd2lsbCBwcmVmaXggYWxsIHB1YmxpYyByb3V0aW5lcyB3aXRoIHRoZSBzdHJpbmcgJ2RsJy4KKyAgICAgIFVzZWZ1bCB0byBxdWlja2x5IGF2b2lkIHByb2NlZHVyZSBkZWNsYXJhdGlvbiBjb25mbGljdHMgYW5kIGxpbmtlcgorICAgICAgc3ltYm9sIGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLgorCisqLworCisvKiAjZGVmaW5lIFVTRV9ETF9QUkVGSVggKi8KKworCisvKgorCisgIFNwZWNpYWwgZGVmaW5lcyBmb3IgbGludXggbGliYworCisgIEV4Y2VwdCB3aGVuIGNvbXBpbGVkIHVzaW5nIHRoZXNlIHNwZWNpYWwgZGVmaW5lcyBmb3IgTGludXggbGliYworICB1c2luZyB3ZWFrIGFsaWFzZXMsIHRoaXMgbWFsbG9jIGlzIE5PVCBkZXNpZ25lZCB0byB3b3JrIGluCisgIG11bHRpdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgTm8gc2VtYXBob3JlcyBvciBvdGhlciBjb25jdXJyZW5jeQorICBjb250cm9sIGFyZSBwcm92aWRlZCB0byBlbnN1cmUgdGhhdCBtdWx0aXBsZSBtYWxsb2Mgb3IgZnJlZSBjYWxscworICBkb24ndCBydW4gYXQgdGhlIHNhbWUgdGltZSwgd2hpY2ggY291bGQgYmUgZGlzYXN0ZXJvdXMuIEEgc2luZ2xlCisgIHNlbWFwaG9yZSBjb3VsZCBiZSB1c2VkIGFjcm9zcyBtYWxsb2MsIHJlYWxsb2MsIGFuZCBmcmVlICh3aGljaCBpcworICBlc3NlbnRpYWxseSB0aGUgZWZmZWN0IG9mIHRoZSBsaW51eCB3ZWFrIGFsaWFzIGFwcHJvYWNoKS4gSXQgd291bGQKKyAgYmUgaGFyZCB0byBvYnRhaW4gZmluZXIgZ3JhbnVsYXJpdHkuCisKKyovCisKKworI2lmZGVmIElOVEVSTkFMX0xJTlVYX0NfTElCCisKKyNpZiBfX1NURF9DCisKK1ZvaWRfdCAqIF9fZGVmYXVsdF9tb3JlY29yZV9pbml0IChwdHJkaWZmX3QpOworVm9pZF90ICooKl9fbW9yZWNvcmUpKHB0cmRpZmZfdCkgPSBfX2RlZmF1bHRfbW9yZWNvcmVfaW5pdDsKKworI2Vsc2UKKworVm9pZF90ICogX19kZWZhdWx0X21vcmVjb3JlX2luaXQgKCk7CitWb2lkX3QgKigqX19tb3JlY29yZSkoKSA9IF9fZGVmYXVsdF9tb3JlY29yZV9pbml0OworCisjZW5kaWYKKworI2RlZmluZSBNT1JFQ09SRSAoKl9fbW9yZWNvcmUpCisjZGVmaW5lIE1PUkVDT1JFX0ZBSUxVUkUgMAorI2RlZmluZSBNT1JFQ09SRV9DTEVBUlMgMQorCisjZWxzZSAvKiBJTlRFUk5BTF9MSU5VWF9DX0xJQiAqLworCisjaWYgX19TVERfQworZXh0ZXJuIFZvaWRfdCogICAgIHNicmsocHRyZGlmZl90KTsKKyNlbHNlCitleHRlcm4gVm9pZF90KiAgICAgc2JyaygpOworI2VuZGlmCisKKyNpZm5kZWYgTU9SRUNPUkUKKyNkZWZpbmUgTU9SRUNPUkUgc2JyaworI2VuZGlmCisKKyNpZm5kZWYgTU9SRUNPUkVfRkFJTFVSRQorI2RlZmluZSBNT1JFQ09SRV9GQUlMVVJFIC0xCisjZW5kaWYKKworI2lmbmRlZiBNT1JFQ09SRV9DTEVBUlMKKyNkZWZpbmUgTU9SRUNPUkVfQ0xFQVJTIDEKKyNlbmRpZgorCisjZW5kaWYgLyogSU5URVJOQUxfTElOVVhfQ19MSUIgKi8KKworI2lmIGRlZmluZWQoSU5URVJOQUxfTElOVVhfQ19MSUIpICYmIGRlZmluZWQoX19FTEZfXykKKworI2RlZmluZSBjQUxMT2MJCV9fbGliY19jYWxsb2MKKyNkZWZpbmUgZlJFZQkJX19saWJjX2ZyZWUKKyNkZWZpbmUgbUFMTE9jCQlfX2xpYmNfbWFsbG9jCisjZGVmaW5lIG1FTUFMSUduCV9fbGliY19tZW1hbGlnbgorI2RlZmluZSByRUFMTE9jCQlfX2xpYmNfcmVhbGxvYworI2RlZmluZSB2QUxMT2MJCV9fbGliY192YWxsb2MKKyNkZWZpbmUgcHZBTExPYwkJX19saWJjX3B2YWxsb2MKKyNkZWZpbmUgbUFMTElORm8JX19saWJjX21hbGxpbmZvCisjZGVmaW5lIG1BTExPUHQJCV9fbGliY19tYWxsb3B0CisKKyNwcmFnbWEgd2VhayBjYWxsb2MgPSBfX2xpYmNfY2FsbG9jCisjcHJhZ21hIHdlYWsgZnJlZSA9IF9fbGliY19mcmVlCisjcHJhZ21hIHdlYWsgY2ZyZWUgPSBfX2xpYmNfZnJlZQorI3ByYWdtYSB3ZWFrIG1hbGxvYyA9IF9fbGliY19tYWxsb2MKKyNwcmFnbWEgd2VhayBtZW1hbGlnbiA9IF9fbGliY19tZW1hbGlnbgorI3ByYWdtYSB3ZWFrIHJlYWxsb2MgPSBfX2xpYmNfcmVhbGxvYworI3ByYWdtYSB3ZWFrIHZhbGxvYyA9IF9fbGliY192YWxsb2MKKyNwcmFnbWEgd2VhayBwdmFsbG9jID0gX19saWJjX3B2YWxsb2MKKyNwcmFnbWEgd2VhayBtYWxsaW5mbyA9IF9fbGliY19tYWxsaW5mbworI3ByYWdtYSB3ZWFrIG1hbGxvcHQgPSBfX2xpYmNfbWFsbG9wdAorCisjZWxzZQorCisjaWZkZWYgVVNFX0RMX1BSRUZJWAorI2RlZmluZSBjQUxMT2MJCWRsY2FsbG9jCisjZGVmaW5lIGZSRWUJCWRsZnJlZQorI2RlZmluZSBtQUxMT2MJCWRsbWFsbG9jCisjZGVmaW5lIG1FTUFMSUduCWRsbWVtYWxpZ24KKyNkZWZpbmUgckVBTExPYwkJZGxyZWFsbG9jCisjZGVmaW5lIHZBTExPYwkJZGx2YWxsb2MKKyNkZWZpbmUgcHZBTExPYwkJZGxwdmFsbG9jCisjZGVmaW5lIG1BTExJTkZvCWRsbWFsbGluZm8KKyNkZWZpbmUgbUFMTE9QdAkJZGxtYWxsb3B0CisjZWxzZSAvKiBVU0VfRExfUFJFRklYICovCisjZGVmaW5lIGNBTExPYwkJY2FsbG9jCisjZGVmaW5lIGZSRWUJCWZyZWUKKyNkZWZpbmUgbUFMTE9jCQltYWxsb2MKKyNkZWZpbmUgbUVNQUxJR24JbWVtYWxpZ24KKyNkZWZpbmUgckVBTExPYwkJcmVhbGxvYworI2RlZmluZSB2QUxMT2MJCXZhbGxvYworI2RlZmluZSBwdkFMTE9jCQlwdmFsbG9jCisjZGVmaW5lIG1BTExJTkZvCW1hbGxpbmZvCisjZGVmaW5lIG1BTExPUHQJCW1hbGxvcHQKKyNlbmRpZiAvKiBVU0VfRExfUFJFRklYICovCisKKyNlbmRpZgorCisvKiBQdWJsaWMgcm91dGluZXMgKi8KKworI2lmIF9fU1REX0MKKworVm9pZF90KiBtQUxMT2Moc2l6ZV90KTsKK3ZvaWQgICAgZlJFZShWb2lkX3QqKTsKK1ZvaWRfdCogckVBTExPYyhWb2lkX3QqLCBzaXplX3QpOworVm9pZF90KiBtRU1BTElHbihzaXplX3QsIHNpemVfdCk7CitWb2lkX3QqIHZBTExPYyhzaXplX3QpOworVm9pZF90KiBwdkFMTE9jKHNpemVfdCk7CitWb2lkX3QqIGNBTExPYyhzaXplX3QsIHNpemVfdCk7Cit2b2lkICAgIGNmcmVlKFZvaWRfdCopOworaW50ICAgICBtYWxsb2NfdHJpbShzaXplX3QpOworc2l6ZV90ICBtYWxsb2NfdXNhYmxlX3NpemUoVm9pZF90Kik7Cit2b2lkICAgIG1hbGxvY19zdGF0cyh2b2lkKTsKK2ludCAgICAgbUFMTE9QdChpbnQsIGludCk7CitzdHJ1Y3QgbWFsbGluZm8gbUFMTElORm8odm9pZCk7CisjZWxzZQorVm9pZF90KiBtQUxMT2MoKTsKK3ZvaWQgICAgZlJFZSgpOworVm9pZF90KiByRUFMTE9jKCk7CitWb2lkX3QqIG1FTUFMSUduKCk7CitWb2lkX3QqIHZBTExPYygpOworVm9pZF90KiBwdkFMTE9jKCk7CitWb2lkX3QqIGNBTExPYygpOwordm9pZCAgICBjZnJlZSgpOworaW50ICAgICBtYWxsb2NfdHJpbSgpOworc2l6ZV90ICBtYWxsb2NfdXNhYmxlX3NpemUoKTsKK3ZvaWQgICAgbWFsbG9jX3N0YXRzKCk7CitpbnQgICAgIG1BTExPUHQoKTsKK3N0cnVjdCBtYWxsaW5mbyBtQUxMSU5GbygpOworI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAgLyogZW5kIG9mIGV4dGVybiAiQyIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9tbWMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbW1jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyYTkwNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbW1jLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAzCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX01NQ19IXworI2RlZmluZSBfTU1DX0hfCisKKyNpbmNsdWRlIDxwYXJ0Lmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9tbWMuaD4KKworaW50IG1tY19pbml0KGludCB2ZXJib3NlKTsKK2ludCBtbWNfcmVhZCh1bnNpZ25lZCBpbnQgc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzaXplKTsKK2ludCBtbWNfd3JpdGUodW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBsb25nIGRzdCwgaW50IHNpemUpOworaW50IG1tYzJpbmZvKHVuc2lnbmVkIGludCBhZGRyKTsKKworYmxvY2tfZGV2X2Rlc2NfdCAqbW1jX2dldF9kZXYoaW50IGRldik7CisKKyNlbmRpZiAvKiBfTU1DX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL25zMTY1NTAuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbnMxNjU1MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDJkNDAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL25zMTY1NTAuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICogIAorICogTlMxNjU1MCBTZXJpYWwgUG9ydAorICogb3JpZ2luYWxseSBmcm9tIGxpbnV4IHNvdXJjZSAoYXJjaC9wcGMvYm9vdC9uczE2NTUwLmgpCisgKiBtb2RpZmllZCBzbGlnaHRseSB0bworICogaGF2ZSBhZGRyZXNzZXMgYXMgb2Zmc2V0cyBmcm9tIENGR19JU0FfQkFTRQorICogYWRkZWQgYSBmZXcgbW9yZSBkZWZpbml0aW9ucworICogYWRkZWQgcHJvdG90eXBlcyBmb3IgbnMxNjU1MC5jCisgKiByZWR1Y2VkIG5vIG9mIGNvbSBwb3J0cyB0byAyCisgKiBtb2RpZmljYXRpb25zIChjKSBSb2IgVGF5bG9yLCBGbHlpbmcgUGlnIFN5c3RlbXMuIDIwMDAuCisgKi8KKworI2lmIChDRkdfTlMxNjU1MF9SRUdfU0laRSA9PSAxKQorc3RydWN0IE5TMTY1NTAgeworCXVuc2lnbmVkIGNoYXIgcmJyOwkJLyogMCAqLworCXVuc2lnbmVkIGNoYXIgaWVyOwkJLyogMSAqLworCXVuc2lnbmVkIGNoYXIgZmNyOwkJLyogMiAqLworCXVuc2lnbmVkIGNoYXIgbGNyOwkJLyogMyAqLworCXVuc2lnbmVkIGNoYXIgbWNyOwkJLyogNCAqLworCXVuc2lnbmVkIGNoYXIgbHNyOwkJLyogNSAqLworCXVuc2lnbmVkIGNoYXIgbXNyOwkJLyogNiAqLworCXVuc2lnbmVkIGNoYXIgc2NyOwkJLyogNyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZWxpZiAoQ0ZHX05TMTY1NTBfUkVHX1NJWkUgPT0gMikKK3N0cnVjdCBOUzE2NTUwIHsKKwl1bnNpZ25lZCBzaG9ydCByYnI7CQkvKiAwICovCisJdW5zaWduZWQgc2hvcnQgaWVyOwkJLyogMSAqLworCXVuc2lnbmVkIHNob3J0IGZjcjsJCS8qIDIgKi8KKwl1bnNpZ25lZCBzaG9ydCBsY3I7CQkvKiAzICovCisJdW5zaWduZWQgc2hvcnQgbWNyOwkJLyogNCAqLworCXVuc2lnbmVkIHNob3J0IGxzcjsJCS8qIDUgKi8KKwl1bnNpZ25lZCBzaG9ydCBtc3I7CQkvKiA2ICovCisJdW5zaWduZWQgc2hvcnQgc2NyOwkJLyogNyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZWxpZiAoQ0ZHX05TMTY1NTBfUkVHX1NJWkUgPT0gNCkKK3N0cnVjdCBOUzE2NTUwIHsKKwl1bnNpZ25lZCBsb25nIHJicjsJCS8qIDAgKi8KKwl1bnNpZ25lZCBsb25nIGllcjsJCS8qIDEgKi8KKwl1bnNpZ25lZCBsb25nIGZjcjsJCS8qIDIgKi8KKwl1bnNpZ25lZCBsb25nIGxjcjsJCS8qIDMgKi8KKwl1bnNpZ25lZCBsb25nIG1jcjsJCS8qIDQgKi8KKwl1bnNpZ25lZCBsb25nIGxzcjsJCS8qIDUgKi8KKwl1bnNpZ25lZCBsb25nIG1zcjsJCS8qIDYgKi8KKwl1bnNpZ25lZCBsb25nIHNjcjsJCS8qIDcgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworI2VsaWYgKENGR19OUzE2NTUwX1JFR19TSVpFID09IC00KQorc3RydWN0IE5TMTY1NTAgeworCXVuc2lnbmVkIGNoYXIgcmJyOwkJLyogMCAqLworCWludCBwYWQxOjI0OworCXVuc2lnbmVkIGNoYXIgaWVyOwkJLyogMSAqLworCWludCBwYWQyOjI0OworCXVuc2lnbmVkIGNoYXIgZmNyOwkJLyogMiAqLworCWludCBwYWQzOjI0OworCXVuc2lnbmVkIGNoYXIgbGNyOwkJLyogMyAqLworCWludCBwYWQ0OjI0OworCXVuc2lnbmVkIGNoYXIgbWNyOwkJLyogNCAqLworCWludCBwYWQ1OjI0OworCXVuc2lnbmVkIGNoYXIgbHNyOwkJLyogNSAqLworCWludCBwYWQ2OjI0OworCXVuc2lnbmVkIGNoYXIgbXNyOwkJLyogNiAqLworCWludCBwYWQ3OjI0OworCXVuc2lnbmVkIGNoYXIgc2NyOwkJLyogNyAqLworCWludCBwYWQ4OjI0OworI2lmIGRlZmluZWQoQ09ORklHX09NQVApCisJdW5zaWduZWQgY2hhciBtZHIxOwkJLyogbW9kZSBzZWxlY3QgcmVzZXQgVEwxNkM3NTAqLworI2VuZGlmCisjaWZkZWYgQ09ORklHX09NQVAxNTEwCisJaW50IHBhZDk6MjQ7CisJdW5zaWduZWQgbG9uZyBwYWRbMTBdOworCXVuc2lnbmVkIGNoYXIgb3NjXzEybV9zZWw7CisJaW50IHBhZDEwOjI0OworI2VuZGlmCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBkZWZpbmUgTlMxNjU1MCByZWdpc3RlcnMgc2l6ZS4iCisjZW5kaWYKKworI2RlZmluZSB0aHIgcmJyCisjZGVmaW5lIGlpciBmY3IKKyNkZWZpbmUgZGxsIHJicgorI2RlZmluZSBkbG0gaWVyCisKK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0IE5TMTY1NTAgKk5TMTY1NTBfdDsKKworI2RlZmluZSBGQ1JfRklGT19FTiAgICAgMHgwMQkJLyogRmlmbyBlbmFibGUgKi8KKyNkZWZpbmUgRkNSX1JYU1IgICAgICAgIDB4MDIJCS8qIFJlY2VpdmVyIHNvZnQgcmVzZXQgKi8KKyNkZWZpbmUgRkNSX1RYU1IgICAgICAgIDB4MDQJCS8qIFRyYW5zbWl0dGVyIHNvZnQgcmVzZXQgKi8KKworI2RlZmluZSBNQ1JfRFRSICAgICAgICAgMHgwMQorI2RlZmluZSBNQ1JfUlRTICAgICAgICAgMHgwMgorI2RlZmluZSBNQ1JfRE1BX0VOICAgICAgMHgwNAorI2RlZmluZSBNQ1JfVFhfREZSICAgICAgMHgwOAorCisjZGVmaW5lIExDUl9XTFNfTVNLCTB4MDMJCS8qIGNoYXJhY3RlciBsZW5ndGggc2xlY3QgbWFzayAqLworI2RlZmluZSBMQ1JfV0xTXzUJMHgwMAkJLyogNSBiaXQgY2hhcmFjdGVyIGxlbmd0aCAqLworI2RlZmluZSBMQ1JfV0xTXzYJMHgwMQkJLyogNiBiaXQgY2hhcmFjdGVyIGxlbmd0aCAqLworI2RlZmluZSBMQ1JfV0xTXzcJMHgwMgkJLyogNyBiaXQgY2hhcmFjdGVyIGxlbmd0aCAqLworI2RlZmluZSBMQ1JfV0xTXzgJMHgwMwkJLyogOCBiaXQgY2hhcmFjdGVyIGxlbmd0aCAqLworI2RlZmluZSBMQ1JfU1RCCQkweDA0CQkvKiBOdW1iZXIgb2Ygc3RvcCBCaXRzLCBvZmYgPSAxLCBvbiA9IDEuNSBvciAyKSAqLworI2RlZmluZSBMQ1JfUEVOCQkweDA4CQkvKiBQYXJpdHkgZW5lYmxlICovCisjZGVmaW5lIExDUl9FUFMJCTB4MTAJCS8qIEV2ZW4gUGFyaXR5IFNlbGVjdCAqLworI2RlZmluZSBMQ1JfU1RLUAkweDIwCQkvKiBTdGljayBQYXJpdHkgKi8KKyNkZWZpbmUgTENSX1NCUksJMHg0MAkJLyogU2V0IEJyZWFrICovCisjZGVmaW5lIExDUl9CS1NFCTB4ODAJCS8qIEJhbmsgc2VsZWN0IGVuYWJsZSAqLworCisjZGVmaW5lIExTUl9EUgkJMHgwMQkJLyogRGF0YSByZWFkeSAqLworI2RlZmluZSBMU1JfT0UJCTB4MDIJCS8qIE92ZXJydW4gKi8KKyNkZWZpbmUgTFNSX1BFCQkweDA0CQkvKiBQYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgTFNSX0ZFCQkweDA4CQkvKiBGcmFtaW5nIGVycm9yICovCisjZGVmaW5lIExTUl9CSQkJMHgxMAkJLyogQnJlYWsgKi8KKyNkZWZpbmUgTFNSX1RIUkUJMHgyMAkJLyogWG1pdCBob2xkaW5nIHJlZ2lzdGVyIGVtcHR5ICovCisjZGVmaW5lIExTUl9URU1UCTB4NDAJCS8qIFhtaXR0ZXIgZW1wdHkgKi8KKyNkZWZpbmUgTFNSX0VSUgkJMHg4MAkJLyogRXJyb3IgKi8KKworI2lmZGVmIENPTkZJR19PTUFQMTUxMAorI2RlZmluZSBPU0NfMTJNX1NFTAkweDAxCQkvKiBzZWxlY3RzIDYuNSAqIGN1cnJlbnQgY2xrIGRpdiAqLworI2VuZGlmCisKKy8qIHVzZWZ1bCBkZWZhdWx0cyBmb3IgTENSICovCisjZGVmaW5lIExDUl84TjEJCTB4MDMKKwordm9pZAlOUzE2NTUwX2luaXQgICAoTlMxNjU1MF90IGNvbV9wb3J0LCBpbnQgYmF1ZF9kaXZpc29yKTsKK3ZvaWQJTlMxNjU1MF9wdXRjICAgKE5TMTY1NTBfdCBjb21fcG9ydCwgY2hhciBjKTsKK2NoYXIJTlMxNjU1MF9nZXRjICAgKE5TMTY1NTBfdCBjb21fcG9ydCk7CitpbnQJTlMxNjU1MF90c3RjICAgKE5TMTY1NTBfdCBjb21fcG9ydCk7Cit2b2lkCU5TMTY1NTBfcmVpbml0IChOUzE2NTUwX3QgY29tX3BvcnQsIGludCBiYXVkX2Rpdmlzb3IpOwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9wYXJ0LmggYi94LWxvYWRlci9pbmNsdWRlL3BhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMThhYTNjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9wYXJ0LmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfUEFSVF9ICisjZGVmaW5lIF9QQVJUX0gKKyNpbmNsdWRlIDxpZGUuaD4KKwordHlwZWRlZiBzdHJ1Y3QgYmxvY2tfZGV2X2Rlc2MgeworCWludAkJaWZfdHlwZTsJLyogdHlwZSBvZiB0aGUgaW50ZXJmYWNlICovCisJaW50CSAgICAgICAgZGV2OwkgIAkvKiBkZXZpY2UgbnVtYmVyICovCisJdW5zaWduZWQgY2hhcglwYXJ0X3R5cGU7ICAJLyogcGFydGl0aW9uIHR5cGUgKi8KKwl1bnNpZ25lZCBjaGFyCXRhcmdldDsJCS8qIHRhcmdldCBTQ1NJIElEICovCisJdW5zaWduZWQgY2hhcglsdW47CQkvKiB0YXJnZXQgTFVOICovCisJdW5zaWduZWQgY2hhcgl0eXBlOwkJLyogZGV2aWNlIHR5cGUgKi8KKwl1bnNpZ25lZCBjaGFyCXJlbW92YWJsZTsJLyogcmVtb3ZhYmxlIGRldmljZSAqLworI2lmZGVmIENPTkZJR19MQkE0OAorCXVuc2lnbmVkIGNoYXIJbGJhNDg7CQkvKiBkZXZpY2UgY2FuIHVzZSA0OGJpdCBhZGRyIChBVEEvQVRBUEkgdjcpICovCisjZW5kaWYKKwlsYmFpbnRfdAkJbGJhOwkgIAkvKiBudW1iZXIgb2YgYmxvY2tzICovCisJdW5zaWduZWQgbG9uZwlibGtzejsJCS8qIGJsb2NrIHNpemUgKi8KKwl1bnNpZ25lZCBjaGFyCXZlbmRvciBbNDArMV07IAkvKiBJREUgbW9kZWwsIFNDU0kgVmVuZG9yICovCisJdW5zaWduZWQgY2hhcglwcm9kdWN0WzIwKzFdOwkvKiBJREUgU2VyaWFsIG5vLCBTQ1NJIHByb2R1Y3QgKi8KKwl1bnNpZ25lZCBjaGFyCXJldmlzaW9uWzgrMV07CS8qIGZpcm13YXJlIHJldmlzaW9uICovCisJdW5zaWduZWQgbG9uZwkoKmJsb2NrX3JlYWQpKGludCBkZXYsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkgICAgICBsYmFpbnRfdCBibGtjbnQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqYnVmZmVyKTsKK31ibG9ja19kZXZfZGVzY190OworCisvKiBJbnRlcmZhY2UgdHlwZXM6ICovCisjZGVmaW5lIElGX1RZUEVfVU5LTk9XTgkJMAorI2RlZmluZSBJRl9UWVBFX0lERQkJMQorI2RlZmluZSBJRl9UWVBFX1NDU0kJCTIKKyNkZWZpbmUgSUZfVFlQRV9BVEFQSQkJMworI2RlZmluZSBJRl9UWVBFX1VTQgkJNAorI2RlZmluZSBJRl9UWVBFX0RPQwkJNQorI2RlZmluZSBJRl9UWVBFX01NQwkJNgorCisvKiBQYXJ0IHR5cGVzICovCisjZGVmaW5lIFBBUlRfVFlQRV9VTktOT1dOCTB4MDAKKyNkZWZpbmUgUEFSVF9UWVBFX01BQwkJMHgwMQorI2RlZmluZSBQQVJUX1RZUEVfRE9TCQkweDAyCisjZGVmaW5lIFBBUlRfVFlQRV9JU08JCTB4MDMKKyNkZWZpbmUgUEFSVF9UWVBFX0FNSUdBCQkweDA0CisKKy8qCisgKiBUeXBlIHN0cmluZyBmb3IgVS1Cb290IGJvb3RhYmxlIHBhcnRpdGlvbnMKKyAqLworI2RlZmluZSBCT09UX1BBUlRfVFlQRQkiVS1Cb290IgkvKiBwcmltYXJ5IGJvb3QgcGFydGl0aW9uIHR5cGUJKi8KKyNkZWZpbmUgQk9PVF9QQVJUX0NPTVAJIlBQQ0Jvb3QiCS8qIFBQQ0Jvb3QgY29tcGF0aWJpbGl0eSB0eXBlCSovCisKKy8qIGRldmljZSB0eXBlcyAqLworI2RlZmluZSBERVZfVFlQRV9VTktOT1dOCTB4ZmYJLyogbm90IGNvbm5lY3RlZCAqLworI2RlZmluZSBERVZfVFlQRV9IQVJERElTSwkweDAwCS8qIGhhcmRkaXNrICovCisjZGVmaW5lIERFVl9UWVBFX1RBUEUJCTB4MDEJLyogVGFwZSAqLworI2RlZmluZSBERVZfVFlQRV9DRFJPTQkJMHgwNQkvKiBDRC1ST00gKi8KKyNkZWZpbmUgREVWX1RZUEVfT1BESVNLCQkweDA3CS8qIG9wdGljYWwgZGlzayAqLworCit0eXBlZGVmIHN0cnVjdCBkaXNrX3BhcnRpdGlvbiB7CisJdWxvbmcJc3RhcnQ7CQkvKiAjIG9mIGZpcnN0IGJsb2NrIGluIHBhcnRpdGlvbgkqLworCXVsb25nCXNpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzIGluIHBhcnRpdGlvbgkqLworCXVsb25nCWJsa3N6OwkJLyogYmxvY2sgc2l6ZSBpbiBieXRlcwkJCSovCisJdWNoYXIJbmFtZVszMl07CS8qIHBhcnRpdGlvbiBuYW1lCQkJKi8KKwl1Y2hhcgl0eXBlWzMyXTsJLyogc3RyaW5nIHR5cGUgZGVzY3JpcHRpb24JCSovCit9IGRpc2tfcGFydGl0aW9uX3Q7CisKKy8qIGRpc2svcGFydC5jICovCitpbnQgZ2V0X3BhcnRpdGlvbl9pbmZvIChibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKTsKK3ZvaWQgcHJpbnRfcGFydCAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOwordm9pZCAgaW5pdF9wYXJ0IChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7Cit2b2lkIGRldl9wcmludChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CisKKworI2lmZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCisvKiBkaXNrL3BhcnRfbWFjLmMgKi8KK2ludCBnZXRfcGFydGl0aW9uX2luZm9fbWFjIChibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKTsKK3ZvaWQgcHJpbnRfcGFydF9tYWMgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKK2ludCAgIHRlc3RfcGFydF9tYWMgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RPU19QQVJUSVRJT04KKy8qIGRpc2svcGFydF9kb3MuYyAqLworaW50IGdldF9wYXJ0aXRpb25faW5mb19kb3MgKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYywgaW50IHBhcnQsIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pOwordm9pZCBwcmludF9wYXJ0X2RvcyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworaW50ICAgdGVzdF9wYXJ0X2RvcyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSVNPX1BBUlRJVElPTgorLyogZGlzay9wYXJ0X2lzby5jICovCitpbnQgZ2V0X3BhcnRpdGlvbl9pbmZvX2lzbyAoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjLCBpbnQgcGFydCwgZGlza19wYXJ0aXRpb25fdCAqaW5mbyk7Cit2b2lkIHByaW50X3BhcnRfaXNvIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CitpbnQgICB0ZXN0X3BhcnRfaXNvIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BTUlHQV9QQVJUSVRJT04KKy8qIGRpc2svcGFydF9hbWlnYS5jICovCitpbnQgZ2V0X3BhcnRpdGlvbl9pbmZvX2FtaWdhIChibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKTsKK3ZvaWQgcHJpbnRfcGFydF9hbWlnYSAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworaW50ICAgdGVzdF9wYXJ0X2FtaWdhIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9QQVJUX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvcnRjLmggYi94LWxvYWRlci9pbmNsdWRlL3J0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDZiYTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL3J0Yy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIEdlbmVyaWMgUlRDIGludGVyZmFjZS4KKyAqLworI2lmbmRlZiBfUlRDX0hfCisjZGVmaW5lIF9SVENfSF8KKworLyogYmNkPC0+YmluIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIGJ5IGFsbW9zdCBhbGwgdGhlIFJUQyBkcml2ZXJzLCBsZXQncyBpbmNsdWRlCisgKiBpdCB0aGVyZSBpbnN0ZWFkIG9mIGluIGV2ZXkgc2luZ2xlIGRyaXZlciAqLworCisjaW5jbHVkZSA8YmNkLmg+CisKKy8qCisgKiBUaGUgc3RydWN0IHVzZWQgdG8gcGFzcyBkYXRhIGZyb20gdGhlIGdlbmVyaWMgaW50ZXJmYWNlIGNvZGUgdG8KKyAqIHRoZSBoYXJkd2FyZSBkZXBlbmRlbmQgbG93LWxldmVsIGNvZGUgYW5kZSB2aWNlIHZlcnNhLiBJZGVudGljYWwKKyAqIHRvIHN0cnVjdCBydGNfdGltZSB1c2VkIGJ5IHRoZSBMaW51eCBrZXJuZWwuCisgKgorICogTm90ZSB0aGF0IHRoZXJlIGFyZSBzbWFsbCBidXQgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgdG8gdGhlCisgKiBjb21tb24gInN0cnVjdCB0aW1lIjoKKyAqCisgKgkJc3RydWN0IHRpbWU6CQlzdHJ1Y3QgcnRjX3RpbWU6CisgKiB0bV9tb24JMCAuLi4gMTEJCTEgLi4uIDEyCisgKiB0bV95ZWFyCXllYXJzIHNpbmNlIDE5MDAJeWVhcnMgc2luY2UgMAorICovCisKK3N0cnVjdCBydGNfdGltZSB7CisJaW50IHRtX3NlYzsKKwlpbnQgdG1fbWluOworCWludCB0bV9ob3VyOworCWludCB0bV9tZGF5OworCWludCB0bV9tb247CisJaW50IHRtX3llYXI7CisJaW50IHRtX3dkYXk7CisJaW50IHRtX3lkYXk7CisJaW50IHRtX2lzZHN0OworfTsKKwordm9pZCBHcmVnb3JpYW5EYXkgKHN0cnVjdCBydGNfdGltZSAqKTsKK3ZvaWQgdG9fdG0gKGludCwgc3RydWN0IHJ0Y190aW1lICopOwordW5zaWduZWQgbG9uZyBta3RpbWUgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCisJCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworCisjZW5kaWYJLyogX1JUQ19IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS90aW1lc3RhbXAuaCBiL3gtbG9hZGVyL2luY2x1ZGUvdGltZXN0YW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmNGNmNAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvdGltZXN0YW1wLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IEV4dHJlbWUgRW5naW5lZXJpbmcgU29sdXRpb25zLCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZglfX1RJTUVTVEFNUF9IX18KKyNkZWZpbmUJX19USU1FU1RBTVBfSF9fCisKKyNpZm5kZWYgRE9fREVQU19PTkxZCisjaW5jbHVkZSAidGltZXN0YW1wX2F1dG9nZW5lcmF0ZWQuaCIKKyNlbmRpZgorCisjZW5kaWYJLyogX19USU1FU1RBTVBfSF9fICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL3ZlcnNpb24uaCBiL3gtbG9hZGVyL2luY2x1ZGUvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDI5MWEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL3ZlcnNpb24uaApAQCAtMCwwICsxLDMxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZglfX1ZFUlNJT05fSF9fCisjZGVmaW5lCV9fVkVSU0lPTl9IX18KKworI2lmbmRlZiBET19ERVBTX09OTFkKKyNpbmNsdWRlICJ2ZXJzaW9uX2F1dG9nZW5lcmF0ZWQuaCIKKyNlbmRpZgorCisjZW5kaWYJLyogX19WRVJTSU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS93YXRjaGRvZy5oIGIveC1sb2FkZXIvaW5jbHVkZS93YXRjaGRvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTQxNmQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL3dhdGNoZG9nLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogRXJpayBUaGVpc2VuLCAgV2F2ZSA3IE9wdGljcywgZXRoZWlzZW5AbWluZHNwcmluZy5jb20uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIFdhdGNoZG9nIGZ1bmN0aW9ucyBhbmQgbWFjcm9zLgorICovCisjaWZuZGVmIF9XQVRDSERPR19IXworI2RlZmluZSBfV0FUQ0hET0dfSF8KKworI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKSAmJiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKyMgIGVycm9yICJDb25maWd1cmF0aW9uIGVycm9yOiBDT05GSUdfSFdfV0FUQ0hET0cgYW5kIENPTkZJR19XQVRDSERPRyBjYW4ndCBiZSB1c2VkIHRvZ2V0aGVyLiIKKyNlbmRpZgorCisvKgorICogSGFyZHdhcmUgd2F0Y2hkb2cKKyAqLworI2lmZGVmIENPTkZJR19IV19XQVRDSERPRworCSNpZiBkZWZpbmVkKF9fQVNTRU1CTFlfXykKKwkJI2RlZmluZSBXQVRDSERPR19SRVNFVCBibCBod193YXRjaGRvZ19yZXNldAorCSNlbHNlCisJCWV4dGVybiB2b2lkIGh3X3dhdGNoZG9nX3Jlc2V0KHZvaWQpOworCisJCSNkZWZpbmUgV0FUQ0hET0dfUkVTRVQgaHdfd2F0Y2hkb2dfcmVzZXQKKwkjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisjZWxzZQorCS8qCisJICogTWF5YmUgYSBzb2Z0d2FyZSB3YXRjaGRvZz8KKwkgKi8KKwkjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCisJCSNpZiBkZWZpbmVkKF9fQVNTRU1CTFlfXykKKwkJCSNkZWZpbmUgV0FUQ0hET0dfUkVTRVQgYmwgd2F0Y2hkb2dfcmVzZXQKKwkJI2Vsc2UKKwkJCWV4dGVybiB2b2lkIHdhdGNoZG9nX3Jlc2V0KHZvaWQpOworCisJCQkjZGVmaW5lIFdBVENIRE9HX1JFU0VUIHdhdGNoZG9nX3Jlc2V0CisJCSNlbmRpZgorCSNlbHNlCisJCS8qCisJCSAqIE5vIGhhcmR3YXJlIG9yIHNvZnR3YXJlIHdhdGNoZG9nLgorCQkgKi8KKwkJI2lmIGRlZmluZWQoX19BU1NFTUJMWV9fKQorCQkJI2RlZmluZSBXQVRDSERPR19SRVNFVCAvKlhYWCBET19OT1RfREVMX1RISVNfQ09NTUVOVCovCisJCSNlbHNlCisJCQkjZGVmaW5lIFdBVENIRE9HX1JFU0VUKCkge30KKwkJI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCSNlbmRpZiAvKiBDT05GSUdfV0FUQ0hET0cgJiYgIV9fQVNTRU1CTFlfXyAqLworI2VuZGlmIC8qIENPTkZJR19IV19XQVRDSERPRyAqLworCisjZW5kaWYgLyogX1dBVENIRE9HX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL3gtbG9hZC9jcmMuaCBiL3gtbG9hZGVyL2luY2x1ZGUveC1sb2FkL2NyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTFjYWIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL3gtbG9hZC9jcmMuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA5CisgKiBNYXJ2ZWxsIFNlbWljb25kdWN0b3IgPHd3dy5tYXJ2ZWxsLmNvbT4KKyAqIFdyaXR0ZW4tYnk6IFByYWZ1bGxhIFdhZGFza2FyIDxwcmFmdWxsYUBtYXJ2ZWxsLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAqIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfWExPQURfQ1JDX0gKKyNkZWZpbmUgX1hMT0FEX0NSQ19ICisKKy8qIGxpYi9jcmMzMi5jICovCit1aW50MzJfdCBjcmMzMiAodWludDMyX3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdWludCk7Cit1aW50MzJfdCBjcmMzMl93ZCAodWludDMyX3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdWludCwgdWludCk7Cit1aW50MzJfdCBjcmMzMl9ub19jb21wICh1aW50MzJfdCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1aW50KTsKKworI2VuZGlmIC8qIF9YTE9BRF9DUkNfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS94LWxvYWQvemxpYi5oIGIveC1sb2FkZXIvaW5jbHVkZS94LWxvYWQvemxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjcwODEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL3gtbG9hZC96bGliLmgKQEAgLTAsMCArMSw2OTggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHpsaWIuaCBhbmQgemNvbmYuaCBmcm9tIHRoZSB6bGliLTEuMi4zCisgKiBkaXN0cmlidXRpb24gYnkgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlciwgd2l0aCBzb21lIGFkZGl0aW9ucworICogYnkgUGF1bCBNYWNrZXJyYXMgdG8gYWlkIGluIGltcGxlbWVudGluZyBEZWZsYXRlIGNvbXByZXNzaW9uIGFuZAorICogZGVjb21wcmVzc2lvbiBmb3IgUFBQIHBhY2tldHMuCisgKi8KKworIC8qCisgICogPT1GSUxFVkVSU0lPTiA5NjAxMjI9PQorICAqCisgICogVGhpcyBtYXJrZXIgaXMgdXNlZCBieSB0aGUgTGludXggaW5zdGFsbGF0aW9uIHNjcmlwdCB0byBkZXRlcm1pbmUKKyAgKiB3aGV0aGVyIGFuIHVwLXRvLWRhdGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaXMgYWxyZWFkeSBpbnN0YWxsZWQuCisgICovCisKKy8qIHpsaWIuaCAtLSBpbnRlcmZhY2Ugb2YgdGhlICd6bGliJyBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQorICB2ZXJzaW9uIDEuMi4zLCBKdWx5IDE4dGgsIDIwMDUKKworICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKKyAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCisKKyAgVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDcyAoUmVxdWVzdCBmb3IKKyAgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQKKyAgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUgZm9ybWF0KSBhbmQgcmZjMTk1Mi50eHQgKGd6aXAgZm9ybWF0KS4KKyovCisKKyNpZm5kZWYgWkxJQl9ICisjZGVmaW5lIFpMSUJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjIuMyIKKyNkZWZpbmUgWkxJQl9WRVJOVU0gMHgxMjMwCisKKy8qICNpbmNsdWRlICJ6Y29uZi5oIiAqLyAgICAgICAgLyogaW5jbHVkZWQgZGlyZWN0bHkgaGVyZSAqLworLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQmVnaW4gb2YgbmV3IHpjb25mLmggKi8KKy8qCisgKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCisgKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KKyAqLworI2lmZGVmIFpfUFJFRklYCisjICBkZWZpbmUgZGVmbGF0ZUluaXRfICAgICAgICAgIHpfZGVmbGF0ZUluaXRfCisjICBkZWZpbmUgZGVmbGF0ZSAgICAgICAgICAgICAgIHpfZGVmbGF0ZQorIyAgZGVmaW5lIGRlZmxhdGVFbmQgICAgICAgICAgICB6X2RlZmxhdGVFbmQKKyMgIGRlZmluZSBpbmZsYXRlSW5pdF8gICAgICAgICAgel9pbmZsYXRlSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgel9pbmZsYXRlCisjICBkZWZpbmUgaW5mbGF0ZUVuZCAgICAgICAgICAgIHpfaW5mbGF0ZUVuZAorIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgICB6X2RlZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgICAgICAgICB6X2RlZmxhdGVDb3B5CisjICBkZWZpbmUgZGVmbGF0ZVJlc2V0ICAgICAgICAgIHpfZGVmbGF0ZVJlc2V0CisjICBkZWZpbmUgZGVmbGF0ZVBhcmFtcyAgICAgICAgIHpfZGVmbGF0ZVBhcmFtcworIyAgZGVmaW5lIGRlZmxhdGVCb3VuZCAgICAgICAgICB6X2RlZmxhdGVCb3VuZAorIyAgZGVmaW5lIGRlZmxhdGVQcmltZSAgICAgICAgICB6X2RlZmxhdGVQcmltZQorIyAgZGVmaW5lIGluZmxhdGVJbml0Ml8gICAgICAgICB6X2luZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSAgel9pbmZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGluZmxhdGVTeW5jICAgICAgICAgICB6X2luZmxhdGVTeW5jCisjICBkZWZpbmUgaW5mbGF0ZVN5bmNQb2ludCAgICAgIHpfaW5mbGF0ZVN5bmNQb2ludAorIyAgZGVmaW5lIGluZmxhdGVDb3B5ICAgICAgICAgICB6X2luZmxhdGVDb3B5CisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0ICAgICAgICAgIHpfaW5mbGF0ZVJlc2V0CisjICBkZWZpbmUgaW5mbGF0ZUJhY2sgICAgICAgICAgIHpfaW5mbGF0ZUJhY2sKKyMgIGRlZmluZSBpbmZsYXRlQmFja0VuZCAgICAgICAgel9pbmZsYXRlQmFja0VuZAorIyAgZGVmaW5lIGNvbXByZXNzICAgICAgICAgICAgICB6X2NvbXByZXNzCisjICBkZWZpbmUgY29tcHJlc3MyICAgICAgICAgICAgIHpfY29tcHJlc3MyCisjICBkZWZpbmUgY29tcHJlc3NCb3VuZCAgICAgICAgIHpfY29tcHJlc3NCb3VuZAorIyAgZGVmaW5lIHVuY29tcHJlc3MgICAgICAgICAgICB6X3VuY29tcHJlc3MKKyMgIGRlZmluZSBhZGxlcjMyICAgICAgICAgICAgICAgel9hZGxlcjMyCisjICBkZWZpbmUgY3JjMzIgICAgICAgICAgICAgICAgIHpfY3JjMzIKKyMgIGRlZmluZSBnZXRfY3JjX3RhYmxlICAgICAgICAgel9nZXRfY3JjX3RhYmxlCisjICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCisKKyMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCisjICBkZWZpbmUgZnJlZV9mdW5jICAgICAgICAgICAgIHpfZnJlZV9mdW5jCisjICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYworIyAgZGVmaW5lIG91dF9mdW5jICAgICAgICAgICAgICB6X291dF9mdW5jCisjICBkZWZpbmUgQnl0ZSAgICAgICAgICAgICAgICAgIHpfQnl0ZQorIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKKyMgIGRlZmluZSB1TG9uZyAgICAgICAgICAgICAgICAgel91TG9uZworIyAgZGVmaW5lIEJ5dGVmICAgICAgICAgICAgICAgICB6X0J5dGVmCisjICBkZWZpbmUgY2hhcmYgICAgICAgICAgICAgICAgIHpfY2hhcmYKKyMgIGRlZmluZSBpbnRmICAgICAgICAgICAgICAgICAgel9pbnRmCisjICBkZWZpbmUgdUludGYgICAgICAgICAgICAgICAgIHpfdUludGYKKyMgIGRlZmluZSB1TG9uZ2YgICAgICAgICAgICAgICAgel91TG9uZ2YKKyMgIGRlZmluZSB2b2lkcGYgICAgICAgICAgICAgICAgel92b2lkcGYKKyMgIGRlZmluZSB2b2lkcCAgICAgICAgICAgICAgICAgel92b2lkcAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgIWRlZmluZWQoTVNET1MpCisjICBkZWZpbmUgTVNET1MKKyNlbmRpZgorI2lmIChkZWZpbmVkKE9TXzIpIHx8IGRlZmluZWQoX19PUzJfXykpICYmICFkZWZpbmVkKE9TMikKKyMgIGRlZmluZSBPUzIKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCisjICBkZWZpbmUgV0lORE9XUworI2VuZGlmCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkgfHwgZGVmaW5lZChfX1dJTjMyX18pCisjICBpZm5kZWYgV0lOMzIKKyMgICAgZGVmaW5lIFdJTjMyCisjICBlbmRpZgorI2VuZGlmCisjaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTkRPV1MpKSAmJiAhZGVmaW5lZChXSU4zMikKKyMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykgJiYgIWRlZmluZWQoX18zODZfXykKKyMgICAgaWZuZGVmIFNZUzE2QklUCisjICAgICAgZGVmaW5lIFNZUzE2QklUCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKy8qCisgKiBDb21waWxlIHdpdGggLURNQVhTRUdfNjRLIGlmIHRoZSBhbGxvYyBmdW5jdGlvbiBjYW5ub3QgYWxsb2NhdGUgbW9yZQorICogdGhhbiA2NGsgYnl0ZXMgYXQgYSB0aW1lIChuZWVkZWQgb24gc3lzdGVtcyB3aXRoIDE2LWJpdCBpbnQpLgorICovCisjaWZkZWYgU1lTMTZCSVQKKyMgIGRlZmluZSBNQVhTRUdfNjRLCisjZW5kaWYKKyNpZmRlZiBNU0RPUworIyAgZGVmaW5lIFVOQUxJR05FRF9PSworI2VuZGlmCisKKyNpZmRlZiBfX1NURENfVkVSU0lPTl9fCisjICBpZm5kZWYgU1REQworIyAgICBkZWZpbmUgU1REQworIyAgZW5kaWYKKyMgIGlmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorIyAgICBpZm5kZWYgU1REQzk5CisjICAgICAgZGVmaW5lIFNUREM5OQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChfX0hPU19BSVhfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fT1M0MDBfXykgJiYgIWRlZmluZWQoU1REQykgICAgLyogaVNlcmllcyAoZm9ybWVybHkgQVMvNDAwKS4gKi8KKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmbmRlZiBTVERDCisjICBpZm5kZWYgY29uc3QgLyogY2Fubm90IHVzZSAhZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChjb25zdCkgb24gTWFjICovCisjICAgIGRlZmluZSBjb25zdCAgICAgICAvKiBub3RlOiBuZWVkIGEgbW9yZSBnZW50bGUgc29sdXRpb24gaGVyZSAqLworIyAgZW5kaWYKKyNlbmRpZgorCisvKiBTb21lIE1hYyBjb21waWxlcnMgbWVyZ2UgYWxsIC5oIGZpbGVzIGluY29ycmVjdGx5OiAqLworI2lmIGRlZmluZWQoX19NV0VSS1NfXyl8fGRlZmluZWQoYXBwbGVjKXx8ZGVmaW5lZChUSElOS19DKXx8ZGVmaW5lZChfX1NDX18pCisjICBkZWZpbmUgTk9fRFVNTVlfREVDTAorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLworI2lmbmRlZiBNQVhfTUVNX0xFVkVMCisjICBpZmRlZiBNQVhTRUdfNjRLCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgorICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcworICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5CisgKiBnemlwLikKKyAqLworI2lmbmRlZiBNQVhfV0JJVFMKKyMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KKyNlbmRpZgorCisvKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKKyAgICAgICAgICAgICgxIDw8ICh3aW5kb3dCaXRzKzIpKSArICAoMSA8PCAobWVtTGV2ZWwrOSkpCisgdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cz0xNSAgKyAgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4ICAoZGVmYXVsdCB2YWx1ZXMpCisgcGx1cyBhIGZldyBraWxvYnl0ZXMgZm9yIHNtYWxsIG9iamVjdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZWR1Y2UKKyB0aGUgZGVmYXVsdCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZyb20gMjU2SyB0byAxMjhLLCBjb21waWxlIHdpdGgKKyAgICAgbWFrZSBDRkxBR1M9Ii1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03IgorIE9mIGNvdXJzZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGRlZ3JhZGUgY29tcHJlc3Npb24gKHRoZXJlJ3Mgbm8gZnJlZSBsdW5jaCkuCisKKyAgIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBpbmZsYXRlIGFyZSAoaW4gYnl0ZXMpIDEgPDwgd2luZG93Qml0cworIHRoYXQgaXMsIDMySyBmb3Igd2luZG93Qml0cz0xNSAoZGVmYXVsdCB2YWx1ZSkgcGx1cyBhIGZldyBraWxvYnl0ZXMKKyBmb3Igc21hbGwgb2JqZWN0cy4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgT0YgLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworIyAgaWZkZWYgU1REQworIyAgICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICAoKQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBGQVIgYXJlIG5lZWRlZCBvbmx5IGZvciBNU0RPUyBtaXhlZAorICogbW9kZWwgcHJvZ3JhbW1pbmcgKHNtYWxsIG9yIG1lZGl1bSBtb2RlbCB3aXRoIHNvbWUgZmFyIGFsbG9jYXRpb25zKS4KKyAqIFRoaXMgd2FzIHRlc3RlZCBvbmx5IHdpdGggTVNDOyBmb3Igb3RoZXIgTVNET1MgY29tcGlsZXJzIHlvdSBtYXkgaGF2ZQorICogdG8gZGVmaW5lIE5PX01FTUNQWSBpbiB6dXRpbC5oLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlIG1peGVkIG1vZGVsLAorICoganVzdCBkZWZpbmUgRkFSIHRvIGJlIGVtcHR5LgorICovCisjaWZkZWYgU1lTMTZCSVQKKyMgIGlmIGRlZmluZWQoTV9JODZTTSkgfHwgZGVmaW5lZChNX0k4Nk1NKQorICAgICAvKiBNU0Mgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX01TQ19WRVIKKyMgICAgICBkZWZpbmUgRkFSIF9mYXIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGQVIgZmFyCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWYgKGRlZmluZWQoX19TTUFMTF9fKSB8fCBkZWZpbmVkKF9fTUVESVVNX18pKQorICAgICAvKiBUdXJibyBDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGlmZGVmIF9fQk9STEFORENfXworIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikKKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgYXMgYSBETEwsIGRlZmluZSBaTElCX0RMTC4KKyAgICAqIFRoaXMgaXMgbm90IG1hbmRhdG9yeSwgYnV0IGl0IG9mZmVycyBhIGxpdHRsZSBwZXJmb3JtYW5jZSBpbmNyZWFzZS4KKyAgICAqLworIyAgaWZkZWYgWkxJQl9ETEwKKyMgICAgaWYgZGVmaW5lZChXSU4zMikgJiYgKCFkZWZpbmVkKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA+PSAweDUwMCkpCisjICAgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYgIC8qIFpMSUJfRExMICovCisgICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIHdpdGggdGhlIFdJTkFQSS9XSU5BUElWIGNhbGxpbmcgY29udmVudGlvbiwKKyAgICAqIGRlZmluZSBaTElCX1dJTkFQSS4KKyAgICAqIENhdXRpb246IHRoZSBzdGFuZGFyZCBaTElCMS5ETEwgaXMgTk9UIGNvbXBpbGVkIHVzaW5nIFpMSUJfV0lOQVBJLgorICAgICovCisjICBpZmRlZiBaTElCX1dJTkFQSQorIyAgICBpZmRlZiBGQVIKKyMgICAgICB1bmRlZiBGQVIKKyMgICAgZW5kaWYKKyMgICAgaW5jbHVkZSA8d2luZG93cy5oPgorICAgICAvKiBObyBuZWVkIGZvciBfZXhwb3J0LCB1c2UgWkxJQi5ERUYgaW5zdGVhZC4gKi8KKyAgICAgLyogRm9yIGNvbXBsZXRlIFdpbmRvd3MgY29tcGF0aWJpbGl0eSwgdXNlIFdJTkFQSSwgbm90IF9fc3RkY2FsbC4gKi8KKyMgICAgZGVmaW5lIFpFWFBPUlQgV0lOQVBJCisjICAgIGlmZGVmIFdJTjMyCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBXSU5BUElWCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIEZBUiBDREVDTAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19CRU9TX18pCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFpFWFRFUk4KKyMgIGRlZmluZSBaRVhURVJOIGV4dGVybgorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlQKKyMgIGRlZmluZSBaRVhQT1JUCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVFZBCisjICBkZWZpbmUgWkVYUE9SVFZBCisjZW5kaWYKKworI2lmbmRlZiBGQVIKKyMgIGRlZmluZSBGQVIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19NQUNUWVBFU19fKQordHlwZWRlZiB1bnNpZ25lZCBjaGFyICBCeXRlOyAgLyogOCBiaXRzICovCisjZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgdUludDsgIC8qIDE2IGJpdHMgb3IgbW9yZSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nICB1TG9uZzsgLyogMzIgYml0cyBvciBtb3JlICovCisKKyNpZmRlZiBTTUFMTF9NRURJVU0KKyAgIC8qIEJvcmxhbmQgQy9DKysgYW5kIHNvbWUgb2xkIE1TQyB2ZXJzaW9ucyBpZ25vcmUgRkFSIGluc2lkZSB0eXBlZGVmICovCisjICBkZWZpbmUgQnl0ZWYgQnl0ZSBGQVIKKyNlbHNlCisgICB0eXBlZGVmIEJ5dGUgIEZBUiBCeXRlZjsKKyNlbmRpZgordHlwZWRlZiBjaGFyICBGQVIgY2hhcmY7Cit0eXBlZGVmIGludCAgIEZBUiBpbnRmOwordHlwZWRlZiB1SW50ICBGQVIgdUludGY7Cit0eXBlZGVmIHVMb25nIEZBUiB1TG9uZ2Y7CisKKyNpZmRlZiBTVERDCisgICB0eXBlZGVmIHZvaWQgY29uc3QgKnZvaWRwYzsKKyAgIHR5cGVkZWYgdm9pZCBGQVIgICAqdm9pZHBmOworICAgdHlwZWRlZiB2b2lkICAgICAgICp2b2lkcDsKKyNlbHNlCisgICB0eXBlZGVmIEJ5dGUgY29uc3QgKnZvaWRwYzsKKyAgIHR5cGVkZWYgQnl0ZSBGQVIgICAqdm9pZHBmOworICAgdHlwZWRlZiBCeXRlICAgICAgICp2b2lkcDsKKyNlbmRpZgorCisjICBpZmRlZiBWTVMKKyMgICAgaW5jbHVkZSA8dW5peGlvLmg+ICAgLyogZm9yIG9mZl90ICovCisjICBlbmRpZgorIyAgZGVmaW5lIHpfb2ZmX3Qgb2ZmX3QKKyNpZm5kZWYgU0VFS19TRVQKKyMgIGRlZmluZSBTRUVLX1NFVCAgICAgICAgMCAgICAgICAvKiBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuICAqLworIyAgZGVmaW5lIFNFRUtfQ1VSICAgICAgICAxICAgICAgIC8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKyMgIGRlZmluZSBTRUVLX0VORCAgICAgICAgMiAgICAgICAvKiBTZXQgZmlsZSBwb2ludGVyIHRvIEVPRiBwbHVzICJvZmZzZXQiICovCisjZW5kaWYKKyNpZm5kZWYgel9vZmZfdAorIyAgZGVmaW5lIHpfb2ZmX3QgbG9uZworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fT1M0MDBfXykKKyMgIGRlZmluZSBOT192c25wcmludGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01WU19fKQorIyAgZGVmaW5lIE5PX3ZzbnByaW50ZgorIyAgaWZkZWYgRkFSCisjICAgIHVuZGVmIEZBUgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBNVlMgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZXh0ZXJuYWwgbmFtZXMgbGFyZ2VyIHRoYW4gOCBieXRlcyAqLworI2lmIGRlZmluZWQoX19NVlNfXykKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVJbml0XywiREVJTiIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlRW5kLCJERUVORCIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlQm91bmQsIkRFQk5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdDJfLCJJTklOMiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlRW5kLCJJTkVORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlU2V0RGljdGlvbmFyeSwiSU5TRURJIikKKyMgICBwcmFnbWEgbWFwKGNvbXByZXNzQm91bmQsIkNNQk5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2Zhc3QsIklORkEiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9jb3B5cmlnaHQsIklOQ09QWSIpCisjZW5kaWYKKy8qIEVuZCBvZiBuZXcgemNvbmYuaCAqLworCisvKgorICAgICBUaGUgJ3psaWInIGNvbXByZXNzaW9uIGxpYnJhcnkgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZAorICBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZAorICBkYXRhLiAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZAorICAoZGVmbGF0aW9uKSBidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUKKyAgc3RyZWFtIGludGVyZmFjZS4KKworICAgICBDb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwIGlmIHRoZSBidWZmZXJzIGFyZSBsYXJnZQorICBlbm91Z2ggKGZvciBleGFtcGxlIGlmIGFuIGlucHV0IGZpbGUgaXMgbW1hcCdlZCksIG9yIGNhbiBiZSBkb25lIGJ5CisgIHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCisgIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKKyAgKHByb3ZpZGluZyBtb3JlIG91dHB1dCBzcGFjZSkgYmVmb3JlIGVhY2ggY2FsbC4KKworICAgICBUaGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB1c2VkIGJ5IGRlZmF1bHQgYnkgdGhlIGluLW1lbW9yeSBmdW5jdGlvbnMgaXMKKyAgdGhlIHpsaWIgZm9ybWF0LCB3aGljaCBpcyBhIHpsaWIgd3JhcHBlciBkb2N1bWVudGVkIGluIFJGQyAxOTUwLCB3cmFwcGVkCisgIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLCB3aGljaCBpcyBpdHNlbGYgZG9jdW1lbnRlZCBpbiBSRkMgMTk1MS4KKworICAgICBUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKKyAgd2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvIHVzaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzdGFydAorICB3aXRoICJneiIuICBUaGUgZ3ppcCBmb3JtYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHpsaWIgZm9ybWF0LiAgZ3ppcCBpcyBhCisgIGd6aXAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KKworICAgICBUaGlzIGxpYnJhcnkgY2FuIG9wdGlvbmFsbHkgcmVhZCBhbmQgd3JpdGUgZ3ppcCBzdHJlYW1zIGluIG1lbW9yeSBhcyB3ZWxsLgorCisgICAgIFRoZSB6bGliIGZvcm1hdCB3YXMgZGVzaWduZWQgdG8gYmUgY29tcGFjdCBhbmQgZmFzdCBmb3IgdXNlIGluIG1lbW9yeQorICBhbmQgb24gY29tbXVuaWNhdGlvbnMgY2hhbm5lbHMuICBUaGUgZ3ppcCBmb3JtYXQgd2FzIGRlc2lnbmVkIGZvciBzaW5nbGUtCisgIGZpbGUgY29tcHJlc3Npb24gb24gZmlsZSBzeXN0ZW1zLCBoYXMgYSBsYXJnZXIgaGVhZGVyIHRoYW4gemxpYiB0byBtYWludGFpbgorICBkaXJlY3RvcnkgaW5mb3JtYXRpb24sIGFuZCB1c2VzIGEgZGlmZmVyZW50LCBzbG93ZXIgY2hlY2sgbWV0aG9kIHRoYW4gemxpYi4KKworICAgICBUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4gVGhlIGRlY29kZXIgY2hlY2tzCisgIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLCBzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIKKyAgY3Jhc2ggZXZlbiBpbiBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KKyovCisKK3R5cGVkZWYgdm9pZHBmICgqYWxsb2NfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkpOwordHlwZWRlZiB2b2lkICAgKCpmcmVlX2Z1bmMpICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIGFkZHJlc3MsIHVJbnQgc2l6ZSkpOwordHlwZWRlZiB2b2lkICAgKCpjYl9mdW5jKSAgICBPRigoQnl0ZWYgKmJ1ZiwgdUludCBsZW4pKTsKKworc3RydWN0IGludGVybmFsX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB6X3N0cmVhbV9zIHsKKwlCeXRlZgkqbmV4dF9pbjsgLyogbmV4dCBpbnB1dCBieXRlICovCisJdUludAlhdmFpbF9pbjsgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luICovCisJdUxvbmcJdG90YWxfaW47IC8qIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovCisJQnl0ZWYJKm5leHRfb3V0OyAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi8KKwl1SW50CWF2YWlsX291dDsgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgbmV4dF9vdXQgKi8KKwl1TG9uZwl0b3RhbF9vdXQ7IC8qIHRvdGFsIG5iIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi8KKwljaGFyCSptc2c7CS8qIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqLworCXN0cnVjdAlpbnRlcm5hbF9zdGF0ZSBGQVIgKnN0YXRlOyAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi8KKwlhbGxvY19mdW5jCXphbGxvYzsJLyogdXNlZCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlmcmVlX2Z1bmMJemZyZWU7CS8qIHVzZWQgdG8gZnJlZSB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwl2b2lkcGYJb3BhcXVlOwkvKiBwcml2YXRlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byB6YWxsb2MgYW5kIHpmcmVlICovCisJaW50CWRhdGFfdHlwZTsJLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOgorCQkJCQliaW5hcnkgb3IgdGV4dCAqLworCWNiX2Z1bmMJb3V0Y2I7CS8qIGNhbGxlZCByZWd1bGFybHkganVzdCBiZWZvcmUgYmxvY2tzIG9mIG91dHB1dCAqLworCXVMb25nCWFkbGVyOwkvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqLworCXVMb25nCXJlc2VydmVkOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworfSB6X3N0cmVhbTsKKwordHlwZWRlZiB6X3N0cmVhbSBGQVIgKnpfc3RyZWFtcDsKKworLyoKKyAgICAgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gcGFzc2VkIHRvIGFuZCBmcm9tIHpsaWIgcm91dGluZXMuICBTZWUgUkZDIDE5NTIKKyAgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgbWVhbmluZ3Mgb2YgdGhlc2UgZmllbGRzLgorKi8KK3R5cGVkZWYgc3RydWN0IGd6X2hlYWRlcl9zIHsKKwlpbnQJdGV4dDsJLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqLworCXVMb25nCXRpbWU7CS8qIG1vZGlmaWNhdGlvbiB0aW1lICovCisJaW50CXhmbGFnczsJLyogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KKwlpbnQJb3M7CS8qIG9wZXJhdGluZyBzeXN0ZW0gKi8KKwlCeXRlZgkqZXh0cmE7CS8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi8KKwl1SW50CWV4dHJhX2xlbjsgLyogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICovCisJdUludAlleHRyYV9tYXg7IC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisJQnl0ZWYJKm5hbWU7IC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi8KKwl1SW50CW5hbWVfbWF4OyAvKiBzcGFjZSBhdCBuYW1lIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisJQnl0ZWYJKmNvbW1lbnQ7IC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGNvbW1lbnQgb3IgWl9OVUxMICovCisJdUludAljb21tX21heDsgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLworCWludAloY3JjOyAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqLworCWludAlkb25lOyAvKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyIChub3QgdXNlZAorCQkJd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqLworfSBnel9oZWFkZXI7CisKK3R5cGVkZWYgZ3pfaGVhZGVyIEZBUiAqZ3pfaGVhZGVycDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogY29uc3RhbnRzICovCisjZGVmaW5lIFpfTk9fRkxVU0ggICAgICAwCisjZGVmaW5lIFpfUEFSVElBTF9GTFVTSCAxIC8qIHdpbGwgYmUgcmVtb3ZlZCwgdXNlIFpfU1lOQ19GTFVTSCBpbnN0ZWFkICovCisjZGVmaW5lIFpfU1lOQ19GTFVTSCAgICAyCisjZGVmaW5lIFpfRlVMTF9GTFVTSCAgICAzCisjZGVmaW5lIFpfRklOSVNIICAgICAgICA0CisjZGVmaW5lIFpfQkxPQ0sgICAgICAgICA1CisvKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovCisKKyNkZWZpbmUgWl9PSyAgICAgICAgICAgIDAKKyNkZWZpbmUgWl9TVFJFQU1fRU5EICAgIDEKKyNkZWZpbmUgWl9ORUVEX0RJQ1QgICAgIDIKKyNkZWZpbmUgWl9FUlJOTyAgICAgICAgKC0xKQorI2RlZmluZSBaX1NUUkVBTV9FUlJPUiAoLTIpCisjZGVmaW5lIFpfREFUQV9FUlJPUiAgICgtMykKKyNkZWZpbmUgWl9NRU1fRVJST1IgICAgKC00KQorI2RlZmluZSBaX0JVRl9FUlJPUiAgICAoLTUpCisjZGVmaW5lIFpfVkVSU0lPTl9FUlJPUiAoLTYpCisvKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUKKyAqIHZhbHVlcyBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuCisgKi8KKworI2RlZmluZSBaX05PX0NPTVBSRVNTSU9OICAgICAgICAgMAorI2RlZmluZSBaX0JFU1RfU1BFRUQgICAgICAgICAgICAgMQorI2RlZmluZSBaX0JFU1RfQ09NUFJFU1NJT04gICAgICAgOQorI2RlZmluZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04gICgtMSkKKy8qIGNvbXByZXNzaW9uIGxldmVscyAqLworCisjZGVmaW5lIFpfRklMVEVSRUQgICAgICAgICAgICAxCisjZGVmaW5lIFpfSFVGRk1BTl9PTkxZICAgICAgICAyCisjZGVmaW5lIFpfUkxFICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFpfRklYRUQgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpfREVGQVVMVF9TVFJBVEVHWSAgICAwCisvKiBjb21wcmVzc2lvbiBzdHJhdGVneTsgc2VlIGRlZmxhdGVJbml0MigpIGJlbG93IGZvciBkZXRhaWxzICovCisKKyNkZWZpbmUgWl9CSU5BUlkgICAwCisjZGVmaW5lIFpfVEVYVCAgICAgMQorI2RlZmluZSBaX0FTQ0lJICAgIFpfVEVYVCAgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggMS4yLjIgYW5kIGVhcmxpZXIgKi8KKyNkZWZpbmUgWl9VTktOT1dOICAyCisvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovCisKKyNkZWZpbmUgWl9ERUZMQVRFRCAgIDgKKy8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAodGhlIG9ubHkgb25lIHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24pICovCisKKyNkZWZpbmUgWl9OVUxMICAwICAvKiBmb3IgaW5pdGlhbGl6aW5nIHphbGxvYywgemZyZWUsIG9wYXF1ZSAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNpYyBmdW5jdGlvbnMgKi8KKworLyogVGhlIGFwcGxpY2F0aW9uIGNhbiBjb21wYXJlIHpsaWJWZXJzaW9uIGFuZCBaTElCX1ZFUlNJT04gZm9yIGNvbnNpc3RlbmN5LgorICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBkaWZmZXJzLCB0aGUgbGlicmFyeSBjb2RlIGFjdHVhbGx5IHVzZWQgaXMKKyAgIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHpsaWIuaCBoZWFkZXIgZmlsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgIFRoaXMgY2hlY2sgaXMgYXV0b21hdGljYWxseSBtYWRlIGJ5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdC4KKyAqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0XyBPRigoel9zdHJlYW1wIHN0cm0sIGNvbnN0IGNoYXIgKnZlcnNpb24sCisJCQkJaW50IHN0cmVhbV9zaXplKSk7CisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOworLyoKKyAgICBpbmZsYXRlIGRlY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAorICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBpbnRyb2R1Y2UKKyAgc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgorICBmb3JjZWQgdG8gZmx1c2guCisKKyAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gaW5mbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKKyAgZm9sbG93aW5nIGFjdGlvbnM6CisKKyAgLSBEZWNvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgbmV4dF9pbiBhbmQgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luCisgICAgYWNjb3JkaW5nbHkuIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKKyAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIG5leHRfaW4gaXMgdXBkYXRlZCBhbmQgcHJvY2Vzc2luZworICAgIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgaW5mbGF0ZSgpLgorCisgIC0gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCBuZXh0X291dCBhbmQgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQKKyAgICBhY2NvcmRpbmdseS4gIGluZmxhdGUoKSBwcm92aWRlcyBhcyBtdWNoIG91dHB1dCBhcyBwb3NzaWJsZSwgdW50aWwgdGhlcmUKKyAgICBpcyBubyBtb3JlIGlucHV0IGRhdGEgb3Igbm8gbW9yZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAoc2VlIGJlbG93CisgICAgYWJvdXQgdGhlIGZsdXNoIHBhcmFtZXRlcikuCisKKyAgQmVmb3JlIHRoZSBjYWxsIG9mIGluZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAorICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKKyAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyB0aGUgbmV4dF8qIGFuZCBhdmFpbF8qIHZhbHVlcyBhY2NvcmRpbmdseS4KKyAgVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvcgorICBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoYXZhaWxfb3V0ID09IDApLCBvciBhZnRlciBlYWNoCisgIGNhbGwgb2YgaW5mbGF0ZSgpLiBJZiBpbmZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQKKyAgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZQorICBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgorCisgICAgVGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgY2FuIGJlIFpfTk9fRkxVU0gsIFpfU1lOQ19GTFVTSCwKKyAgWl9GSU5JU0gsIG9yIFpfQkxPQ0suIFpfU1lOQ19GTFVTSCByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBmbHVzaCBhcyBtdWNoCisgIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gWl9CTE9DSyByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBzdG9wCisgIGlmIGFuZCB3aGVuIGl0IGdldHMgdG8gdGhlIG5leHQgZGVmbGF0ZSBibG9jayBib3VuZGFyeS4gV2hlbiBkZWNvZGluZyB0aGUKKyAgemxpYiBvciBnemlwIGZvcm1hdCwgdGhpcyB3aWxsIGNhdXNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIKKyAgdGhlIGhlYWRlciBhbmQgYmVmb3JlIHRoZSBmaXJzdCBibG9jay4gV2hlbiBkb2luZyBhIHJhdyBpbmZsYXRlLCBpbmZsYXRlKCkKKyAgd2lsbCBnbyBhaGVhZCBhbmQgcHJvY2VzcyB0aGUgZmlyc3QgYmxvY2ssIGFuZCB3aWxsIHJldHVybiB3aGVuIGl0IGdldHMgdG8KKyAgdGhlIGVuZCBvZiB0aGF0IGJsb2NrLCBvciB3aGVuIGl0IHJ1bnMgb3V0IG9mIGRhdGEuCisKKyAgICBUaGUgWl9CTE9DSyBvcHRpb24gYXNzaXN0cyBpbiBhcHBlbmRpbmcgdG8gb3IgY29tYmluaW5nIGRlZmxhdGUgc3RyZWFtcy4KKyAgQWxzbyB0byBhc3Npc3QgaW4gdGhpcywgb24gcmV0dXJuIGluZmxhdGUoKSB3aWxsIHNldCBzdHJtLT5kYXRhX3R5cGUgdG8gdGhlCisgIG51bWJlciBvZiB1bnVzZWQgYml0cyBpbiB0aGUgbGFzdCBieXRlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pbiwgcGx1cyA2NAorICBpZiBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBkZWZsYXRlIHN0cmVhbSwKKyAgcGx1cyAxMjggaWYgaW5mbGF0ZSgpIHJldHVybmVkIGltbWVkaWF0ZWx5IGFmdGVyIGRlY29kaW5nIGFuIGVuZC1vZi1ibG9jaworICBjb2RlIG9yIGRlY29kaW5nIHRoZSBjb21wbGV0ZSBoZWFkZXIgdXAgdG8ganVzdCBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlCisgIGRlZmxhdGUgc3RyZWFtLiBUaGUgZW5kLW9mLWJsb2NrIHdpbGwgbm90IGJlIGluZGljYXRlZCB1bnRpbCBhbGwgb2YgdGhlCisgIHVuY29tcHJlc3NlZCBkYXRhIGZyb20gdGhhdCBibG9jayBoYXMgYmVlbiB3cml0dGVuIHRvIHN0cm0tPm5leHRfb3V0LiAgVGhlCisgIG51bWJlciBvZiB1bnVzZWQgYml0cyBtYXkgaW4gZ2VuZXJhbCBiZSBncmVhdGVyIHRoYW4gc2V2ZW4sIGV4Y2VwdCB3aGVuCisgIGJpdCA3IG9mIGRhdGFfdHlwZSBpcyBzZXQsIGluIHdoaWNoIGNhc2UgdGhlIG51bWJlciBvZiB1bnVzZWQgYml0cyB3aWxsIGJlCisgIGxlc3MgdGhhbiBlaWdodC4KKworICAgIGluZmxhdGUoKSBzaG91bGQgbm9ybWFsbHkgYmUgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgWl9TVFJFQU1fRU5EIG9yIGFuCisgIGVycm9yLiBIb3dldmVyIGlmIGFsbCBkZWNvbXByZXNzaW9uIGlzIHRvIGJlIHBlcmZvcm1lZCBpbiBhIHNpbmdsZSBzdGVwCisgIChhIHNpbmdsZSBjYWxsIG9mIGluZmxhdGUpLCB0aGUgcGFyYW1ldGVyIGZsdXNoIHNob3VsZCBiZSBzZXQgdG8KKyAgWl9GSU5JU0guIEluIHRoaXMgY2FzZSBhbGwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQgYW5kIGFsbCBwZW5kaW5nCisgIG91dHB1dCBpcyBmbHVzaGVkOyBhdmFpbF9vdXQgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgdGhlCisgIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG1heSBoYXZlIGJlZW4gc2F2ZWQKKyAgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMgcHVycG9zZS4pIFRoZSBuZXh0IG9wZXJhdGlvbiBvbiB0aGlzIHN0cmVhbSBtdXN0CisgIGJlIGluZmxhdGVFbmQgdG8gZGVhbGxvY2F0ZSB0aGUgZGVjb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHVzZSBvZiBaX0ZJTklTSAorICBpcyBuZXZlciByZXF1aXJlZCwgYnV0IGNhbiBiZSB1c2VkIHRvIGluZm9ybSBpbmZsYXRlIHRoYXQgYSBmYXN0ZXIgYXBwcm9hY2gKKyAgbWF5IGJlIHVzZWQgZm9yIHRoZSBzaW5nbGUgaW5mbGF0ZSgpIGNhbGwuCisKKyAgICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgaW5mbGF0ZSgpIGFsd2F5cyBmbHVzaGVzIGFzIG11Y2ggb3V0cHV0IGFzCisgIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBhbmQgYWx3YXlzIHVzZXMgdGhlIGZhc3RlciBhcHByb2FjaCBvbiB0aGUKKyAgZmlyc3QgY2FsbC4gU28gdGhlIG9ubHkgZWZmZWN0IG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgorICBpcyBvbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGluZmxhdGUoKSwgYXMgbm90ZWQgYmVsb3csIG9yIHdoZW4gaXQgcmV0dXJucyBlYXJseQorICBiZWNhdXNlIFpfQkxPQ0sgaXMgdXNlZC4KKworICAgICBJZiBhIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhZnRlciB0aGlzIGNhbGwgKHNlZSBpbmZsYXRlU2V0RGljdGlvbmFyeQorICBiZWxvdyksIGluZmxhdGUgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiB0aGUgZGljdGlvbmFyeQorICBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9ORUVEX0RJQ1Q7IG90aGVyd2lzZSBpdCBzZXRzCisgIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBvdXRwdXQgcHJvZHVjZWQgc28gZmFyICh0aGF0IGlzLAorICB0b3RhbF9vdXQgYnl0ZXMpIGFuZCByZXR1cm5zIFpfT0ssIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvciBjb2RlIGFzIGRlc2NyaWJlZAorICBiZWxvdy4gQXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCBpbmZsYXRlKCkgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIGFkbGVyMzIKKyAgY2hlY2tzdW0gaXMgZXF1YWwgdG8gdGhhdCBzYXZlZCBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX1NUUkVBTV9FTkQKKyAgb25seSBpZiB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdC4KKworICAgIGluZmxhdGUoKSB3aWxsIGRlY29tcHJlc3MgYW5kIGNoZWNrIGVpdGhlciB6bGliLXdyYXBwZWQgb3IgZ3ppcC13cmFwcGVkCisgIGRlZmxhdGUgZGF0YS4gIFRoZSBoZWFkZXIgdHlwZSBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LiAgQW55IGluZm9ybWF0aW9uCisgIGNvbnRhaW5lZCBpbiB0aGUgZ3ppcCBoZWFkZXIgaXMgbm90IHJldGFpbmVkLCBzbyBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRoYXQKKyAgaW5mb3JtYXRpb24gc2hvdWxkIGluc3RlYWQgdXNlIHJhdyBpbmZsYXRlLCBzZWUgaW5mbGF0ZUluaXQyKCkgYmVsb3csIG9yCisgIGluZmxhdGVCYWNrKCkgYW5kIHBlcmZvcm0gdGhlaXIgb3duIHByb2Nlc3Npbmcgb2YgdGhlIGd6aXAgaGVhZGVyIGFuZAorICB0cmFpbGVyLgorCisgICAgaW5mbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCisgIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMKKyAgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCwgWl9ORUVEX0RJQ1QgaWYgYQorICBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcworICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0IGNoZWNrCisgIHZhbHVlKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKKyAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgTlVMTCksIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSwKKyAgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUgb3IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUKKyAgb3V0cHV0IGJ1ZmZlciB3aGVuIFpfRklOSVNIIGlzIHVzZWQuIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwsIGFuZAorICBpbmZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0IHNwYWNlIHRvCisgIGNvbnRpbnVlIGRlY29tcHJlc3NpbmcuIElmIFpfREFUQV9FUlJPUiBpcyByZXR1cm5lZCwgdGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuCisgIGNhbGwgaW5mbGF0ZVN5bmMoKSB0byBsb29rIGZvciBhIGdvb2QgY29tcHJlc3Npb24gYmxvY2sgaWYgYSBwYXJ0aWFsIHJlY292ZXJ5CisgIG9mIHRoZSBkYXRhIGlzIGRlc2lyZWQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgorICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQorICAgcGVuZGluZyBvdXRwdXQuCisKKyAgICAgaW5mbGF0ZUVuZCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZQorICAgd2FzIGluY29uc2lzdGVudC4gSW4gdGhlIGVycm9yIGNhc2UsIG1zZyBtYXkgYmUgc2V0IGJ1dCB0aGVuIHBvaW50cyB0byBhCisgICBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZSBkZWFsbG9jYXRlZCkuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlZCBmdW5jdGlvbnMgKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHV0aWxpdHkgZnVuY3Rpb25zICovCisKKy8qCisgICAgIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUKKyAgIGJhc2ljIHN0cmVhbS1vcmllbnRlZCBmdW5jdGlvbnMuIFRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UsIHNvbWUKKyAgIGRlZmF1bHQgb3B0aW9ucyBhcmUgYXNzdW1lZCAoY29tcHJlc3Npb24gbGV2ZWwgYW5kIG1lbW9yeSB1c2FnZSwKKyAgIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucykuIFRoZSBzb3VyY2UgY29kZSBvZiB0aGVzZQorICAgdXRpbGl0eSBmdW5jdGlvbnMgY2FuIGVhc2lseSBiZSBtb2RpZmllZCBpZiB5b3UgbmVlZCBzcGVjaWFsIG9wdGlvbnMuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMiBPRigodUxvbmcgYWRsZXIsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisvKgorICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCisgICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgIHRoZSByZXF1aXJlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgY2hlY2tzdW0uCisgICBBbiBBZGxlci0zMiBjaGVja3N1bSBpcyBhbG1vc3QgYXMgcmVsaWFibGUgYXMgYSBDUkMzMiBidXQgY2FuIGJlIGNvbXB1dGVkCisgICBtdWNoIGZhc3Rlci4gVXNhZ2UgZXhhbXBsZToKKworICAgICB1TG9uZyBhZGxlciA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7CisKKyAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKKyAgICAgICBhZGxlciA9IGFkbGVyMzIoYWRsZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgfQorICAgICBpZiAoYWRsZXIgIT0gb3JpZ2luYWxfYWRsZXIpIGVycm9yKCk7CisqLworCisvKgorICAgICBDb21iaW5lIHR3byBBZGxlci0zMiBjaGVja3N1bXMgaW50byBvbmUuICBGb3IgdHdvIHNlcXVlbmNlcyBvZiBieXRlcywgc2VxMQorICAgYW5kIHNlcTIgd2l0aCBsZW5ndGhzIGxlbjEgYW5kIGxlbjIsIEFkbGVyLTMyIGNoZWNrc3VtcyB3ZXJlIGNhbGN1bGF0ZWQgZm9yCisgICBlYWNoLCBhZGxlcjEgYW5kIGFkbGVyMi4gIGFkbGVyMzJfY29tYmluZSgpIHJldHVybnMgdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mCisgICBzZXExIGFuZCBzZXEyIGNvbmNhdGVuYXRlZCwgcmVxdWlyaW5nIG9ubHkgYWRsZXIxLCBhZGxlcjIsIGFuZCBsZW4yLgorKi8KKworWkVYVEVSTiAgdUludCBaRVhQT1JUIGNyYzMyICBPRigodUludCBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisvKgorICAgICBVcGRhdGUgYSBydW5uaW5nIENSQy0zMiB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZCByZXR1cm4gdGhlCisgICB1cGRhdGVkIENSQy0zMi4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWlyZWQgaW5pdGlhbAorICAgdmFsdWUgZm9yIHRoZSBmb3IgdGhlIGNyYy4gUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzCisgICBwZXJmb3JtZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVXNhZ2UgZXhhbXBsZToKKworICAgICB1TG9uZyBjcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKworICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgeworICAgICAgIGNyYyA9IGNyYzMyKGNyYywgYnVmZmVyLCBsZW5ndGgpOworICAgICB9CisgICAgIGlmIChjcmMgIT0gb3JpZ2luYWxfY3JjKSBlcnJvcigpOworKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKKyNkZWZpbmUgaW5mbGF0ZUluaXQoc3RybSkgXAorCWluZmxhdGVJbml0Xygoc3RybSksIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIFwKKwlpbmZsYXRlSW5pdDJfKChzdHJtKSwgKHdpbmRvd0JpdHMpLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisKKyNpZiAhZGVmaW5lZChaVVRJTF9IKSAmJiAhZGVmaW5lZChOT19EVU1NWV9ERUNMKQorCXN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7aW50IGR1bW15O307IC8qIGhhY2sgZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBaTElCX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9NYWtlZmlsZSBiL3gtbG9hZGVyL2xpYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDAzNDQyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL01ha2VmaWxlCkBAIC0wLDAgKzEsNjIgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3RydW1lbnRzCisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEFSQ0gpLmEKKworU09CSlMJKz0gX2FzaGxkaTMubworU09CSlMJKz0gX2RpdnNpMy5vCitTT0JKUwkrPSBfbHNocmRpMy5vCitTT0JKUwkrPSBfbW9kc2kzLm8KK1NPQkpTCSs9IF91ZGl2c2kzLm8KK1NPQkpTCSs9IF91bW9kc2kzLm8KKworQ09CSlMteSArPSBjcmMzMi5vCitDT0JKUy15ICs9IGN0eXBlLm8KK0NPQkpTLXkgKz0gZGlzcGxheV9vcHRpb25zLm8KK0NPQkpTLXkJKz0gZGl2MC5vCitDT0JKUy15CSs9IGJvYXJkLm8KK0NPQkpTLXkgKz0gc3RyaW5nLm8KK0NPQkpTLXkJKz0gZWNjLm8KK0NPQkpTLXkJKz0gcHJpbnRmLm8KK0NPQkpTLXkJKz0gb21hcF9iY2hfZGVjb2Rlci5vCitDT0JKUy15CSs9IG9tYXBfYmNoLm8KKworQ09CSlMJOj0gJChDT0JKUy15KQorU1JDUwk6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykgJChDT0JKUykpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvX2FzaGxkaTMuUyBiL3gtbG9hZGVyL2xpYi9fYXNobGRpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNGRkYzIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvX2FzaGxkaTMuUwpAQCAtMCwwICsxLDQ4IEBACisvKiBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCwgMjAwNQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Cit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2xhdGVyIHZlcnNpb24uCisKK0luIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQorY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKK2FuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKK2Zyb20gdGhlIHVzZSBvZiB0aGlzIGZpbGUuICAoVGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmVzdHJpY3Rpb25zCitkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCit0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKK2V4ZWN1dGFibGUuKQorCitUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKK0Jvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KKworCisjaWZkZWYgX19BUk1FQl9fCisjZGVmaW5lIGFsIHIxCisjZGVmaW5lIGFoIHIwCisjZWxzZQorI2RlZmluZSBhbCByMAorI2RlZmluZSBhaCByMQorI2VuZGlmCisKKy5nbG9ibCBfX2FzaGxkaTMKKy5nbG9ibAlfX2FlYWJpX2xsc2wKK19fYXNobGRpMzoKK19fYWVhYmlfbGxzbDoKKworCXN1YnMJcjMsIHIyLCAjMzIKKwlyc2IJaXAsIHIyLCAjMzIKKwltb3ZtaQlhaCwgYWgsIGxzbCByMgorCW1vdnBsCWFoLCBhbCwgbHNsIHIzCisJb3JybWkJYWgsIGFoLCBhbCwgbHNyIGlwCisJbW92CWFsLCBhbCwgbHNsIHIyCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL19kaXZzaTMuUyBiL3gtbG9hZGVyL2xpYi9fZGl2c2kzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiYWRiMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9fZGl2c2kzLlMKQEAgLTAsMCArMSwxNDIgQEAKKworLm1hY3JvIEFSTV9ESVZfQk9EWSBkaXZpZGVuZCwgZGl2aXNvciwgcmVzdWx0LCBjdXJiaXQKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA1CisKKwljbHoJXGN1cmJpdCwgXGRpdmlzb3IKKwljbHoJXHJlc3VsdCwgXGRpdmlkZW5kCisJc3ViCVxyZXN1bHQsIFxjdXJiaXQsIFxyZXN1bHQKKwltb3YJXGN1cmJpdCwgIzEKKwltb3YJXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgXHJlc3VsdAorCW1vdglcY3VyYml0LCBcY3VyYml0LCBsc2wgXHJlc3VsdAorCW1vdglccmVzdWx0LCAjMAorCisjZWxzZQorCisJQCBJbml0aWFsbHkgc2hpZnQgdGhlIGRpdmlzb3IgbGVmdCAzIGJpdHMgaWYgcG9zc2libGUsCisJQCBzZXQgY3VyYml0IGFjY29yZGluZ2x5LiAgVGhpcyBhbGxvd3MgZm9yIGN1cmJpdCB0byBiZSBsb2NhdGVkCisJQCBhdCB0aGUgbGVmdCBlbmQgb2YgZWFjaCA0IGJpdCBuaWJibGVzIGluIHRoZSBkaXZpc2lvbiBsb29wCisJQCB0byBzYXZlIG9uZSBsb29wIGluIG1vc3QgY2FzZXMuCisJdHN0CVxkaXZpc29yLCAjMHhlMDAwMDAwMAorCW1vdmVxCVxkaXZpc29yLCBcZGl2aXNvciwgbHNsICMzCisJbW92ZXEJXGN1cmJpdCwgIzgKKwltb3ZuZQlcY3VyYml0LCAjMQorCisJQCBVbmxlc3MgdGhlIGRpdmlzb3IgaXMgdmVyeSBiaWcsIHNoaWZ0IGl0IHVwIGluIG11bHRpcGxlcyBvZgorCUAgZm91ciBiaXRzLCBzaW5jZSB0aGlzIGlzIHRoZSBhbW91bnQgb2YgdW53aW5kaW5nIGluIHRoZSBtYWluCisJQCBkaXZpc2lvbiBsb29wLiAgQ29udGludWUgc2hpZnRpbmcgdW50aWwgdGhlIGRpdmlzb3IgaXMKKwlAIGxhcmdlciB0aGFuIHRoZSBkaXZpZGVuZC4KKzE6CWNtcAlcZGl2aXNvciwgIzB4MTAwMDAwMDAKKwljbXBsbwlcZGl2aXNvciwgXGRpdmlkZW5kCisJbW92bG8JXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgIzQKKwltb3ZsbwlcY3VyYml0LCBcY3VyYml0LCBsc2wgIzQKKwlibG8JMWIKKworCUAgRm9yIHZlcnkgYmlnIGRpdmlzb3JzLCB3ZSBtdXN0IHNoaWZ0IGl0IGEgYml0IGF0IGEgdGltZSwgb3IKKwlAIHdlIHdpbGwgYmUgaW4gZGFuZ2VyIG9mIG92ZXJmbG93aW5nLgorMToJY21wCVxkaXZpc29yLCAjMHg4MDAwMDAwMAorCWNtcGxvCVxkaXZpc29yLCBcZGl2aWRlbmQKKwltb3ZsbwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCAjMQorCW1vdmxvCVxjdXJiaXQsIFxjdXJiaXQsIGxzbCAjMQorCWJsbwkxYgorCisJbW92CVxyZXN1bHQsICMwCisKKyNlbmRpZgorCisJQCBEaXZpc2lvbiBsb29wCisxOgljbXAJXGRpdmlkZW5kLCBcZGl2aXNvcgorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvcgorCW9ycmhzCVxyZXN1bHQsICAgXHJlc3VsdCwgICBcY3VyYml0CisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzEKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMQorCW9ycmhzCVxyZXN1bHQsICAgXHJlc3VsdCwgICBcY3VyYml0LCAgbHNyICMxCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzIKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMgorCW9ycmhzCVxyZXN1bHQsICAgXHJlc3VsdCwgICBcY3VyYml0LCAgbHNyICMyCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzMKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMworCW9ycmhzCVxyZXN1bHQsICAgXHJlc3VsdCwgICBcY3VyYml0LCAgbHNyICMzCisJY21wCVxkaXZpZGVuZCwgIzAJCQlAIEVhcmx5IHRlcm1pbmF0aW9uPworCW1vdm5lcwlcY3VyYml0LCAgIFxjdXJiaXQsICBsc3IgIzQJQCBObywgYW55IG1vcmUgYml0cyB0byBkbz8KKwltb3ZuZQlcZGl2aXNvciwgIFxkaXZpc29yLCBsc3IgIzQKKwlibmUJMWIKKworLmVuZG0KKworLm1hY3JvIEFSTV9ESVYyX09SREVSIGRpdmlzb3IsIG9yZGVyCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNQorCisJY2x6CVxvcmRlciwgXGRpdmlzb3IKKwlyc2IJXG9yZGVyLCBcb3JkZXIsICMzMQorCisjZWxzZQorCisJY21wCVxkaXZpc29yLCAjKDEgPDwgMTYpCisJbW92aHMJXGRpdmlzb3IsIFxkaXZpc29yLCBsc3IgIzE2CisJbW92aHMJXG9yZGVyLCAjMTYKKwltb3Zsbwlcb3JkZXIsICMwCisKKwljbXAJXGRpdmlzb3IsICMoMSA8PCA4KQorCW1vdmhzCVxkaXZpc29yLCBcZGl2aXNvciwgbHNyICM4CisJYWRkaHMJXG9yZGVyLCBcb3JkZXIsICM4CisKKwljbXAJXGRpdmlzb3IsICMoMSA8PCA0KQorCW1vdmhzCVxkaXZpc29yLCBcZGl2aXNvciwgbHNyICM0CisJYWRkaHMJXG9yZGVyLCBcb3JkZXIsICM0CisKKwljbXAJXGRpdmlzb3IsICMoMSA8PCAyKQorCWFkZGhpCVxvcmRlciwgXG9yZGVyLCAjMworCWFkZGxzCVxvcmRlciwgXG9yZGVyLCBcZGl2aXNvciwgbHNyICMxCisKKyNlbmRpZgorCisuZW5kbQorCisJLmFsaWduCTUKKy5nbG9ibCBfX2RpdnNpMworLmdsb2JsIF9fYWVhYmlfaWRpdgorX19kaXZzaTM6CitfX2FlYWJpX2lkaXY6CisJY21wCXIxLCAjMAorCWVvcglpcCwgcjAsIHIxCQkJQCBzYXZlIHRoZSBzaWduIG9mIHRoZSByZXN1bHQuCisJYmVxCUxkaXYwCisJcnNibWkJcjEsIHIxLCAjMAkJCUAgbG9vcHMgYmVsb3cgdXNlIHVuc2lnbmVkLgorCXN1YnMJcjIsIHIxLCAjMQkJCUAgZGl2aXNpb24gYnkgMSBvciAtMSA/CisJYmVxCTEwZgorCW1vdnMJcjMsIHIwCisJcnNibWkJcjMsIHIwLCAjMAkJCUAgcG9zaXRpdmUgZGl2aWRlbmQgdmFsdWUKKwljbXAJcjMsIHIxCisJYmxzCTExZgorCXRzdAlyMSwgcjIJCQkJQCBkaXZpc29yIGlzIHBvd2VyIG9mIDIgPworCWJlcQkxMmYKKworCUFSTV9ESVZfQk9EWSByMywgcjEsIHIwLCByMgorCisJY21wCWlwLCAjMAorCXJzYm1pCXIwLCByMCwgIzAKKwltb3YJcGMsIGxyCisKKzEwOgl0ZXEJaXAsIHIwCQkJCUAgc2FtZSBzaWduID8KKwlyc2JtaQlyMCwgcjAsICMwCisJbW92CXBjLCBscgorCisxMToJbW92bG8JcjAsICMwCisJbW92ZXEJcjAsIGlwLCBhc3IgIzMxCisJb3JyZXEJcjAsIHIwLCAjMQorCW1vdglwYywgbHIKKworMTI6CUFSTV9ESVYyX09SREVSIHIxLCByMgorCisJY21wCWlwLCAjMAorCW1vdglyMCwgcjMsIGxzciByMgorCXJzYm1pCXIwLCByMCwgIzAKKwltb3YJcGMsIGxyCisKK0xkaXYwOgorCisJc3RyCWxyLCBbc3AsICMtNF0hCisJYmwJX19kaXYwCisJbW92CXIwLCAjMAkJCUAgQWJvdXQgYXMgd3JvbmcgYXMgaXQgY291bGQgYmUuCisJbGRyCXBjLCBbc3BdLCAjNApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL19sc2hyZGkzLlMgYi94LWxvYWRlci9saWIvX2xzaHJkaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ZhNzk5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL19sc2hyZGkzLlMKQEAgLTAsMCArMSw0OCBAQAorLyogQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitsYXRlciB2ZXJzaW9uLgorCitJbiBhZGRpdGlvbiB0byB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcyB5b3UgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gbGluayB0aGUKK2NvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyBmaWxlIGludG8gY29tYmluYXRpb25zIHdpdGggb3RoZXIgcHJvZ3JhbXMsCithbmQgdG8gZGlzdHJpYnV0ZSB0aG9zZSBjb21iaW5hdGlvbnMgd2l0aG91dCBhbnkgcmVzdHJpY3Rpb24gY29taW5nCitmcm9tIHRoZSB1c2Ugb2YgdGhpcyBmaWxlLiAgKFRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJlc3RyaWN0aW9ucworZG8gYXBwbHkgaW4gb3RoZXIgcmVzcGVjdHM7IGZvciBleGFtcGxlLCB0aGV5IGNvdmVyIG1vZGlmaWNhdGlvbiBvZgordGhlIGZpbGUsIGFuZCBkaXN0cmlidXRpb24gd2hlbiBub3QgbGlua2VkIGludG8gYSBjb21iaW5lCitleGVjdXRhYmxlLikKKworVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCitCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCisKKworI2lmZGVmIF9fQVJNRUJfXworI2RlZmluZSBhbCByMQorI2RlZmluZSBhaCByMAorI2Vsc2UKKyNkZWZpbmUgYWwgcjAKKyNkZWZpbmUgYWggcjEKKyNlbmRpZgorCisuZ2xvYmwgX19sc2hyZGkzCisuZ2xvYmwgX19hZWFiaV9sbHNyCitfX2xzaHJkaTM6CitfX2FlYWJpX2xsc3I6CisKKwlzdWJzCXIzLCByMiwgIzMyCisJcnNiCWlwLCByMiwgIzMyCisJbW92bWkJYWwsIGFsLCBsc3IgcjIKKwltb3ZwbAlhbCwgYWgsIGxzciByMworCW9ycm1pCWFsLCBhbCwgYWgsIGxzbCBpcAorCW1vdglhaCwgYWgsIGxzciByMgorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9fbW9kc2kzLlMgYi94LWxvYWRlci9saWIvX21vZHNpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWM1ODQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvX21vZHNpMy5TCkBAIC0wLDAgKzEsOTkgQEAKKworLm1hY3JvIEFSTV9NT0RfQk9EWSBkaXZpZGVuZCwgZGl2aXNvciwgb3JkZXIsIHNwYXJlCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNQorCisJY2x6CVxvcmRlciwgXGRpdmlzb3IKKwljbHoJXHNwYXJlLCBcZGl2aWRlbmQKKwlzdWIJXG9yZGVyLCBcb3JkZXIsIFxzcGFyZQorCW1vdglcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCBcb3JkZXIKKworI2Vsc2UKKworCW1vdglcb3JkZXIsICMwCisKKwlAIFVubGVzcyB0aGUgZGl2aXNvciBpcyB2ZXJ5IGJpZywgc2hpZnQgaXQgdXAgaW4gbXVsdGlwbGVzIG9mCisJQCBmb3VyIGJpdHMsIHNpbmNlIHRoaXMgaXMgdGhlIGFtb3VudCBvZiB1bndpbmRpbmcgaW4gdGhlIG1haW4KKwlAIGRpdmlzaW9uIGxvb3AuICBDb250aW51ZSBzaGlmdGluZyB1bnRpbCB0aGUgZGl2aXNvciBpcworCUAgbGFyZ2VyIHRoYW4gdGhlIGRpdmlkZW5kLgorMToJY21wCVxkaXZpc29yLCAjMHgxMDAwMDAwMAorCWNtcGxvCVxkaXZpc29yLCBcZGl2aWRlbmQKKwltb3ZsbwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCAjNAorCWFkZGxvCVxvcmRlciwgXG9yZGVyLCAjNAorCWJsbwkxYgorCisJQCBGb3IgdmVyeSBiaWcgZGl2aXNvcnMsIHdlIG11c3Qgc2hpZnQgaXQgYSBiaXQgYXQgYSB0aW1lLCBvcgorCUAgd2Ugd2lsbCBiZSBpbiBkYW5nZXIgb2Ygb3ZlcmZsb3dpbmcuCisxOgljbXAJXGRpdmlzb3IsICMweDgwMDAwMDAwCisJY21wbG8JXGRpdmlzb3IsIFxkaXZpZGVuZAorCW1vdmxvCVxkaXZpc29yLCBcZGl2aXNvciwgbHNsICMxCisJYWRkbG8JXG9yZGVyLCBcb3JkZXIsICMxCisJYmxvCTFiCisKKyNlbmRpZgorCisJQCBQZXJmb3JtIGFsbCBuZWVkZWQgc3Vic3RyYWN0aW9ucyB0byBrZWVwIG9ubHkgdGhlIHJlbWluZGVyLgorCUAgRG8gY29tcGFyaXNvbnMgaW4gYmF0Y2ggb2YgNCBmaXJzdC4KKwlzdWJzCVxvcmRlciwgXG9yZGVyLCAjMwkJQCB5ZXMsIDMgaXMgaW50ZW5kZWQgaGVyZQorCWJsdAkyZgorCisxOgljbXAJXGRpdmlkZW5kLCBcZGl2aXNvcgorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvcgorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMxCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzEKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvciwgIGxzciAjMgorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvciwgbHNyICMyCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzMKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMworCWNtcAlcZGl2aWRlbmQsICMxCisJbW92CVxkaXZpc29yLCBcZGl2aXNvciwgbHNyICM0CisJc3ViZ2VzCVxvcmRlciwgXG9yZGVyLCAjNAorCWJnZQkxYgorCisJdHN0CVxvcmRlciwgIzMKKwl0ZXFuZQlcZGl2aWRlbmQsICMwCisJYmVxCTVmCisKKwlAIEVpdGhlciAxLCAyIG9yIDMgY29tcGFyaXNvbi9zdWJzdHJhY3Rpb25zIGFyZSBsZWZ0LgorMjoJY21uCVxvcmRlciwgIzIKKwlibHQJNGYKKwliZXEJM2YKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvcgorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvcgorCW1vdglcZGl2aXNvciwgIFxkaXZpc29yLCAgbHNyICMxCiszOgljbXAJXGRpdmlkZW5kLCBcZGl2aXNvcgorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvcgorCW1vdglcZGl2aXNvciwgIFxkaXZpc29yLCAgbHNyICMxCis0OgljbXAJXGRpdmlkZW5kLCBcZGl2aXNvcgorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvcgorNToKKy5lbmRtCisKKwkuYWxpZ24JNQorLmdsb2JsIF9fbW9kc2kzCitfX21vZHNpMzoKKwljbXAJcjEsICMwCisJYmVxCUxkaXYwCisJcnNibWkJcjEsIHIxLCAjMAkJCUAgbG9vcHMgYmVsb3cgdXNlIHVuc2lnbmVkLgorCW1vdnMJaXAsIHIwCQkJCUAgcHJlc2VydmUgc2lnbiBvZiBkaXZpZGVuZAorCXJzYm1pCXIwLCByMCwgIzAJCQlAIGlmIG5lZ2F0aXZlIG1ha2UgcG9zaXRpdmUKKwlzdWJzCXIyLCByMSwgIzEJCQlAIGNvbXBhcmUgZGl2aXNvciB3aXRoIDEKKwljbXBuZQlyMCwgcjEJCQkJQCBjb21wYXJlIGRpdmlkZW5kIHdpdGggZGl2aXNvcgorCW1vdmVxCXIwLCAjMAorCXRzdGhpCXIxLCByMgkJCQlAIHNlZSBpZiBkaXZpc29yIGlzIHBvd2VyIG9mIDIKKwlhbmRlcQlyMCwgcjAsIHIyCisJYmxzCTEwZgorCisJQVJNX01PRF9CT0RZIHIwLCByMSwgcjIsIHIzCisKKzEwOgljbXAJaXAsICMwCisJcnNibWkJcjAsIHIwLCAjMAorCW1vdglwYywgbHIKKworCitMZGl2MDoKKworCXN0cglsciwgW3NwLCAjLTRdIQorCWJsCV9fZGl2MAorCW1vdglyMCwgIzAJCQlAIEFib3V0IGFzIHdyb25nIGFzIGl0IGNvdWxkIGJlLgorCWxkcglwYywgW3NwXSwgIzQKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9fdWRpdnNpMy5TIGIveC1sb2FkZXIvbGliL191ZGl2c2kzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkY2Q0OAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9fdWRpdnNpMy5TCkBAIC0wLDAgKzEsNzcgQEAKKy8qICMgMSAibGliZ2NjMS5TIiAqLworQCBsaWJnY2MxIHJvdXRpbmVzIGZvciBBUk0gY3B1LgorQCBEaXZpc2lvbiByb3V0aW5lcywgd3JpdHRlbiBieSBSaWNoYXJkIEVhcm5zaGF3LCAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQorZGl2aWRlbmQJLnJlcQlyMAorZGl2aXNvcgkJLnJlcQlyMQorcmVzdWx0CQkucmVxCXIyCitjdXJiaXQJCS5yZXEJcjMKKy8qIGlwCQkucmVxCXIxMgkqLworLyogc3AJCS5yZXEJcjEzCSovCisvKiBscgkJLnJlcQlyMTQJKi8KKy8qIHBjCQkucmVxCXIxNQkqLworCS50ZXh0CisJLmdsb2JsCSBfX3VkaXZzaTMKKwkudHlwZSAgX191ZGl2c2kzICAgICAgICxmdW5jdGlvbgorCS5hbGlnbgkwCisgX191ZGl2c2kzICAgICAgOgorCWNtcAlkaXZpc29yLCAjMAorCWJlcQlMZGl2MAorCW1vdgljdXJiaXQsICMxCisJbW92CXJlc3VsdCwgIzAKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IKKwliY2MJTGdvdF9yZXN1bHQKK0xvb3AxOgorCUAgVW5sZXNzIHRoZSBkaXZpc29yIGlzIHZlcnkgYmlnLCBzaGlmdCBpdCB1cCBpbiBtdWx0aXBsZXMgb2YKKwlAIGZvdXIgYml0cywgc2luY2UgdGhpcyBpcyB0aGUgYW1vdW50IG9mIHVud2luZGluZyBpbiB0aGUgbWFpbgorCUAgZGl2aXNpb24gbG9vcC4gIENvbnRpbnVlIHNoaWZ0aW5nIHVudGlsIHRoZSBkaXZpc29yIGlzCisJQCBsYXJnZXIgdGhhbiB0aGUgZGl2aWRlbmQuCisJY21wCWRpdmlzb3IsICMweDEwMDAwMDAwCisJY21wY2MJZGl2aXNvciwgZGl2aWRlbmQKKwltb3ZjYwlkaXZpc29yLCBkaXZpc29yLCBsc2wgIzQKKwltb3ZjYwljdXJiaXQsIGN1cmJpdCwgbHNsICM0CisJYmNjCUxvb3AxCitMYmlnbnVtOgorCUAgRm9yIHZlcnkgYmlnIGRpdmlzb3JzLCB3ZSBtdXN0IHNoaWZ0IGl0IGEgYml0IGF0IGEgdGltZSwgb3IKKwlAIHdlIHdpbGwgYmUgaW4gZGFuZ2VyIG9mIG92ZXJmbG93aW5nLgorCWNtcAlkaXZpc29yLCAjMHg4MDAwMDAwMAorCWNtcGNjCWRpdmlzb3IsIGRpdmlkZW5kCisJbW92Y2MJZGl2aXNvciwgZGl2aXNvciwgbHNsICMxCisJbW92Y2MJY3VyYml0LCBjdXJiaXQsIGxzbCAjMQorCWJjYwlMYmlnbnVtCitMb29wMzoKKwlAIFRlc3QgZm9yIHBvc3NpYmxlIHN1YnRyYWN0aW9ucywgYW5kIG5vdGUgd2hpY2ggYml0cworCUAgYXJlIGRvbmUgaW4gdGhlIHJlc3VsdC4gIE9uIHRoZSBmaW5hbCBwYXNzLCB0aGlzIG1heSBzdWJ0cmFjdAorCUAgdG9vIG11Y2ggZnJvbSB0aGUgZGl2aWRlbmQsIGJ1dCB0aGUgcmVzdWx0IHdpbGwgYmUgb2ssIHNpbmNlIHRoZQorCUAgImJpdCIgd2lsbCBoYXZlIGJlZW4gc2hpZnRlZCBvdXQgYXQgdGhlIGJvdHRvbS4KKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IKKwlvcnJjcwlyZXN1bHQsIHJlc3VsdCwgY3VyYml0CisJY21wCWRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzEKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMQorCW9ycmNzCXJlc3VsdCwgcmVzdWx0LCBjdXJiaXQsIGxzciAjMQorCWNtcAlkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMyCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzIKKwlvcnJjcwlyZXN1bHQsIHJlc3VsdCwgY3VyYml0LCBsc3IgIzIKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMworCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMzCisJb3JyY3MJcmVzdWx0LCByZXN1bHQsIGN1cmJpdCwgbHNyICMzCisJY21wCWRpdmlkZW5kLCAjMAkJCUAgRWFybHkgdGVybWluYXRpb24/CisJbW92bmVzCWN1cmJpdCwgY3VyYml0LCBsc3IgIzQJCUAgTm8sIGFueSBtb3JlIGJpdHMgdG8gZG8/CisJbW92bmUJZGl2aXNvciwgZGl2aXNvciwgbHNyICM0CisJYm5lCUxvb3AzCitMZ290X3Jlc3VsdDoKKwltb3YJcjAsIHJlc3VsdAorCW1vdiAJcGMsIGxyCitMZGl2MDoKKwlzdHIJbHIsIFtzcCwgIy00XSEKKwlibAkgX19kaXYwICAgICAgIChQTFQpCisJbW92CXIwLCAjMAkJCUAgYWJvdXQgYXMgd3JvbmcgYXMgaXQgY291bGQgYmUKKwlsZG1pYQlzcCEsIHtwY30KKwkuc2l6ZSAgX191ZGl2c2kzICAgICAgICwgLiAtICBfX3VkaXZzaTMKKy8qICMgMjM1ICJsaWJnY2MxLlMiICovCisvKiAjIDMyMCAibGliZ2NjMS5TIiAqLworLyogIyA0MjEgImxpYmdjYzEuUyIgKi8KKy8qICMgNDMzICJsaWJnY2MxLlMiICovCisvKiAjIDQ1NiAibGliZ2NjMS5TIiAqLworLyogIyA1MDAgImxpYmdjYzEuUyIgKi8KKy8qICMgNTgwICJsaWJnY2MxLlMiICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvX3Vtb2RzaTMuUyBiL3gtbG9hZGVyL2xpYi9fdW1vZHNpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YWViZTgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvX3Vtb2RzaTMuUwpAQCAtMCwwICsxLDg4IEBACisvKiAjIDEgImxpYmdjYzEuUyIgKi8KK0AgbGliZ2NjMSByb3V0aW5lcyBmb3IgQVJNIGNwdS4KK0AgRGl2aXNpb24gcm91dGluZXMsIHdyaXR0ZW4gYnkgUmljaGFyZCBFYXJuc2hhdywgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKKy8qICMgMTQ1ICJsaWJnY2MxLlMiICovCitkaXZpZGVuZAkucmVxCXIwCitkaXZpc29yCQkucmVxCXIxCitvdmVyZG9uZQkucmVxCXIyCitjdXJiaXQJCS5yZXEJcjMKKy8qIGlwCQkucmVxCXIxMgkqLworLyogc3AJCS5yZXEJcjEzCSovCisvKiBscgkJLnJlcQlyMTQJKi8KKy8qIHBjCQkucmVxCXIxNQkqLworCS50ZXh0CisJLmdsb2JsCSBfX3Vtb2RzaTMKKwkudHlwZSAgX191bW9kc2kzICAgICAgICxmdW5jdGlvbgorCS5hbGlnbiAwCisgX191bW9kc2kzICAgICAgOgorCWNtcAlkaXZpc29yLCAjMAorCWJlcQlMZGl2MAorCW1vdgljdXJiaXQsICMxCisJY21wCWRpdmlkZW5kLCBkaXZpc29yCisJbW92Y2MgIAlwYywgbHIKK0xvb3AxOgorCUAgVW5sZXNzIHRoZSBkaXZpc29yIGlzIHZlcnkgYmlnLCBzaGlmdCBpdCB1cCBpbiBtdWx0aXBsZXMgb2YKKwlAIGZvdXIgYml0cywgc2luY2UgdGhpcyBpcyB0aGUgYW1vdW50IG9mIHVud2luZGluZyBpbiB0aGUgbWFpbgorCUAgZGl2aXNpb24gbG9vcC4gIENvbnRpbnVlIHNoaWZ0aW5nIHVudGlsIHRoZSBkaXZpc29yIGlzCisJQCBsYXJnZXIgdGhhbiB0aGUgZGl2aWRlbmQuCisJY21wCWRpdmlzb3IsICMweDEwMDAwMDAwCisJY21wY2MJZGl2aXNvciwgZGl2aWRlbmQKKwltb3ZjYwlkaXZpc29yLCBkaXZpc29yLCBsc2wgIzQKKwltb3ZjYwljdXJiaXQsIGN1cmJpdCwgbHNsICM0CisJYmNjCUxvb3AxCitMYmlnbnVtOgorCUAgRm9yIHZlcnkgYmlnIGRpdmlzb3JzLCB3ZSBtdXN0IHNoaWZ0IGl0IGEgYml0IGF0IGEgdGltZSwgb3IKKwlAIHdlIHdpbGwgYmUgaW4gZGFuZ2VyIG9mIG92ZXJmbG93aW5nLgorCWNtcAlkaXZpc29yLCAjMHg4MDAwMDAwMAorCWNtcGNjCWRpdmlzb3IsIGRpdmlkZW5kCisJbW92Y2MJZGl2aXNvciwgZGl2aXNvciwgbHNsICMxCisJbW92Y2MJY3VyYml0LCBjdXJiaXQsIGxzbCAjMQorCWJjYwlMYmlnbnVtCitMb29wMzoKKwlAIFRlc3QgZm9yIHBvc3NpYmxlIHN1YnRyYWN0aW9ucy4gIE9uIHRoZSBmaW5hbCBwYXNzLCB0aGlzIG1heQorCUAgc3VidHJhY3QgdG9vIG11Y2ggZnJvbSB0aGUgZGl2aWRlbmQsIHNvIGtlZXAgdHJhY2sgb2Ygd2hpY2gKKwlAIHN1YnRyYWN0aW9ucyBhcmUgZG9uZSwgd2UgY2FuIGZpeCB0aGVtIHVwIGFmdGVyd2FyZHMuLi4KKwltb3YJb3ZlcmRvbmUsICMwCisJY21wCWRpdmlkZW5kLCBkaXZpc29yCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yCisJY21wCWRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzEKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMQorCW9ycmNzCW92ZXJkb25lLCBvdmVyZG9uZSwgY3VyYml0LCByb3IgIzEKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMgorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMyCisJb3JyY3MJb3ZlcmRvbmUsIG92ZXJkb25lLCBjdXJiaXQsIHJvciAjMgorCWNtcAlkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMzCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzMKKwlvcnJjcwlvdmVyZG9uZSwgb3ZlcmRvbmUsIGN1cmJpdCwgcm9yICMzCisJbW92CWlwLCBjdXJiaXQKKwljbXAJZGl2aWRlbmQsICMwCQkJQCBFYXJseSB0ZXJtaW5hdGlvbj8KKwltb3ZuZXMJY3VyYml0LCBjdXJiaXQsIGxzciAjNAkJQCBObywgYW55IG1vcmUgYml0cyB0byBkbz8KKwltb3ZuZQlkaXZpc29yLCBkaXZpc29yLCBsc3IgIzQKKwlibmUJTG9vcDMKKwlAIEFueSBzdWJ0cmFjdGlvbnMgdGhhdCB3ZSBzaG91bGQgbm90IGhhdmUgZG9uZSB3aWxsIGJlIHJlY29yZGVkIGluCisJQCB0aGUgdG9wIHRocmVlIGJpdHMgb2YgIm92ZXJkb25lIi4gIEV4YWN0bHkgd2hpY2ggd2VyZSBub3QgbmVlZGVkCisJQCBhcmUgZ292ZXJuZWQgYnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBiaXQsIHN0b3JlZCBpbiBpcC4KKwlAIElmIHdlIHRlcm1pbmF0ZWQgZWFybHksIGJlY2F1c2UgZGl2aWRlbmQgYmVjYW1lIHplcm8sCisJQCB0aGVuIG5vbmUgb2YgdGhlIGJlbG93IHdpbGwgbWF0Y2gsIHNpbmNlIHRoZSBiaXQgaW4gaXAgd2lsbCBub3QgYmUKKwlAIGluIHRoZSBib3R0b20gbmliYmxlLgorCWFuZHMJb3ZlcmRvbmUsIG92ZXJkb25lLCAjMHhlMDAwMDAwMAorCW1vdmVxICAJcGMsIGxyCQkJCUAgTm8gZml4dXBzIG5lZWRlZAorCXRzdAlvdmVyZG9uZSwgaXAsIHJvciAjMworCWFkZG5lCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMzCisJdHN0CW92ZXJkb25lLCBpcCwgcm9yICMyCisJYWRkbmUJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzIKKwl0c3QJb3ZlcmRvbmUsIGlwLCByb3IgIzEKKwlhZGRuZQlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMQorCW1vdiAJcGMsIGxyCitMZGl2MDoKKwlzdHIJbHIsIFtzcCwgIy00XSEKKwlibAkgX19kaXYwICAgICAgIChQTFQpCisJbW92CXIwLCAjMAkJCUAgYWJvdXQgYXMgd3JvbmcgYXMgaXQgY291bGQgYmUKKwlsZG1pYQlzcCEsIHtwY30KKwkuc2l6ZSAgX191bW9kc2kzICAgICAgICwgLiAtICBfX3Vtb2RzaTMKKy8qICMgMzIwICJsaWJnY2MxLlMiICovCisvKiAjIDQyMSAibGliZ2NjMS5TIiAqLworLyogIyA0MzMgImxpYmdjYzEuUyIgKi8KKy8qICMgNDU2ICJsaWJnY2MxLlMiICovCisvKiAjIDUwMCAibGliZ2NjMS5TIiAqLworLyogIyA1ODAgImxpYmdjYzEuUyIgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9ib2FyZC5jIGIveC1sb2FkZXIvbGliL2JvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MzU4NAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9ib2FyZC5jCkBAIC0wLDAgKzEsNDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRleGFzIEluc3RydW1lbnRzLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogSmlhbiBaaGFuZywgVGV4YXMgSW5zdHJ1bWVudHMsIGp6aGFuZ0B0aS5jb20uCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyLTIwMDYKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Ym9vdG0uaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+CisjaW5jbHVkZSA8ZmF0Lmg+CisjaW5jbHVkZSA8aW1hZ2UuaD4KKyNpbmNsdWRlIDxtbWMuaD4KKyNpbmNsdWRlIDx0aW1lc3RhbXAuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKy8qCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMKKyAqLworI2lmbmRlZiBDT05GSUdfSURFTlRfU1RSSU5HCisjZGVmaW5lIENPTkZJR19JREVOVF9TVFJJTkcgIiIKKyNlbmRpZgorCisvKiBUeXBlIERlZmluaXRpb24gKi8KKwordHlwZWRlZiBpbnQgKGluaXRfZm5jX3QpKHZvaWQpOworCisvKgorICogRnVuY3Rpb24gUHJvdG90eXBlcworICovCitleHRlcm4gaW50IG1pc2NfaW5pdF9yICh2b2lkKTsKK2V4dGVybiBpbnQgbW1jX2luaXQoaW50IHZlcmJvc2UpOworZXh0ZXJuIGJsb2NrX2Rldl9kZXNjX3QgKm1tY19nZXRfZGV2KGludCBkZXYpOworZXh0ZXJuIGludCBnZXRfYm9vdF9kZXZpY2VzX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlc19saXN0KTsKKworLyoKKyAqIEdsb2JhbCBWYXJpYWJsZXMKKyAqLworY29uc3QgY2hhciB2ZXJzaW9uX3N0cmluZ1tdID0KKwlYX0xPQURFUl9WRVJTSU9OIiAoIiBYX0xPQURFUl9EQVRFICIgLSAiIFhfTE9BREVSX1RJTUUgIikiQ09ORklHX0lERU5UX1NUUklORzsKKworaW5pdF9mbmNfdCAqaW5pdF9zZXF1ZW5jZVtdID0geworCWNwdV9pbml0LAkJLyogYmFzaWMgY3B1IGRlcGVuZGVudCBzZXR1cCAqLworCWJvYXJkX2luaXQsCQkvKiBiYXNpYyBib2FyZCBkZXBlbmRlbnQgc2V0dXAgKi8KKyNpZmRlZiBDRkdfUFJJTlRGCisgCXNlcmlhbF9pbml0LAkJLyogc2VyaWFsIGNvbW11bmljYXRpb25zIHNldHVwICovCisJZGlzcGxheV9vcHRpb25zLAorI2VuZGlmCisgIAluYW5kX2luaXQsCQkvKiBib2FyZCBzcGVjaWZpYyBuYW5kIGluaXQgKi8KKyAgCU5VTEwsCit9OworCitzdGF0aWMgaW5saW5lIGludCBjaGVja19sb2FkX3BhcmFtcyhjb25zdCB1aW50OF90ICpidWZmZXIsIGNvbnN0IGludCAqaW5kZXgsIGludCBjb3VudCkKK3sKKwlpZiAoYnVmZmVyID09IE5VTEwgfHwgaW5kZXggPT0gTlVMTCB8fCBjb3VudCA9PSAwIHx8ICppbmRleCA8IEJPT1RNX0lOREVYX1NUQVJUIHx8ICppbmRleCA+PSBjb3VudCkgeworCQlyZXR1cm4gKEJPT1RNX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwlyZXR1cm4gKEJPT1RNX1NUQVRVU19TVUNDRVNTKTsKK30KKworI2lmIChkZWZpbmVkKENGR19NTUNfT05FTkFORCkgfHwgZGVmaW5lZCAoQ0ZHX01NQ19OQU5EKSkgJiYgZGVmaW5lZChDRkdfQ01EX0ZBVCkKKy8qCisgKiAgaW50IGZhdF9sb2FkKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gcmVhZCBmcm9tIHRoZSBmaXJzdCBpbml0aWFsaXplZAorICogICAgTXVsdGltZWRpYSBDYXJkIChNTUMpIGRldmljZSwgb25lIG9mIG9uZSBvciBtb3JlIGRlc2lnbmF0ZWQKKyAqICAgIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlcnMgKFNQTCkgZnJvbSB0aGUgYSBGQVQgZmlsZSBzeXN0ZW0gb24KKyAqICAgIHRoZSBmaXJzdCBwYXJ0aXRpb24gb2YgYSBNYXN0ZXIgQm9vdCBSZWNvcmQgdm9sdW1lLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGJ1ZmZlciAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyLgorICogICAgaW5kZXggIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBvZiBib290IGZpbGUgdG8gYXR0ZW1wdCB0byBsb2FkLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlci4KKyAqICAgIGluZGV4ICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgdGhlIG5leHQgYm9vdCBmaWxlIHRvCisgKiAgICAgICAgICAgICBhdHRlbXB0IHRvIGxvYWQuCisgKgorICogIFJldHVybnM6CisgKiAgICBCT09UTV9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzOyBvdGhlcndpc2UsIEJPT1RNX1NUQVRVU19GQUlMVVJFCisgKiAgICBvbiBlcnJvci4KKyAqCisgKi8KK3N0YXRpYyBpbnQgZmF0X2xvYWQodWludDhfdCAqYnVmZmVyLCBpbnQgKmluZGV4KQoreworI2lmIGRlZmluZWQoQ09ORklHX0JPT1RGSUxFKQorCWNvbnN0IGNoYXIgKiBjb25zdCBmaWxlc1tdID0geyBDT05GSUdfQk9PVEZJTEUgfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JPT1RGSUxFX0xJU1QpICYmIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKQorCWNvbnN0IGNoYXIgKiBjb25zdCBmaWxlc1tdID0gQ09ORklHX0JPT1RGSUxFX0xJU1Q7CisjZWxzZQorCWNvbnN0IGNoYXIgKiBjb25zdCBmaWxlc1tdID0geyBOVUxMIH07CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQk9PVEZJTEUpICovCisJY29uc3QgY2hhciAqIGZpbGUgPSBOVUxMOworCWNvbnN0IGNoYXIgKiBmYWlsdXJlID0gTlVMTDsKKwljb25zdCBpbnQgY291bnQgPSBBUlJBWV9TSVpFKGZpbGVzKTsKKwljb25zdCBpbnQgZGV2aWNlID0gMDsKKwljb25zdCBpbnQgcGFydGl0aW9uID0gMTsKKwljb25zdCBpbnQgbWF4c2l6ZSA9IDA7CisJY29uc3QgaW50IHZlcmJvc2UgPSAxOworCWxvbmcgc2l6ZSA9IDA7CisJYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzID0gMDsKKworCWlmICghY2hlY2tfbG9hZF9wYXJhbXMoYnVmZmVyLCBpbmRleCwgY291bnQpKSB7CisJCXJldHVybiAoQk9PVE1fU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCWZpbGUgPSBmaWxlc1soKmluZGV4KSsrXTsKKworCWlmICgqaW5kZXggPj0gY291bnQpIHsKKwkJKmluZGV4ID0gQk9PVE1fSU5ERVhfU1RPUDsKKwl9CisKKwlzdGF0dXMgPSBtbWNfaW5pdCh2ZXJib3NlKTsKKworCWlmIChzdGF0dXMgPT0gMCkgeworCQlmYWlsdXJlID0gIk1NQyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiI7CisJCWdvdG8gZmFpbDsKKwl9CisKKyAgICBkZXZfZGVzYyA9IG1tY19nZXRfZGV2KGRldmljZSk7CisKKyAgICBpZiAoZGV2X2Rlc2MgPT0gTlVMTCkgeworCQlmYWlsdXJlID0gIkNvdWxkIG5vdCBhY2Nlc3MgTU1DIGRldmljZVxuIjsKKwkJZ290byBmYWlsOworICAgIH0KKworICAgIGZhdF9yZWdpc3Rlcl9kZXZpY2UoZGV2X2Rlc2MsIHBhcnRpdGlvbik7CisKKwlzaXplID0gZmlsZV9mYXRfcmVhZChmaWxlLCBidWZmZXIsIG1heHNpemUpOworCisJaWYgKHNpemUgPT0gLTEpIHsKKwkJcHJpbnRmKCJDb3VsZCBub3QgcmVhZCBmaWxlIFwiJXNcIlxuIiwgZmlsZSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwcmludGYoIlxuJWxkIGJ5dGVzIHJlYWRcbiIsIHNpemUpOworCisJcHJpbnRmKCJMb2FkaW5nIGZyb20gTU1DJWQsIGZpbGUgXCIlc1wiXG4iLCBkZXZpY2UsIGZpbGUpOworCisJcmV0dXJuIChCT09UTV9TVEFUVVNfU1VDQ0VTUyk7CisKKyBmYWlsOgorCWlmIChmYWlsdXJlICE9IE5VTEwpIHsKKwkJcHV0cyhmYWlsdXJlKTsKKwl9CisKKwlyZXR1cm4gKEJPT1RNX1NUQVRVU19GQUlMVVJFKTsKK30KKyNlbmRpZiAvKiAoZGVmaW5lZChDRkdfTU1DX09ORU5BTkQpIHx8IGRlZmluZWQgKENGR19NTUNfTkFORCkpICYmIGRlZmluZWQoQ0ZHX0NNRF9GQVQpICovCisKKy8qCisgKiAgaW50IGJsb2NrX2xvYWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byByZWFkIGZyb20gYSBibG9jayBkZXZpY2Ugb25lIG9mIG9uZSBvcgorICogICAgbW9yZSBkZXNpZ25hdGVkIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlcnMgKFNQTCkgc3BlY2lmaWVkIGJ5IHRoZQorICogICAgYXJyYXkgb2YgYmxvY2sgZXh0ZW50cy4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBidWZmZXIgICAgIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbQorICogICAgICAgICAgICAgICAgIGxvYWRlci4KKyAqICAgIGluZGV4ICAgICAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIGJvb3QgZXh0ZW50IHRvIGF0dGVtcHQgdG8KKyAqICAgICAgICAgICAgICAgICBsb2FkLgorICogICAgY291bnQgICAgICAtIFRoZSB0b3RhbCBudW1iZXIgb2YgZXh0ZW50cy4KKyAqICAgIGV4dGVudHMgICAgLSBUaGUgYXJyYXkgb2YgYm9vdCBmaWxlIGV4dGVudHMgdG8gYXR0ZW1wdCB0byBsb2FkLgorICogICAgZGV2aWNlICAgICAtIEEgcG9pbnRlciB0byBhIEMgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGJsb2NrIGRldmljZSAKKyAqICAgICAgICAgICAgICAgICBiZWluZyBsb2FkZWQgZnJvbS4KKyAqICAgIHJlYWQgICAgICAgLSBBIHBvaW50ZXIgdG8gdGhlIGRldmljZS1zcGVjaWZpYyBmdW5jdGlvbiB0aGF0IHdpbGwKKyAqICAgICAgICAgICAgICAgICByZWFkIHRoZSBibG9ja3MgdG8gbG9hZC4KKyAqICAgIGJsb2NrX3NpemUgLSBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBkZXZpY2UncyBmdW5kYW1lbnRhbCByZWFkCisgKiAgICAgICAgICAgICAgICAgYmxvY2sgc2l6ZS4KKyAqICAgIAorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBidWZmZXIgICAgIC0gQSBwb2ludGVyIHRvIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIuCisgKiAgICBpbmRleCAgICAgIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBib290IGV4dGVudCB0bworICogICAgICAgICAgICAgICAgIGF0dGVtcHQgdG8gbG9hZC4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIEJPT1RNX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSwgQk9PVE1fU1RBVFVTX0ZBSUxVUkUKKyAqICAgIG9uIGVycm9yLgorICoKKyAqLworc3RhdGljIGludCBibG9ja19sb2FkKHVpbnQ4X3QgKmJ1ZmZlciwgaW50ICppbmRleCwgaW50IGNvdW50LCBjb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSwgY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgKCpyZWFkKSh1bnNpZ25lZCBjaGFyICosIHVsb25nKSwgdW5zaWduZWQgbG9uZyBibG9ja19zaXplKQoreworCWNvbnN0IGJvb3RfZXh0ZW50X3QgKmV4dGVudCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgZW5kOworCWludCByZWFkX3N0YXR1czsKKworCWlmICghY2hlY2tfbG9hZF9wYXJhbXMoYnVmZmVyLCBpbmRleCwgY291bnQpKSB7CisJCXJldHVybiAoQk9PVE1fU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCWV4dGVudCA9ICZleHRlbnRzWygqaW5kZXgpKytdOworCisJaWYgKCppbmRleCA+PSBjb3VudCkgeworCQkqaW5kZXggPSBCT09UTV9JTkRFWF9TVE9QOworCX0KKworCWVuZCA9IGV4dGVudC0+c3RhcnQgKyBleHRlbnQtPnNpemUgKyAxOworCisJZm9yIChhZGRyZXNzID0gZXh0ZW50LT5zdGFydDsgYWRkcmVzcyA8IGVuZDsgYWRkcmVzcyArPSBibG9ja19zaXplKSB7CisJCXJlYWRfc3RhdHVzID0gcmVhZChidWZmZXIsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgIAorCQkvKiBJZiBzdWNjZXNzZnVsLCBtb3ZlIHRoZSBkYXRhIHBvaW50ZXIuICBJZiBFQ0MgZmFpbHMsCisJCSAqIHJlcG9ydCBmYWlsdXJlIHRvIGNhbGxlci4gIElmIHNraXBwaW5nIGJhZCBibG9jaywKKwkJICoganVzdCBjb250aW51ZSBsb29waW5nIHdpdGhvdXQgbW92aW5nIHRoZSBkYXRhIHBvaW50ZXIuCisJCSAqLworCQlpZiAocmVhZF9zdGF0dXMgPT0gTkFORF9SRUFEX1NVQ0NFU1MpCisJCXsKKwkJCWJ1ZmZlciArPSBibG9ja19zaXplOworCQl9CisJCWVsc2UgaWYgKHJlYWRfc3RhdHVzID09IE5BTkRfUkVBRF9FQ0NfRkFJTFVSRSkKKwkJeworCQkJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7CisJCX0KKwl9CisKKwlwcmludGYoIkxvYWRpbmcgZnJvbSAlcywgb2Zmc2V0ICUjMDhseFxuIiwgZGV2aWNlLCBleHRlbnQtPnN0YXJ0KTsKKworCXJldHVybiAoQk9PVE1fU1RBVFVTX1NVQ0NFU1MpOworfQorCisjaWYgZGVmaW5lZChDRkdfR1BNQ19PTkVOQU5EKQorLyoKKyAqICBpbnQgb25lbmFuZF9sb2FkKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gcmVhZCBmcm9tIGEgT25lTkFORCBkZXZpY2Ugb25lIG9mIG9uZSBvcgorICogICAgbW9yZSBkZXNpZ25hdGVkIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlcnMgKFNQTCkgc3BlY2lmaWVkIGJ5IHRoZQorICogICAgYXJyYXkgb2YgYmxvY2sgZXh0ZW50cy4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHNlY29uZGFyeSBwcm9ncmFtCisgKiAgICAgICAgICAgICBsb2FkZXIuCisgKiAgICBpbmRleCAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIGJvb3QgZXh0ZW50IHRvIGF0dGVtcHQgdG8KKyAqICAgICAgICAgICAgIGxvYWQuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIGJ1ZmZlciAtIEEgcG9pbnRlciB0byB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyLgorICogICAgaW5kZXggIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBib290IGV4dGVudCB0bworICogICAgICAgICAgICAgYXR0ZW1wdCB0byBsb2FkLgorICoKKyAqICBSZXR1cm5zOgorICogICAgQk9PVE1fU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2Vzczsgb3RoZXJ3aXNlLCBCT09UTV9TVEFUVVNfRkFJTFVSRQorICogICAgb24gZXJyb3IuCisgKgorICovCitzdGF0aWMgaW50IG9uZW5hbmRfbG9hZCh1aW50OF90ICpidWZmZXIsIGludCAqaW5kZXgpCit7CisjaWYgZGVmaW5lZChDT05GSUdfT05FTkFORF9CT09URVhURU5UKQorCWNvbnN0IGJvb3RfZXh0ZW50X3QgZXh0ZW50c1tdID0geyBDT05GSUdfT05FTkFORF9CT09URVhURU5UIH07CisjZWxpZiBkZWZpbmVkKENPTkZJR19PTkVOQU5EX0JPT1RFWFRFTlRfTElTVCkgJiYgZGVmaW5lZChDT05GSUdfQk9PVE1fSU1BR0UpCisJY29uc3QgYm9vdF9leHRlbnRfdCBleHRlbnRzW10gPSBDT05GSUdfT05FTkFORF9CT09URVhURU5UX0xJU1Q7CisjZWxzZQorCWNvbnN0IGJvb3RfZXh0ZW50X3QgZXh0ZW50c1tdID0geyBOVUxMIH07CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfT05FTkFORF9CT09URVhURU5UKSAqLworCisJcmV0dXJuIGJsb2NrX2xvYWQoYnVmZmVyLAorCQkJCQkgIGluZGV4LAorCQkJCQkgIEFSUkFZX1NJWkUoZXh0ZW50cyksCisJCQkJCSAgZXh0ZW50cywKKwkJCQkJICAiT25lTkFORCIsCisJCQkJCSAgb25lbmFuZF9yZWFkX2Jsb2NrLAorCQkJCQkgIE9ORU5BTkRfQkxPQ0tfU0laRSk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChDRkdfR1BNQ19PTkVOQU5EKSAqLworCisjaWYgZGVmaW5lZChDRkdfR1BNQ19OQU5EKQorLyoKKyAqICBpbnQgbmFuZF9sb2FkKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gcmVhZCBmcm9tIGEgTkFORCBkZXZpY2Ugb25lIG9mIG9uZSBvcgorICogICAgbW9yZSBkZXNpZ25hdGVkIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlcnMgKFNQTCkgc3BlY2lmaWVkIGJ5IHRoZQorICogICAgYXJyYXkgb2YgYmxvY2sgZXh0ZW50cy4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHNlY29uZGFyeSBwcm9ncmFtCisgKiAgICAgICAgICAgICBsb2FkZXIuCisgKiAgICBpbmRleCAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIGJvb3QgZXh0ZW50IHRvIGF0dGVtcHQgdG8KKyAqICAgICAgICAgICAgIGxvYWQuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIGJ1ZmZlciAtIEEgcG9pbnRlciB0byB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyLgorICogICAgaW5kZXggIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBib290IGV4dGVudCB0bworICogICAgICAgICAgICAgYXR0ZW1wdCB0byBsb2FkLgorICoKKyAqICBSZXR1cm5zOgorICogICAgQk9PVE1fU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2Vzczsgb3RoZXJ3aXNlLCBCT09UTV9TVEFUVVNfRkFJTFVSRQorICogICAgb24gZXJyb3IuCisgKgorICovCitzdGF0aWMgaW50IG5hbmRfbG9hZCh1aW50OF90ICpidWZmZXIsIGludCAqaW5kZXgpCit7CisjaWYgZGVmaW5lZChDT05GSUdfTkFORF9CT09URVhURU5UKQorCWNvbnN0IGJvb3RfZXh0ZW50X3QgZXh0ZW50c1tdID0geyBDT05GSUdfTkFORF9CT09URVhURU5UIH07CisjZWxpZiBkZWZpbmVkKENPTkZJR19OQU5EX0JPT1RFWFRFTlRfTElTVCkgJiYgZGVmaW5lZChDT05GSUdfQk9PVE1fSU1BR0UpCisJY29uc3QgYm9vdF9leHRlbnRfdCBleHRlbnRzW10gPSBDT05GSUdfTkFORF9CT09URVhURU5UX0xJU1Q7CisjZWxzZQorCWNvbnN0IGJvb3RfZXh0ZW50X3QgZXh0ZW50c1tdID0geyBOVUxMIH07CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfTkFORF9CT09URVhURU5UKSAqLworCisJcmV0dXJuIGJsb2NrX2xvYWQoYnVmZmVyLAorCQkJCQkgIGluZGV4LAorCQkJCQkgIEFSUkFZX1NJWkUoZXh0ZW50cyksCisJCQkJCSAgZXh0ZW50cywKKwkJCQkJICAiTkFORCIsCisJCQkJCSAgbmFuZF9yZWFkX2Jsb2NrLAorCQkJCQkgIE5BTkRfQkxPQ0tfU0laRSk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChDRkdfR1BNQ19OQU5EKSAqLworCisvKgorICogIHZvaWQgZG9fYXJtX2Jvb3QoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBib290IHRoZSBzeXN0ZW0gZnJvbSB0aGUgc3BlY2lmaWVkCisgKiAgICBib290IGRldmljZSBhZnRlciBjb3B5aW5nIHRoZSBzZWNvbmRhcnktcHJvZ3JhbSBsb2FkZXIgaW50bworICogICAgdGhlIHNwZWNpZmllZCBtZW1vcnkgYnVmZmVyLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGJ1ZmZlciAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgc2Vjb25kYXJ5IHByb2dyYW0KKyAqICAgICAgICAgICAgIGxvYWRlci4KKyAqICAgIHR5cGUgICAtIFRoZSBib290IGRldmljZSB0byBib290IGZyb20uCisgKgorICogIE91dHB1dChzKToKKyAqICAgIGJ1ZmZlciAtIEEgcG9pbnRlciB0byB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCitzdGF0aWMgdm9pZCBkb19hcm1fYm9vdCh1aW50OF90ICpidWZmZXIsIHUzMiB0eXBlKQoreworCWludCBpbmRleCA9IEJPT1RNX0lOREVYX1NUQVJUOworIAlpbnQgc3RhdHVzID0gQk9PVE1fU1RBVFVTX0ZBSUxVUkU7CisJZGV2aWNlX2xvYWQgbG9hZF9pbWFnZSA9IE5VTEw7CisKKwkvKiBEZXRlcm1pbmUsIGJhc2VkIG9uIHRoZSBib290IHNldHRpbmcsIHRoZSBzb3VyY2Ugd2UgYXJlIGdvaW5nCisJICogdG8gYXR0ZW1wdCB0byBib290IGZyb20uCisJICovCisKKwlzd2l0Y2ggKHR5cGUpIHsKKworI2lmICgoZGVmaW5lZChDRkdfTU1DX09ORU5BTkQpIHx8IGRlZmluZWQgKENGR19NTUNfTkFORCkpICYmIGRlZmluZWQoQ0ZHX0NNRF9GQVQpKQorCWNhc2UgTU1DX05BTkQ6CisJY2FzZSBNTUNfT05FTkFORDoKKwkJbG9hZF9pbWFnZSA9IGZhdF9sb2FkOworCQlicmVhazsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfR1BNQ19PTkVOQU5EKQorCWNhc2UgR1BNQ19PTkVOQU5EOgorCQlsb2FkX2ltYWdlID0gb25lbmFuZF9sb2FkOworCQlicmVhazsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfR1BNQ19OQU5EKQorCWNhc2UgR1BNQ19OQU5EOgorCQlsb2FkX2ltYWdlID0gbmFuZF9sb2FkOworCQlicmVhazsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJZ290byBmYWlsOworCisJfQorCisJLyogQXR0ZW1wdCB0byBsb2FkIGFuZCBib290IGFueSBjb25maWd1cmVkIGltYWdlcyB1bnRpbCB3ZQorCSAqIHN1Y2Nlc3NmdWxseSBib290IG9yIHVudGlsIHdlJ3ZlIGV4aGF1c3RlZCBhbGwgcG9zc2libGUgaW1hZ2VzLgorCSAqLworCisJZG8geworCQlzdGF0dXMgPSBsb2FkX2ltYWdlKGJ1ZmZlciwgJmluZGV4KTsKKworCQlpZiAoYm9vdG1fbG9hZF9zdWNjZXNzZnVsKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IGJvb3RtKGJ1ZmZlcik7CisJCX0KKworCX0gd2hpbGUgKGJvb3RtX2xvYWRfY29udGludWUoc3RhdHVzLCBpbmRleCkpOworZmFpbDoKKwlyZXR1cm47Cit9CisKK3ZvaWQgc3RhcnRfYXJtYm9vdCAodm9pZCkKK3sKKwljb25zdCB1MzIqIGRldmljZXNfbGlzdCA9IE5VTEw7CisJaW50IGRldklkeDsKKwlpbnQgYm9vdF9kZXZpY2VzX2NvdW50ID0gZ2V0X2Jvb3RfZGV2aWNlc19saXN0KCZkZXZpY2VzX2xpc3QpOworCWNvbnN0IGNoYXIgKiBib290X25hbWUgPSBOVUxMOworCWluaXRfZm5jX3QgKippbml0X2ZuY19wdHI7CisJdWludDhfdCAqYnVmZmVyID0gKHVpbnQ4X3QgKilDRkdfTE9BREFERFI7CisKKyAgIAlmb3IgKGluaXRfZm5jX3B0ciA9IGluaXRfc2VxdWVuY2U7ICppbml0X2ZuY19wdHI7ICsraW5pdF9mbmNfcHRyKSB7CisJCWlmICgoKmluaXRfZm5jX3B0cikoKSAhPSAwKSB7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwltaXNjX2luaXRfcigpOworCisJZm9yKCBkZXZJZHggPSAwOyBkZXZJZHggPCBib290X2RldmljZXNfY291bnQ7IGRldklkeCsrICkKKwl7CisJCXUzMiBib290X2RldiA9IGRldmljZXNfbGlzdFtkZXZJZHhdOworCQlzd2l0Y2ggKGJvb3RfZGV2KSB7CisKKwkJY2FzZSBNTUNfTkFORDoKKwkJY2FzZSBNTUNfT05FTkFORDoKKwkJCWJvb3RfbmFtZSA9ICJNTUMiOworCQkJYnJlYWs7CisKKwkJY2FzZSBHUE1DX09ORU5BTkQ6CisJCQlib290X25hbWUgPSAiT25lTkFORCI7CisJCQlicmVhazsKKworCQljYXNlIEdQTUNfTkFORDoKKwkJCWJvb3RfbmFtZSA9ICJOQU5EIjsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QRVJJUEhFUkFMOgorCQkJYm9vdF9uYW1lID0gIiI7CisJCQlwcmludGYoIlRyeWluZyBsb2FkIGZyb20gVVNCXG4iKTsKKwkJCWRvX3VzYigpOyAgLyogY2hlY2sgZm9yIHVzYiBkb3dubG9hZCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlib290X25hbWUgPSAiPHVua25vd24+IjsKKwkJCWJyZWFrOworCisJCX0KKworCQlkZWJ1ZygiVHJ5aW5nIFgtTG9hZGVyIG9uICVzXG4iLCBib290X25hbWUpOworCQkvKiBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4uICovCisJCWRvX2FybV9ib290KGJ1ZmZlciwgYm9vdF9kZXYpOworCX0KKworCS8qIElmIGZvciBzb21lIHJlYXNvbiBpdCBkb2VzLCB3ZSBoYXZlIG9ubHkgb25lIGNob2ljZSwgaGFuZy4gKi8KKwlwdXRzKCJJbWFnZXMgZXhoYXVzdGVkXG4iKTsKK2ZhaWw6CisJaGFuZygpOworfQorCit2b2lkIGhhbmcgKHZvaWQpCit7CisJLyogY2FsbCBib2FyZCBzcGVjaWZpYyBoYW5nIGZ1bmN0aW9uICovCisJYm9hcmRfaGFuZygpOworCisJLyogaWYgYm9hcmRfaGFuZygpIHJldHVybnMsIGhhbmdlIGhlcmUgKi8KKwlwdXRzKCJYLUxvYWRlciBoYW5nc1xuIik7CisKKwlmb3IgKDs7KTsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9ib290bS5jIGIveC1sb2FkZXIvbGliL2Jvb3RtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwMTMyMQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9ib290bS5jCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIEVyaWsgTW91dyAoSi5BLksuTW91d0BpdHMudHVkZWxmdC5ubCkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNwkgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8aW1hZ2UuaD4KKyNpbmNsdWRlIDx1LWJvb3QvemxpYi5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiBkZWZpbmVkIChDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfQ01ETElORV9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfSU5JVFJEX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19TRVJJQUxfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX1JFVklTSU9OX1RBRykKK3N0YXRpYyB2b2lkIHNldHVwX3N0YXJ0X3RhZyAoYmRfdCAqYmQpOworCisjIGlmZGVmIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUworc3RhdGljIHZvaWQgc2V0dXBfbWVtb3J5X3RhZ3MgKGJkX3QgKmJkKTsKKyMgZW5kaWYKK3N0YXRpYyB2b2lkIHNldHVwX2NvbW1hbmRsaW5lX3RhZyAoYmRfdCAqYmQsIGNoYXIgKmNvbW1hbmRsaW5lKTsKKworIyBpZmRlZiBDT05GSUdfSU5JVFJEX1RBRworc3RhdGljIHZvaWQgc2V0dXBfaW5pdHJkX3RhZyAoYmRfdCAqYmQsIHVsb25nIGluaXRyZF9zdGFydCwKKwkJCSAgICAgIHVsb25nIGluaXRyZF9lbmQpOworIyBlbmRpZgorc3RhdGljIHZvaWQgc2V0dXBfZW5kX3RhZyAoYmRfdCAqYmQpOworCitzdGF0aWMgc3RydWN0IHRhZyAqcGFyYW1zOworI2VuZGlmIC8qIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUyB8fCBDT05GSUdfQ01ETElORV9UQUcgfHwgQ09ORklHX0lOSVRSRF9UQUcgKi8KKworaW50IGRvX2Jvb3RtX2xpbnV4KGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSwgYm9vdG1faGVhZGVyc190ICppbWFnZXMpCit7CisJYmRfdAkqYmQgPSBnZC0+YmQ7CisJY2hhcgkqczsKKwlpbnQJbWFjaGlkID0gYmQtPmJpX2FyY2hfbnVtYmVyOworCXZvaWQJKCp0aGVLZXJuZWwpKGludCB6ZXJvLCBpbnQgYXJjaCwgdWludCBwYXJhbXMpOworCisjaWZkZWYgQ09ORklHX0NNRExJTkVfVEFHCisJY2hhciAqY29tbWFuZGxpbmUgPSBnZXRlbnYgKCJib290YXJncyIpOworI2VuZGlmCisKKwlpZiAoKGZsYWcgIT0gMCkgJiYgKGZsYWcgIT0gQk9PVE1fU1RBVEVfT1NfR08pKQorCQlyZXR1cm4gMTsKKworCXRoZUtlcm5lbCA9ICh2b2lkICgqKShpbnQsIGludCwgdWludCkpaW1hZ2VzLT5lcDsKKworCXMgPSBnZXRlbnYgKCJtYWNoaWQiKTsKKwlpZiAocykgeworCQltYWNoaWQgPSBzaW1wbGVfc3RydG91bCAocywgTlVMTCwgMTYpOworCQlwcmludGYgKCJVc2luZyBtYWNoaWQgMHgleCBmcm9tIGVudmlyb25tZW50XG4iLCBtYWNoaWQpOworCX0KKworCXNob3dfYm9vdF9wcm9ncmVzcyAoMTUpOworCisJZGVidWcgKCIjIyBUcmFuc2ZlcnJpbmcgY29udHJvbCB0byBMaW51eCAoYXQgYWRkcmVzcyAlMDhseCkgLi4uXG4iLAorCSAgICAgICAodWxvbmcpIHRoZUtlcm5lbCk7CisKKyNpZiBkZWZpbmVkIChDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfQ01ETElORV9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfSU5JVFJEX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19TRVJJQUxfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX1JFVklTSU9OX1RBRykKKwlzZXR1cF9zdGFydF90YWcgKGJkKTsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX1RBRworCXNldHVwX3NlcmlhbF90YWcgKCZwYXJhbXMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1JFVklTSU9OX1RBRworCXNldHVwX3JldmlzaW9uX3RhZyAoJnBhcmFtcyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MKKwlzZXR1cF9tZW1vcnlfdGFncyAoYmQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NNRExJTkVfVEFHCisJc2V0dXBfY29tbWFuZGxpbmVfdGFnIChiZCwgY29tbWFuZGxpbmUpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0lOSVRSRF9UQUcKKwlpZiAoaW1hZ2VzLT5yZF9zdGFydCAmJiBpbWFnZXMtPnJkX2VuZCkKKwkJc2V0dXBfaW5pdHJkX3RhZyAoYmQsIGltYWdlcy0+cmRfc3RhcnQsIGltYWdlcy0+cmRfZW5kKTsKKyNlbmRpZgorCXNldHVwX2VuZF90YWcgKGJkKTsKKyNlbmRpZgorCisJLyogd2UgYXNzdW1lIHRoYXQgdGhlIGtlcm5lbCBpcyBpbiBwbGFjZSAqLworCXByaW50ZiAoIlxuU3RhcnRpbmcga2VybmVsIC4uLlxuXG4iKTsKKworI2lmZGVmIENPTkZJR19VU0JfREVWSUNFCisJeworCQlleHRlcm4gdm9pZCB1ZGNfZGlzY29ubmVjdCAodm9pZCk7CisJCXVkY19kaXNjb25uZWN0ICgpOworCX0KKyNlbmRpZgorCisJY2xlYW51cF9iZWZvcmVfbGludXggKCk7CisKKwl0aGVLZXJuZWwgKDAsIG1hY2hpZCwgYmQtPmJpX2Jvb3RfcGFyYW1zKTsKKwkvKiBkb2VzIG5vdCByZXR1cm4gKi8KKworCXJldHVybiAxOworfQorCisKKyNpZiBkZWZpbmVkIChDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfQ01ETElORV9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfSU5JVFJEX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19TRVJJQUxfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX1JFVklTSU9OX1RBRykKK3N0YXRpYyB2b2lkIHNldHVwX3N0YXJ0X3RhZyAoYmRfdCAqYmQpCit7CisJcGFyYW1zID0gKHN0cnVjdCB0YWcgKikgYmQtPmJpX2Jvb3RfcGFyYW1zOworCisJcGFyYW1zLT5oZHIudGFnID0gQVRBR19DT1JFOworCXBhcmFtcy0+aGRyLnNpemUgPSB0YWdfc2l6ZSAodGFnX2NvcmUpOworCisJcGFyYW1zLT51LmNvcmUuZmxhZ3MgPSAwOworCXBhcmFtcy0+dS5jb3JlLnBhZ2VzaXplID0gMDsKKwlwYXJhbXMtPnUuY29yZS5yb290ZGV2ID0gMDsKKworCXBhcmFtcyA9IHRhZ19uZXh0IChwYXJhbXMpOworfQorCisKKyNpZmRlZiBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MKK3N0YXRpYyB2b2lkIHNldHVwX21lbW9yeV90YWdzIChiZF90ICpiZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfTlJfRFJBTV9CQU5LUzsgaSsrKSB7CisJCXBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfTUVNOworCQlwYXJhbXMtPmhkci5zaXplID0gdGFnX3NpemUgKHRhZ19tZW0zMik7CisKKwkJcGFyYW1zLT51Lm1lbS5zdGFydCA9IGJkLT5iaV9kcmFtW2ldLnN0YXJ0OworCQlwYXJhbXMtPnUubWVtLnNpemUgPSBiZC0+YmlfZHJhbVtpXS5zaXplOworCisJCXBhcmFtcyA9IHRhZ19uZXh0IChwYXJhbXMpOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgKi8KKworCitzdGF0aWMgdm9pZCBzZXR1cF9jb21tYW5kbGluZV90YWcgKGJkX3QgKmJkLCBjaGFyICpjb21tYW5kbGluZSkKK3sKKwljaGFyICpwOworCisJaWYgKCFjb21tYW5kbGluZSkKKwkJcmV0dXJuOworCisJLyogZWF0IGxlYWRpbmcgd2hpdGUgc3BhY2UgKi8KKwlmb3IgKHAgPSBjb21tYW5kbGluZTsgKnAgPT0gJyAnOyBwKyspOworCisJLyogc2tpcCBub24tZXhpc3RlbnQgY29tbWFuZCBsaW5lcyBzbyB0aGUga2VybmVsIHdpbGwgc3RpbGwKKwkgKiB1c2UgaXRzIGRlZmF1bHQgY29tbWFuZCBsaW5lLgorCSAqLworCWlmICgqcCA9PSAnXDAnKQorCQlyZXR1cm47CisKKwlwYXJhbXMtPmhkci50YWcgPSBBVEFHX0NNRExJTkU7CisJcGFyYW1zLT5oZHIuc2l6ZSA9CisJCShzaXplb2YgKHN0cnVjdCB0YWdfaGVhZGVyKSArIHN0cmxlbiAocCkgKyAxICsgNCkgPj4gMjsKKworCXN0cmNweSAocGFyYW1zLT51LmNtZGxpbmUuY21kbGluZSwgcCk7CisKKwlwYXJhbXMgPSB0YWdfbmV4dCAocGFyYW1zKTsKK30KKworCisjaWZkZWYgQ09ORklHX0lOSVRSRF9UQUcKK3N0YXRpYyB2b2lkIHNldHVwX2luaXRyZF90YWcgKGJkX3QgKmJkLCB1bG9uZyBpbml0cmRfc3RhcnQsIHVsb25nIGluaXRyZF9lbmQpCit7CisJLyogYW4gQVRBR19JTklUUkQgbm9kZSB0ZWxscyB0aGUga2VybmVsIHdoZXJlIHRoZSBjb21wcmVzc2VkCisJICogcmFtZGlzayBjYW4gYmUgZm91bmQuIEFUQUdfUkRJTUcgaXMgYSBiZXR0ZXIgbmFtZSwgYWN0dWFsbHkuCisJICovCisJcGFyYW1zLT5oZHIudGFnID0gQVRBR19JTklUUkQyOworCXBhcmFtcy0+aGRyLnNpemUgPSB0YWdfc2l6ZSAodGFnX2luaXRyZCk7CisKKwlwYXJhbXMtPnUuaW5pdHJkLnN0YXJ0ID0gaW5pdHJkX3N0YXJ0OworCXBhcmFtcy0+dS5pbml0cmQuc2l6ZSA9IGluaXRyZF9lbmQgLSBpbml0cmRfc3RhcnQ7CisKKwlwYXJhbXMgPSB0YWdfbmV4dCAocGFyYW1zKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfSU5JVFJEX1RBRyAqLworCisjaWZkZWYgQ09ORklHX1NFUklBTF9UQUcKK3ZvaWQgc2V0dXBfc2VyaWFsX3RhZyAoc3RydWN0IHRhZyAqKnRtcCkKK3sKKwlzdHJ1Y3QgdGFnICpwYXJhbXMgPSAqdG1wOworCXN0cnVjdCB0YWdfc2VyaWFsbnIgc2VyaWFsbnI7CisJdm9pZCBnZXRfYm9hcmRfc2VyaWFsKHN0cnVjdCB0YWdfc2VyaWFsbnIgKnNlcmlhbG5yKTsKKworCWdldF9ib2FyZF9zZXJpYWwoJnNlcmlhbG5yKTsKKwlwYXJhbXMtPmhkci50YWcgPSBBVEFHX1NFUklBTDsKKwlwYXJhbXMtPmhkci5zaXplID0gdGFnX3NpemUgKHRhZ19zZXJpYWxucik7CisJcGFyYW1zLT51LnNlcmlhbG5yLmxvdyA9IHNlcmlhbG5yLmxvdzsKKwlwYXJhbXMtPnUuc2VyaWFsbnIuaGlnaD0gc2VyaWFsbnIuaGlnaDsKKwlwYXJhbXMgPSB0YWdfbmV4dCAocGFyYW1zKTsKKwkqdG1wID0gcGFyYW1zOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUkVWSVNJT05fVEFHCit2b2lkIHNldHVwX3JldmlzaW9uX3RhZyhzdHJ1Y3QgdGFnICoqaW5fcGFyYW1zKQoreworCXUzMiByZXYgPSAwOworCXUzMiBnZXRfYm9hcmRfcmV2KHZvaWQpOworCisJcmV2ID0gZ2V0X2JvYXJkX3JldigpOworCXBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfUkVWSVNJT047CisJcGFyYW1zLT5oZHIuc2l6ZSA9IHRhZ19zaXplICh0YWdfcmV2aXNpb24pOworCXBhcmFtcy0+dS5yZXZpc2lvbi5yZXYgPSByZXY7CisJcGFyYW1zID0gdGFnX25leHQgKHBhcmFtcyk7Cit9CisjZW5kaWYgIC8qIENPTkZJR19SRVZJU0lPTl9UQUcgKi8KKworCitzdGF0aWMgdm9pZCBzZXR1cF9lbmRfdGFnIChiZF90ICpiZCkKK3sKKwlwYXJhbXMtPmhkci50YWcgPSBBVEFHX05PTkU7CisJcGFyYW1zLT5oZHIuc2l6ZSA9IDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgfHwgQ09ORklHX0NNRExJTkVfVEFHIHx8IENPTkZJR19JTklUUkRfVEFHICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvY3JjMzIuYyBiL3gtbG9hZGVyL2xpYi9jcmMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzQ5NGMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvY3JjMzIuYwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gY3JjMzIuYyBmcm9tIHRoZSB6bGliLTEuMS4zIGRpc3RyaWJ1dGlvbgorICogYnkgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlci4KKyAqLworCisvKiBjcmMzMi5jIC0tIGNvbXB1dGUgdGhlIENSQy0zMiBvZiBhIGRhdGEgc3RyZWFtCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2lmbmRlZiBVU0VfSE9TVENDCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjb21waWxlci5oPgorI2luY2x1ZGUgPHgtbG9hZC9jcmMuaD4KKworI2luY2x1ZGUgIngtbG9hZC96bGliLmgiCisKKyNkZWZpbmUgbG9jYWwgc3RhdGljCisjZGVmaW5lIFpFWFBPUlQJLyogZW1wdHkgKi8KKworI2RlZmluZSB0b2xlKHgpIGNwdV90b19sZTMyKHgpCisKKyNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQorCitsb2NhbCBpbnQgY3JjX3RhYmxlX2VtcHR5ID0gMTsKK2xvY2FsIHVpbnQzMl90IGNyY190YWJsZVsyNTZdOworbG9jYWwgdm9pZCBtYWtlX2NyY190YWJsZSBPRigodm9pZCkpOworCisvKgorICBHZW5lcmF0ZSBhIHRhYmxlIGZvciBhIGJ5dGUtd2lzZSAzMi1iaXQgQ1JDIGNhbGN1bGF0aW9uIG9uIHRoZSBwb2x5bm9taWFsOgorICB4XjMyK3heMjYreF4yMyt4XjIyK3heMTYreF4xMit4XjExK3heMTAreF44K3heNyt4XjUreF40K3heMit4KzEuCisKKyAgUG9seW5vbWlhbHMgb3ZlciBHRigyKSBhcmUgcmVwcmVzZW50ZWQgaW4gYmluYXJ5LCBvbmUgYml0IHBlciBjb2VmZmljaWVudCwKKyAgd2l0aCB0aGUgbG93ZXN0IHBvd2VycyBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICBUaGVuIGFkZGluZyBwb2x5bm9taWFscworICBpcyBqdXN0IGV4Y2x1c2l2ZS1vciwgYW5kIG11bHRpcGx5aW5nIGEgcG9seW5vbWlhbCBieSB4IGlzIGEgcmlnaHQgc2hpZnQgYnkKKyAgb25lLiAgSWYgd2UgY2FsbCB0aGUgYWJvdmUgcG9seW5vbWlhbCBwLCBhbmQgcmVwcmVzZW50IGEgYnl0ZSBhcyB0aGUKKyAgcG9seW5vbWlhbCBxLCBhbHNvIHdpdGggdGhlIGxvd2VzdCBwb3dlciBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgKHNvIHRoZQorICBieXRlIDB4YjEgaXMgdGhlIHBvbHlub21pYWwgeF43K3heMyt4KzEpLCB0aGVuIHRoZSBDUkMgaXMgKHEqeF4zMikgbW9kIHAsCisgIHdoZXJlIGEgbW9kIGIgbWVhbnMgdGhlIHJlbWFpbmRlciBhZnRlciBkaXZpZGluZyBhIGJ5IGIuCisKKyAgVGhpcyBjYWxjdWxhdGlvbiBpcyBkb25lIHVzaW5nIHRoZSBzaGlmdC1yZWdpc3RlciBtZXRob2Qgb2YgbXVsdGlwbHlpbmcgYW5kCisgIHRha2luZyB0aGUgcmVtYWluZGVyLiAgVGhlIHJlZ2lzdGVyIGlzIGluaXRpYWxpemVkIHRvIHplcm8sIGFuZCBmb3IgZWFjaAorICBpbmNvbWluZyBiaXQsIHheMzIgaXMgYWRkZWQgbW9kIHAgdG8gdGhlIHJlZ2lzdGVyIGlmIHRoZSBiaXQgaXMgYSBvbmUgKHdoZXJlCisgIHheMzIgbW9kIHAgaXMgcCt4XjMyID0geF4yNisuLi4rMSksIGFuZCB0aGUgcmVnaXN0ZXIgaXMgbXVsdGlwbGllZCBtb2QgcCBieQorICB4ICh3aGljaCBpcyBzaGlmdGluZyByaWdodCBieSBvbmUgYW5kIGFkZGluZyB4XjMyIG1vZCBwIGlmIHRoZSBiaXQgc2hpZnRlZAorICBvdXQgaXMgYSBvbmUpLiAgV2Ugc3RhcnQgd2l0aCB0aGUgaGlnaGVzdCBwb3dlciAobGVhc3Qgc2lnbmlmaWNhbnQgYml0KSBvZgorICBxIGFuZCByZXBlYXQgZm9yIGFsbCBlaWdodCBiaXRzIG9mIHEuCisKKyAgVGhlIHRhYmxlIGlzIHNpbXBseSB0aGUgQ1JDIG9mIGFsbCBwb3NzaWJsZSBlaWdodCBiaXQgdmFsdWVzLiAgVGhpcyBpcyBhbGwKKyAgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBnZW5lcmF0ZSBDUkMncyBvbiBkYXRhIGEgYnl0ZSBhdCBhIHRpbWUgZm9yIGFsbAorICBjb21iaW5hdGlvbnMgb2YgQ1JDIHJlZ2lzdGVyIHZhbHVlcyBhbmQgaW5jb21pbmcgYnl0ZXMuCisqLworbG9jYWwgdm9pZCBtYWtlX2NyY190YWJsZSgpCit7CisgIHVpbnQzMl90IGM7CisgIGludCBuLCBrOworICB1TG9uZyBwb2x5OwkJLyogcG9seW5vbWlhbCBleGNsdXNpdmUtb3IgcGF0dGVybiAqLworICAvKiB0ZXJtcyBvZiBwb2x5bm9taWFsIGRlZmluaW5nIHRoaXMgY3JjIChleGNlcHQgeF4zMik6ICovCisgIHN0YXRpYyBjb25zdCBCeXRlIHBbXSA9IHswLDEsMiw0LDUsNyw4LDEwLDExLDEyLDE2LDIyLDIzLDI2fTsKKworICAvKiBtYWtlIGV4Y2x1c2l2ZS1vciBwYXR0ZXJuIGZyb20gcG9seW5vbWlhbCAoMHhlZGI4ODMyMEwpICovCisgIHBvbHkgPSAwTDsKKyAgZm9yIChuID0gMDsgbiA8IHNpemVvZihwKS9zaXplb2YoQnl0ZSk7IG4rKykKKyAgICBwb2x5IHw9IDFMIDw8ICgzMSAtIHBbbl0pOworCisgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykKKyAgeworICAgIGMgPSAodUxvbmcpbjsKKyAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKQorICAgICAgYyA9IGMgJiAxID8gcG9seSBeIChjID4+IDEpIDogYyA+PiAxOworICAgIGNyY190YWJsZVtuXSA9IHRvbGUoYyk7CisgIH0KKyAgY3JjX3RhYmxlX2VtcHR5ID0gMDsKK30KKyNlbHNlCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRhYmxlIG9mIENSQy0zMidzIG9mIGFsbCBzaW5nbGUtYnl0ZSB2YWx1ZXMgKG1hZGUgYnkgbWFrZV9jcmNfdGFibGUpCisgKi8KKworbG9jYWwgY29uc3QgdWludDMyX3QgY3JjX3RhYmxlWzI1Nl0gPSB7Cit0b2xlKDB4MDAwMDAwMDBMKSwgdG9sZSgweDc3MDczMDk2TCksIHRvbGUoMHhlZTBlNjEyY0wpLCB0b2xlKDB4OTkwOTUxYmFMKSwKK3RvbGUoMHgwNzZkYzQxOUwpLCB0b2xlKDB4NzA2YWY0OGZMKSwgdG9sZSgweGU5NjNhNTM1TCksIHRvbGUoMHg5ZTY0OTVhM0wpLAordG9sZSgweDBlZGI4ODMyTCksIHRvbGUoMHg3OWRjYjhhNEwpLCB0b2xlKDB4ZTBkNWU5MWVMKSwgdG9sZSgweDk3ZDJkOTg4TCksCit0b2xlKDB4MDliNjRjMmJMKSwgdG9sZSgweDdlYjE3Y2JkTCksIHRvbGUoMHhlN2I4MmQwN0wpLCB0b2xlKDB4OTBiZjFkOTFMKSwKK3RvbGUoMHgxZGI3MTA2NEwpLCB0b2xlKDB4NmFiMDIwZjJMKSwgdG9sZSgweGYzYjk3MTQ4TCksIHRvbGUoMHg4NGJlNDFkZUwpLAordG9sZSgweDFhZGFkNDdkTCksIHRvbGUoMHg2ZGRkZTRlYkwpLCB0b2xlKDB4ZjRkNGI1NTFMKSwgdG9sZSgweDgzZDM4NWM3TCksCit0b2xlKDB4MTM2Yzk4NTZMKSwgdG9sZSgweDY0NmJhOGMwTCksIHRvbGUoMHhmZDYyZjk3YUwpLCB0b2xlKDB4OGE2NWM5ZWNMKSwKK3RvbGUoMHgxNDAxNWM0ZkwpLCB0b2xlKDB4NjMwNjZjZDlMKSwgdG9sZSgweGZhMGYzZDYzTCksIHRvbGUoMHg4ZDA4MGRmNUwpLAordG9sZSgweDNiNmUyMGM4TCksIHRvbGUoMHg0YzY5MTA1ZUwpLCB0b2xlKDB4ZDU2MDQxZTRMKSwgdG9sZSgweGEyNjc3MTcyTCksCit0b2xlKDB4M2MwM2U0ZDFMKSwgdG9sZSgweDRiMDRkNDQ3TCksIHRvbGUoMHhkMjBkODVmZEwpLCB0b2xlKDB4YTUwYWI1NmJMKSwKK3RvbGUoMHgzNWI1YThmYUwpLCB0b2xlKDB4NDJiMjk4NmNMKSwgdG9sZSgweGRiYmJjOWQ2TCksIHRvbGUoMHhhY2JjZjk0MEwpLAordG9sZSgweDMyZDg2Y2UzTCksIHRvbGUoMHg0NWRmNWM3NUwpLCB0b2xlKDB4ZGNkNjBkY2ZMKSwgdG9sZSgweGFiZDEzZDU5TCksCit0b2xlKDB4MjZkOTMwYWNMKSwgdG9sZSgweDUxZGUwMDNhTCksIHRvbGUoMHhjOGQ3NTE4MEwpLCB0b2xlKDB4YmZkMDYxMTZMKSwKK3RvbGUoMHgyMWI0ZjRiNUwpLCB0b2xlKDB4NTZiM2M0MjNMKSwgdG9sZSgweGNmYmE5NTk5TCksIHRvbGUoMHhiOGJkYTUwZkwpLAordG9sZSgweDI4MDJiODllTCksIHRvbGUoMHg1ZjA1ODgwOEwpLCB0b2xlKDB4YzYwY2Q5YjJMKSwgdG9sZSgweGIxMGJlOTI0TCksCit0b2xlKDB4MmY2ZjdjODdMKSwgdG9sZSgweDU4Njg0YzExTCksIHRvbGUoMHhjMTYxMWRhYkwpLCB0b2xlKDB4YjY2NjJkM2RMKSwKK3RvbGUoMHg3NmRjNDE5MEwpLCB0b2xlKDB4MDFkYjcxMDZMKSwgdG9sZSgweDk4ZDIyMGJjTCksIHRvbGUoMHhlZmQ1MTAyYUwpLAordG9sZSgweDcxYjE4NTg5TCksIHRvbGUoMHgwNmI2YjUxZkwpLCB0b2xlKDB4OWZiZmU0YTVMKSwgdG9sZSgweGU4YjhkNDMzTCksCit0b2xlKDB4NzgwN2M5YTJMKSwgdG9sZSgweDBmMDBmOTM0TCksIHRvbGUoMHg5NjA5YTg4ZUwpLCB0b2xlKDB4ZTEwZTk4MThMKSwKK3RvbGUoMHg3ZjZhMGRiYkwpLCB0b2xlKDB4MDg2ZDNkMmRMKSwgdG9sZSgweDkxNjQ2Yzk3TCksIHRvbGUoMHhlNjYzNWMwMUwpLAordG9sZSgweDZiNmI1MWY0TCksIHRvbGUoMHgxYzZjNjE2MkwpLCB0b2xlKDB4ODU2NTMwZDhMKSwgdG9sZSgweGYyNjIwMDRlTCksCit0b2xlKDB4NmMwNjk1ZWRMKSwgdG9sZSgweDFiMDFhNTdiTCksIHRvbGUoMHg4MjA4ZjRjMUwpLCB0b2xlKDB4ZjUwZmM0NTdMKSwKK3RvbGUoMHg2NWIwZDljNkwpLCB0b2xlKDB4MTJiN2U5NTBMKSwgdG9sZSgweDhiYmViOGVhTCksIHRvbGUoMHhmY2I5ODg3Y0wpLAordG9sZSgweDYyZGQxZGRmTCksIHRvbGUoMHgxNWRhMmQ0OUwpLCB0b2xlKDB4OGNkMzdjZjNMKSwgdG9sZSgweGZiZDQ0YzY1TCksCit0b2xlKDB4NGRiMjYxNThMKSwgdG9sZSgweDNhYjU1MWNlTCksIHRvbGUoMHhhM2JjMDA3NEwpLCB0b2xlKDB4ZDRiYjMwZTJMKSwKK3RvbGUoMHg0YWRmYTU0MUwpLCB0b2xlKDB4M2RkODk1ZDdMKSwgdG9sZSgweGE0ZDFjNDZkTCksIHRvbGUoMHhkM2Q2ZjRmYkwpLAordG9sZSgweDQzNjllOTZhTCksIHRvbGUoMHgzNDZlZDlmY0wpLCB0b2xlKDB4YWQ2Nzg4NDZMKSwgdG9sZSgweGRhNjBiOGQwTCksCit0b2xlKDB4NDQwNDJkNzNMKSwgdG9sZSgweDMzMDMxZGU1TCksIHRvbGUoMHhhYTBhNGM1ZkwpLCB0b2xlKDB4ZGQwZDdjYzlMKSwKK3RvbGUoMHg1MDA1NzEzY0wpLCB0b2xlKDB4MjcwMjQxYWFMKSwgdG9sZSgweGJlMGIxMDEwTCksIHRvbGUoMHhjOTBjMjA4NkwpLAordG9sZSgweDU3NjhiNTI1TCksIHRvbGUoMHgyMDZmODViM0wpLCB0b2xlKDB4Yjk2NmQ0MDlMKSwgdG9sZSgweGNlNjFlNDlmTCksCit0b2xlKDB4NWVkZWY5MGVMKSwgdG9sZSgweDI5ZDljOTk4TCksIHRvbGUoMHhiMGQwOTgyMkwpLCB0b2xlKDB4YzdkN2E4YjRMKSwKK3RvbGUoMHg1OWIzM2QxN0wpLCB0b2xlKDB4MmViNDBkODFMKSwgdG9sZSgweGI3YmQ1YzNiTCksIHRvbGUoMHhjMGJhNmNhZEwpLAordG9sZSgweGVkYjg4MzIwTCksIHRvbGUoMHg5YWJmYjNiNkwpLCB0b2xlKDB4MDNiNmUyMGNMKSwgdG9sZSgweDc0YjFkMjlhTCksCit0b2xlKDB4ZWFkNTQ3MzlMKSwgdG9sZSgweDlkZDI3N2FmTCksIHRvbGUoMHgwNGRiMjYxNUwpLCB0b2xlKDB4NzNkYzE2ODNMKSwKK3RvbGUoMHhlMzYzMGIxMkwpLCB0b2xlKDB4OTQ2NDNiODRMKSwgdG9sZSgweDBkNmQ2YTNlTCksIHRvbGUoMHg3YTZhNWFhOEwpLAordG9sZSgweGU0MGVjZjBiTCksIHRvbGUoMHg5MzA5ZmY5ZEwpLCB0b2xlKDB4MGEwMGFlMjdMKSwgdG9sZSgweDdkMDc5ZWIxTCksCit0b2xlKDB4ZjAwZjkzNDRMKSwgdG9sZSgweDg3MDhhM2QyTCksIHRvbGUoMHgxZTAxZjI2OEwpLCB0b2xlKDB4NjkwNmMyZmVMKSwKK3RvbGUoMHhmNzYyNTc1ZEwpLCB0b2xlKDB4ODA2NTY3Y2JMKSwgdG9sZSgweDE5NmMzNjcxTCksIHRvbGUoMHg2ZTZiMDZlN0wpLAordG9sZSgweGZlZDQxYjc2TCksIHRvbGUoMHg4OWQzMmJlMEwpLCB0b2xlKDB4MTBkYTdhNWFMKSwgdG9sZSgweDY3ZGQ0YWNjTCksCit0b2xlKDB4ZjliOWRmNmZMKSwgdG9sZSgweDhlYmVlZmY5TCksIHRvbGUoMHgxN2I3YmU0M0wpLCB0b2xlKDB4NjBiMDhlZDVMKSwKK3RvbGUoMHhkNmQ2YTNlOEwpLCB0b2xlKDB4YTFkMTkzN2VMKSwgdG9sZSgweDM4ZDhjMmM0TCksIHRvbGUoMHg0ZmRmZjI1MkwpLAordG9sZSgweGQxYmI2N2YxTCksIHRvbGUoMHhhNmJjNTc2N0wpLCB0b2xlKDB4M2ZiNTA2ZGRMKSwgdG9sZSgweDQ4YjIzNjRiTCksCit0b2xlKDB4ZDgwZDJiZGFMKSwgdG9sZSgweGFmMGExYjRjTCksIHRvbGUoMHgzNjAzNGFmNkwpLCB0b2xlKDB4NDEwNDdhNjBMKSwKK3RvbGUoMHhkZjYwZWZjM0wpLCB0b2xlKDB4YTg2N2RmNTVMKSwgdG9sZSgweDMxNmU4ZWVmTCksIHRvbGUoMHg0NjY5YmU3OUwpLAordG9sZSgweGNiNjFiMzhjTCksIHRvbGUoMHhiYzY2ODMxYUwpLCB0b2xlKDB4MjU2ZmQyYTBMKSwgdG9sZSgweDUyNjhlMjM2TCksCit0b2xlKDB4Y2MwYzc3OTVMKSwgdG9sZSgweGJiMGI0NzAzTCksIHRvbGUoMHgyMjAyMTZiOUwpLCB0b2xlKDB4NTUwNTI2MmZMKSwKK3RvbGUoMHhjNWJhM2JiZUwpLCB0b2xlKDB4YjJiZDBiMjhMKSwgdG9sZSgweDJiYjQ1YTkyTCksIHRvbGUoMHg1Y2IzNmEwNEwpLAordG9sZSgweGMyZDdmZmE3TCksIHRvbGUoMHhiNWQwY2YzMUwpLCB0b2xlKDB4MmNkOTllOGJMKSwgdG9sZSgweDViZGVhZTFkTCksCit0b2xlKDB4OWI2NGMyYjBMKSwgdG9sZSgweGVjNjNmMjI2TCksIHRvbGUoMHg3NTZhYTM5Y0wpLCB0b2xlKDB4MDI2ZDkzMGFMKSwKK3RvbGUoMHg5YzA5MDZhOUwpLCB0b2xlKDB4ZWIwZTM2M2ZMKSwgdG9sZSgweDcyMDc2Nzg1TCksIHRvbGUoMHgwNTAwNTcxM0wpLAordG9sZSgweDk1YmY0YTgyTCksIHRvbGUoMHhlMmI4N2ExNEwpLCB0b2xlKDB4N2JiMTJiYWVMKSwgdG9sZSgweDBjYjYxYjM4TCksCit0b2xlKDB4OTJkMjhlOWJMKSwgdG9sZSgweGU1ZDViZTBkTCksIHRvbGUoMHg3Y2RjZWZiN0wpLCB0b2xlKDB4MGJkYmRmMjFMKSwKK3RvbGUoMHg4NmQzZDJkNEwpLCB0b2xlKDB4ZjFkNGUyNDJMKSwgdG9sZSgweDY4ZGRiM2Y4TCksIHRvbGUoMHgxZmRhODM2ZUwpLAordG9sZSgweDgxYmUxNmNkTCksIHRvbGUoMHhmNmI5MjY1YkwpLCB0b2xlKDB4NmZiMDc3ZTFMKSwgdG9sZSgweDE4Yjc0Nzc3TCksCit0b2xlKDB4ODgwODVhZTZMKSwgdG9sZSgweGZmMGY2YTcwTCksIHRvbGUoMHg2NjA2M2JjYUwpLCB0b2xlKDB4MTEwMTBiNWNMKSwKK3RvbGUoMHg4ZjY1OWVmZkwpLCB0b2xlKDB4Zjg2MmFlNjlMKSwgdG9sZSgweDYxNmJmZmQzTCksIHRvbGUoMHgxNjZjY2Y0NUwpLAordG9sZSgweGEwMGFlMjc4TCksIHRvbGUoMHhkNzBkZDJlZUwpLCB0b2xlKDB4NGUwNDgzNTRMKSwgdG9sZSgweDM5MDNiM2MyTCksCit0b2xlKDB4YTc2NzI2NjFMKSwgdG9sZSgweGQwNjAxNmY3TCksIHRvbGUoMHg0OTY5NDc0ZEwpLCB0b2xlKDB4M2U2ZTc3ZGJMKSwKK3RvbGUoMHhhZWQxNmE0YUwpLCB0b2xlKDB4ZDlkNjVhZGNMKSwgdG9sZSgweDQwZGYwYjY2TCksIHRvbGUoMHgzN2Q4M2JmMEwpLAordG9sZSgweGE5YmNhZTUzTCksIHRvbGUoMHhkZWJiOWVjNUwpLCB0b2xlKDB4NDdiMmNmN2ZMKSwgdG9sZSgweDMwYjVmZmU5TCksCit0b2xlKDB4YmRiZGYyMWNMKSwgdG9sZSgweGNhYmFjMjhhTCksIHRvbGUoMHg1M2IzOTMzMEwpLCB0b2xlKDB4MjRiNGEzYTZMKSwKK3RvbGUoMHhiYWQwMzYwNUwpLCB0b2xlKDB4Y2RkNzA2OTNMKSwgdG9sZSgweDU0ZGU1NzI5TCksIHRvbGUoMHgyM2Q5NjdiZkwpLAordG9sZSgweGIzNjY3YTJlTCksIHRvbGUoMHhjNDYxNGFiOEwpLCB0b2xlKDB4NWQ2ODFiMDJMKSwgdG9sZSgweDJhNmYyYjk0TCksCit0b2xlKDB4YjQwYmJlMzdMKSwgdG9sZSgweGMzMGM4ZWExTCksIHRvbGUoMHg1YTA1ZGYxYkwpLCB0b2xlKDB4MmQwMmVmOGRMKQorfTsKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgIGRlZmluZSBET19DUkMoeCkgY3JjID0gdGFiWyhjcmMgXiAoeCkpICYgMjU1XSBeIChjcmMgPj4gOCkKKyMgZWxzZQorIyAgZGVmaW5lIERPX0NSQyh4KSBjcmMgPSB0YWJbKChjcmMgPj4gMjQpIF4gKHgpKSAmIDI1NV0gXiAoY3JjIDw8IDgpCisjIGVuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogTm8gb25lcyBjb21wbGVtZW50IHZlcnNpb24uIEpGRlMyIChhbmQgb3RoZXIgdGhpbmdzID8pCisgKiBkb24ndCB1c2Ugb25lcyBjb21wbGltZW50IGluIHRoZWlyIENSQyBjYWxjdWxhdGlvbnMuCisgKi8KK3VpbnQzMl90IFpFWFBPUlQgY3JjMzJfbm9fY29tcCh1aW50MzJfdCBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKQoreworICAgIGNvbnN0IHVpbnQzMl90ICp0YWIgPSBjcmNfdGFibGU7CisgICAgY29uc3QgdWludDMyX3QgKmIgPShjb25zdCB1aW50MzJfdCAqKWJ1ZjsKKyAgICBzaXplX3QgcmVtX2xlbjsKKyNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQorICAgIGlmIChjcmNfdGFibGVfZW1wdHkpCisgICAgICBtYWtlX2NyY190YWJsZSgpOworI2VuZGlmCisgICAgY3JjID0gY3B1X3RvX2xlMzIoY3JjKTsKKyAgICAvKiBBbGlnbiBpdCAqLworICAgIGlmICgoKGxvbmcpYikgJiAzICYmIGxlbikgeworCSB1aW50OF90ICpwID0gKHVpbnQ4X3QgKiliOworCSBkbyB7CisJICAgICAgRE9fQ1JDKCpwKyspOworCSB9IHdoaWxlICgoLS1sZW4pICYmICgobG9uZylwKSYzKTsKKwkgYiA9ICh1aW50MzJfdCAqKXA7CisgICAgfQorCisgICAgcmVtX2xlbiA9IGxlbiAmIDM7CisgICAgbGVuID0gbGVuID4+IDI7CisgICAgZm9yICgtLWI7IGxlbjsgLS1sZW4pIHsKKwkgLyogbG9hZCBkYXRhIDMyIGJpdHMgd2lkZSwgeG9yIGRhdGEgMzIgYml0cyB3aWRlLiAqLworCSBjcmMgXj0gKisrYjsgLyogdXNlIHByZSBpbmNyZW1lbnQgZm9yIHNwZWVkICovCisJIERPX0NSQygwKTsKKwkgRE9fQ1JDKDApOworCSBET19DUkMoMCk7CisJIERPX0NSQygwKTsKKyAgICB9CisgICAgbGVuID0gcmVtX2xlbjsKKyAgICAvKiBBbmQgdGhlIGxhc3QgZmV3IGJ5dGVzICovCisgICAgaWYgKGxlbikgeworCSB1aW50OF90ICpwID0gKHVpbnQ4X3QgKikoYiArIDEpIC0gMTsKKwkgZG8geworCSAgICAgIERPX0NSQygqKytwKTsgLyogdXNlIHByZSBpbmNyZW1lbnQgZm9yIHNwZWVkICovCisJIH0gd2hpbGUgKC0tbGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGUzMl90b19jcHUoY3JjKTsKK30KKyN1bmRlZiBET19DUkMKKwordWludDMyX3QgWkVYUE9SVCBjcmMzMiAodWludDMyX3QgY3JjLCBjb25zdCBCeXRlZiAqcCwgdUludCBsZW4pCit7CisgICAgIHJldHVybiBjcmMzMl9ub19jb21wKGNyYyBeIDB4ZmZmZmZmZmZMLCBwLCBsZW4pIF4gMHhmZmZmZmZmZkw7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGNyYzMyIGNoZWNrc3VtIHRyaWdnZXJpbmcgdGhlIHdhdGNoZG9nIGV2ZXJ5ICdjaHVua19zeicgYnl0ZXMKKyAqIG9mIGlucHV0LgorICovCit1aW50MzJfdCBaRVhQT1JUIGNyYzMyX3dkICh1aW50MzJfdCBjcmMsCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgICB1SW50IGxlbiwgdUludCBjaHVua19zeikKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19IV19XQVRDSERPRykgfHwgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCisJY29uc3QgdW5zaWduZWQgY2hhciAqZW5kLCAqY3VycjsKKwlpbnQgY2h1bms7CisKKwljdXJyID0gYnVmOworCWVuZCA9IGJ1ZiArIGxlbjsKKwl3aGlsZSAoY3VyciA8IGVuZCkgeworCQljaHVuayA9IGVuZCAtIGN1cnI7CisJCWlmIChjaHVuayA+IGNodW5rX3N6KQorCQkJY2h1bmsgPSBjaHVua19zejsKKwkJY3JjID0gY3JjMzIgKGNyYywgY3VyciwgY2h1bmspOworCQljdXJyICs9IGNodW5rOworCQlXQVRDSERPR19SRVNFVCAoKTsKKwl9CisjZWxzZQorCWNyYyA9IGNyYzMyIChjcmMsIGJ1ZiwgbGVuKTsKKyNlbmRpZgorCisJcmV0dXJuIGNyYzsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9jdHlwZS5jIGIveC1sb2FkZXIvbGliL2N0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkMDQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9jdHlwZS5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqICBsaW51eC9saWIvY3R5cGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKK3Vuc2lnbmVkIGNoYXIgX2N0eXBlW10gPSB7CitfQyxfQyxfQyxfQyxfQyxfQyxfQyxfQywJCQkvKiAwLTcgKi8KK19DLF9DfF9TLF9DfF9TLF9DfF9TLF9DfF9TLF9DfF9TLF9DLF9DLAkJLyogOC0xNSAqLworX0MsX0MsX0MsX0MsX0MsX0MsX0MsX0MsCQkJLyogMTYtMjMgKi8KK19DLF9DLF9DLF9DLF9DLF9DLF9DLF9DLAkJCS8qIDI0LTMxICovCitfU3xfU1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsCQkJLyogMzItMzkgKi8KK19QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLAkJCS8qIDQwLTQ3ICovCitfRCxfRCxfRCxfRCxfRCxfRCxfRCxfRCwJCQkvKiA0OC01NSAqLworX0QsX0QsX1AsX1AsX1AsX1AsX1AsX1AsCQkJLyogNTYtNjMgKi8KK19QLF9VfF9YLF9VfF9YLF9VfF9YLF9VfF9YLF9VfF9YLF9VfF9YLF9VLAkvKiA2NC03MSAqLworX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsCQkJLyogNzItNzkgKi8KK19VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLAkJCS8qIDgwLTg3ICovCitfVSxfVSxfVSxfUCxfUCxfUCxfUCxfUCwJCQkvKiA4OC05NSAqLworX1AsX0x8X1gsX0x8X1gsX0x8X1gsX0x8X1gsX0x8X1gsX0x8X1gsX0wsCS8qIDk2LTEwMyAqLworX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0wsCQkJLyogMTA0LTExMSAqLworX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0wsCQkJLyogMTEyLTExOSAqLworX0wsX0wsX0wsX1AsX1AsX1AsX1AsX0MsCQkJLyogMTIwLTEyNyAqLworMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwJCS8qIDEyOC0xNDMgKi8KKzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCQkvKiAxNDQtMTU5ICovCitfU3xfU1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsICAgLyogMTYwLTE3NSAqLworX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsICAgICAgIC8qIDE3Ni0xOTEgKi8KK19VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLCAgICAgICAvKiAxOTItMjA3ICovCitfVSxfVSxfVSxfVSxfVSxfVSxfVSxfUCxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfTCwgICAgICAgLyogMjA4LTIyMyAqLworX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0wsICAgICAgIC8qIDIyNC0yMzkgKi8KK19MLF9MLF9MLF9MLF9MLF9MLF9MLF9QLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MfTsgICAgICAvKiAyNDAtMjU1ICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvZGlzcGxheV9vcHRpb25zLmMgYi94LWxvYWRlci9saWIvZGlzcGxheV9vcHRpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkNzRiYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9kaXNwbGF5X29wdGlvbnMuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgoraW50IGRpc3BsYXlfb3B0aW9ucyAodm9pZCkKK3sKKwlleHRlcm4gY2hhciB2ZXJzaW9uX3N0cmluZ1tdOworCisjaWYgZGVmaW5lZChCVUlMRF9UQUcpCisJcHJpbnRmICgiXG5cbiVzLCBCdWlsZDogJXNcblxuIiwgdmVyc2lvbl9zdHJpbmcsIEJVSUxEX1RBRyk7CisjZWxzZQorCXByaW50ZiAoIlxuXG4lc1xuXG4iLCB2ZXJzaW9uX3N0cmluZyk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHByaW50IHNpemVzIGFzICJ4eHggS2lCIiwgInh4eC55IEtpQiIsICJ4eHggTWlCIiwgInh4eC55IE1pQiIsCisgKiB4eHggR2lCLCB4eHgueSBHaUIsIGV0YyBhcyBuZWVkZWQ7IGFsbG93IGZvciBvcHRpb25hbCB0cmFpbGluZyBzdHJpbmcKKyAqIChsaWtlICJcbiIpCisgKi8KK3ZvaWQgcHJpbnRfc2l6ZSh1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqcykKK3sKKwl1bnNpZ25lZCBsb25nIG0gPSAwLCBuOworCXVuc2lnbmVkIGxvbmcgbG9uZyBmOworCXN0YXRpYyBjb25zdCBjaGFyIG5hbWVzW10gPSB7J0UnLCAnUCcsICdUJywgJ0cnLCAnTScsICdLJ307CisJdW5zaWduZWQgbG9uZyBkID0gMTAgKiBBUlJBWV9TSVpFKG5hbWVzKTsKKwljaGFyIGMgPSAwOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmFtZXMpOyBpKyssIGQgLT0gMTApIHsKKwkJaWYgKHNpemUgPj4gZCkgeworCQkJYyA9IG5hbWVzW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWMpIHsKKwkJcHJpbnRmKCIlbGx1IEJ5dGVzJXMiLCBzaXplLCBzKTsKKwkJcmV0dXJuOworCX0KKworCW4gPSBzaXplID4+IGQ7CisJZiA9IHNpemUgJiAoKDFVTEwgPDwgZCkgLSAxKTsKKworCS8qIElmIHRoZXJlJ3MgYSByZW1haW5kZXIsIGRlYWwgd2l0aCBpdCAqLworCWlmIChmKSB7CisJCW0gPSAoMTBVTEwgKiBmICsgKDFVTEwgPDwgKGQgLSAxKSkpID4+IGQ7CisKKwkJaWYgKG0gPj0gMTApIHsKKwkJCW0gLT0gMTA7CisJCQluICs9IDE7CisJCX0KKwl9CisKKwlwcmludGYgKCIlbHUiLCBuKTsKKwlpZiAobSkgeworCQlwcmludGYgKCIuJWxkIiwgbSk7CisJfQorCXByaW50ZiAoIiAlY2lCJXMiLCBjLCBzKTsKK30KKworLyoKKyAqIFByaW50IGRhdGEgYnVmZmVyIGluIGhleCBhbmQgYXNjaWkgZm9ybSB0byB0aGUgdGVybWluYWwuCisgKgorICogZGF0YSByZWFkcyBhcmUgYnVmZmVyZWQgc28gdGhhdCBlYWNoIG1lbW9yeSBhZGRyZXNzIGlzIG9ubHkgcmVhZCBvbmNlLgorICogVXNlZnVsIHdoZW4gZGlzcGxheWluZyB0aGUgY29udGVudHMgb2Ygdm9sYXRpbGUgcmVnaXN0ZXJzLgorICoKKyAqIHBhcmFtZXRlcnM6CisgKiAgICBhZGRyOiBTdGFydGluZyBhZGRyZXNzIHRvIGRpc3BsYXkgYXQgc3RhcnQgb2YgbGluZQorICogICAgZGF0YTogcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICogICAgd2lkdGg6IGRhdGEgdmFsdWUgd2lkdGguICBNYXkgYmUgMSwgMiwgb3IgNC4KKyAqICAgIGNvdW50OiBudW1iZXIgb2YgdmFsdWVzIHRvIGRpc3BsYXkKKyAqICAgIGxpbmVsZW46IE51bWJlciBvZiB2YWx1ZXMgdG8gcHJpbnQgcGVyIGxpbmU7IHNwZWNpZnkgMCBmb3IgZGVmYXVsdCBsZW5ndGgKKyAqLworI2RlZmluZSBNQVhfTElORV9MRU5HVEhfQllURVMgKDY0KQorI2RlZmluZSBERUZBVUxUX0xJTkVfTEVOR1RIX0JZVEVTICgxNikKK2ludCBwcmludF9idWZmZXIgKHVsb25nIGFkZHIsIHZvaWQqIGRhdGEsIHVpbnQgd2lkdGgsIHVpbnQgY291bnQsIHVpbnQgbGluZWxlbikKK3sKKwkvKiBsaW5lYnVmIGFzIGEgdW5pb24gY2F1c2VzIHByb3BlciBhbGlnbm1lbnQgKi8KKwl1bmlvbiBsaW5lYnVmIHsKKwkJdWludDMyX3QgdWlbTUFYX0xJTkVfTEVOR1RIX0JZVEVTL3NpemVvZih1aW50MzJfdCkgKyAxXTsKKwkJdWludDE2X3QgdXNbTUFYX0xJTkVfTEVOR1RIX0JZVEVTL3NpemVvZih1aW50MTZfdCkgKyAxXTsKKwkJdWludDhfdCAgdWNbTUFYX0xJTkVfTEVOR1RIX0JZVEVTL3NpemVvZih1aW50OF90KSArIDFdOworCX0gbGI7CisJaW50IGk7CisKKwlpZiAobGluZWxlbip3aWR0aCA+IE1BWF9MSU5FX0xFTkdUSF9CWVRFUykKKwkJbGluZWxlbiA9IE1BWF9MSU5FX0xFTkdUSF9CWVRFUyAvIHdpZHRoOworCWlmIChsaW5lbGVuIDwgMSkKKwkJbGluZWxlbiA9IERFRkFVTFRfTElORV9MRU5HVEhfQllURVMgLyB3aWR0aDsKKworCXdoaWxlIChjb3VudCkgeworCQlwcmludGYoIiUwOGx4OiIsIGFkZHIpOworCisJCS8qIGNoZWNrIGZvciBvdmVyZmxvdyBjb25kaXRpb24gKi8KKwkJaWYgKGNvdW50IDwgbGluZWxlbikKKwkJCWxpbmVsZW4gPSBjb3VudDsKKworCQkvKiBDb3B5IGZyb20gbWVtb3J5IGludG8gbGluZWJ1ZiBhbmQgcHJpbnQgaGV4IHZhbHVlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgbGluZWxlbjsgaSsrKSB7CisJCQl1aW50MzJfdCB4OworCQkJaWYgKHdpZHRoID09IDQpCisJCQkJeCA9IGxiLnVpW2ldID0gKih2b2xhdGlsZSB1aW50MzJfdCAqKWRhdGE7CisJCQllbHNlIGlmICh3aWR0aCA9PSAyKQorCQkJCXggPSBsYi51c1tpXSA9ICoodm9sYXRpbGUgdWludDE2X3QgKilkYXRhOworCQkJZWxzZQorCQkJCXggPSBsYi51Y1tpXSA9ICoodm9sYXRpbGUgdWludDhfdCAqKWRhdGE7CisJCQlwcmludGYoIiAlMCp4Iiwgd2lkdGggKiAyLCB4KTsKKwkJCWRhdGEgKz0gd2lkdGg7CisJCX0KKworCQkvKiBQcmludCBkYXRhIGluIEFTQ0lJIGNoYXJhY3RlcnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxpbmVsZW4gKiB3aWR0aDsgaSsrKSB7CisJCQlpZiAoIWlzcHJpbnQobGIudWNbaV0pIHx8IGxiLnVjW2ldID49IDB4ODApCisJCQkJbGIudWNbaV0gPSAnLic7CisJCX0KKwkJbGIudWNbaV0gPSAnXDAnOworCQlwcmludGYoIiAgICAlc1xuIiwgbGIudWMpOworCisJCS8qIHVwZGF0ZSByZWZlcmVuY2VzICovCisJCWFkZHIgKz0gbGluZWxlbiAqIHdpZHRoOworCQljb3VudCAtPSBsaW5lbGVuOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2RpdjAuYyBiL3gtbG9hZGVyL2xpYi9kaXYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2N2JmMQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9kaXYwLmMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiBSZXBsYWNlbWVudCAoPWR1bW15KSBmb3IgR05VL0xpbnV4IGRpdmlzaW9uLWJ5IHplcm8gaGFuZGxlciAqLwordm9pZCBfX2RpdjAgKHZvaWQpCit7CisJZXh0ZXJuIHZvaWQgaGFuZyAodm9pZCk7CisKKwloYW5nKCk7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvZWNjLmMgYi94LWxvYWRlci9saWIvZWNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmYzQwZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9lY2MuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMCBUZXhhcyBJbnN0cnVtZW50cworICogCisgKiBUaGlzIGZpbGUgb3MgYmFzZWQgb24gdGhlIGZvbGxvd2luZyB1LWJvb3QgZmlsZToKKyAqCWNvbW1vbi9jbWRfbmFuZC5jCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorDQorLyoKKyAqIFByZS1jYWxjdWxhdGVkIDI1Ni13YXkgMSBieXRlIGNvbHVtbiBwYXJpdHkKKyAqLworc3RhdGljIGNvbnN0IHVfY2hhciBuYW5kX2VjY19wcmVjYWxjX3RhYmxlW10gPSB7CisJMHgwMCwgMHg1NSwgMHg1NiwgMHgwMywgMHg1OSwgMHgwYywgMHgwZiwgMHg1YSwgMHg1YSwgMHgwZiwgMHgwYywgMHg1OSwgMHgwMywgMHg1NiwgMHg1NSwgMHgwMCwKKwkweDY1LCAweDMwLCAweDMzLCAweDY2LCAweDNjLCAweDY5LCAweDZhLCAweDNmLCAweDNmLCAweDZhLCAweDY5LCAweDNjLCAweDY2LCAweDMzLCAweDMwLCAweDY1LAorCTB4NjYsIDB4MzMsIDB4MzAsIDB4NjUsIDB4M2YsIDB4NmEsIDB4NjksIDB4M2MsIDB4M2MsIDB4NjksIDB4NmEsIDB4M2YsIDB4NjUsIDB4MzAsIDB4MzMsIDB4NjYsCisJMHgwMywgMHg1NiwgMHg1NSwgMHgwMCwgMHg1YSwgMHgwZiwgMHgwYywgMHg1OSwgMHg1OSwgMHgwYywgMHgwZiwgMHg1YSwgMHgwMCwgMHg1NSwgMHg1NiwgMHgwMywKKwkweDY5LCAweDNjLCAweDNmLCAweDZhLCAweDMwLCAweDY1LCAweDY2LCAweDMzLCAweDMzLCAweDY2LCAweDY1LCAweDMwLCAweDZhLCAweDNmLCAweDNjLCAweDY5LAorCTB4MGMsIDB4NTksIDB4NWEsIDB4MGYsIDB4NTUsIDB4MDAsIDB4MDMsIDB4NTYsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsIDB4MGYsIDB4NWEsIDB4NTksIDB4MGMsCisJMHgwZiwgMHg1YSwgMHg1OSwgMHgwYywgMHg1NiwgMHgwMywgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwgMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwKKwkweDZhLCAweDNmLCAweDNjLCAweDY5LCAweDMzLCAweDY2LCAweDY1LCAweDMwLCAweDMwLCAweDY1LCAweDY2LCAweDMzLCAweDY5LCAweDNjLCAweDNmLCAweDZhLAorCTB4NmEsIDB4M2YsIDB4M2MsIDB4NjksIDB4MzMsIDB4NjYsIDB4NjUsIDB4MzAsIDB4MzAsIDB4NjUsIDB4NjYsIDB4MzMsIDB4NjksIDB4M2MsIDB4M2YsIDB4NmEsCisJMHgwZiwgMHg1YSwgMHg1OSwgMHgwYywgMHg1NiwgMHgwMywgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwgMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwKKwkweDBjLCAweDU5LCAweDVhLCAweDBmLCAweDU1LCAweDAwLCAweDAzLCAweDU2LCAweDU2LCAweDAzLCAweDAwLCAweDU1LCAweDBmLCAweDVhLCAweDU5LCAweDBjLAorCTB4NjksIDB4M2MsIDB4M2YsIDB4NmEsIDB4MzAsIDB4NjUsIDB4NjYsIDB4MzMsIDB4MzMsIDB4NjYsIDB4NjUsIDB4MzAsIDB4NmEsIDB4M2YsIDB4M2MsIDB4NjksCisJMHgwMywgMHg1NiwgMHg1NSwgMHgwMCwgMHg1YSwgMHgwZiwgMHgwYywgMHg1OSwgMHg1OSwgMHgwYywgMHgwZiwgMHg1YSwgMHgwMCwgMHg1NSwgMHg1NiwgMHgwMywKKwkweDY2LCAweDMzLCAweDMwLCAweDY1LCAweDNmLCAweDZhLCAweDY5LCAweDNjLCAweDNjLCAweDY5LCAweDZhLCAweDNmLCAweDY1LCAweDMwLCAweDMzLCAweDY2LAorCTB4NjUsIDB4MzAsIDB4MzMsIDB4NjYsIDB4M2MsIDB4NjksIDB4NmEsIDB4M2YsIDB4M2YsIDB4NmEsIDB4NjksIDB4M2MsIDB4NjYsIDB4MzMsIDB4MzAsIDB4NjUsCisJMHgwMCwgMHg1NSwgMHg1NiwgMHgwMywgMHg1OSwgMHgwYywgMHgwZiwgMHg1YSwgMHg1YSwgMHgwZiwgMHgwYywgMHg1OSwgMHgwMywgMHg1NiwgMHg1NSwgMHgwMAorfTsKKworCisvKgorICogQ3JlYXRlcyBub24taW52ZXJ0ZWQgRUNDIGNvZGUgZnJvbSBsaW5lIHBhcml0eQorICovCitzdGF0aWMgdm9pZCBuYW5kX3RyYW5zX3Jlc3VsdCh1X2NoYXIgcmVnMiwgdV9jaGFyIHJlZzMsCisJdV9jaGFyICplY2NfY29kZSkKK3sKKwl1X2NoYXIgYSwgYiwgaSwgdG1wMSwgdG1wMjsKKworCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCisJYSA9IGIgPSAweDgwOworCXRtcDEgPSB0bXAyID0gMDsKKworCS8qIENhbGN1bGF0ZSBmaXJzdCBFQ0MgYnl0ZSAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHJlZzMgJiBhKQkJLyogTFAxNSwxMywxMSw5IC0tPiBlY2NfY29kZVswXSAqLworCQkJdG1wMSB8PSBiOworCQliID4+PSAxOworCQlpZiAocmVnMiAmIGEpCQkvKiBMUDE0LDEyLDEwLDggLS0+IGVjY19jb2RlWzBdICovCisJCQl0bXAxIHw9IGI7CisJCWIgPj49IDE7CisJCWEgPj49IDE7CisJfQorCisJLyogQ2FsY3VsYXRlIHNlY29uZCBFQ0MgYnl0ZSAqLworCWIgPSAweDgwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHJlZzMgJiBhKQkJLyogTFA3LDUsMywxIC0tPiBlY2NfY29kZVsxXSAqLworCQkJdG1wMiB8PSBiOworCQliID4+PSAxOworCQlpZiAocmVnMiAmIGEpCQkvKiBMUDYsNCwyLDAgLS0+IGVjY19jb2RlWzFdICovCisJCQl0bXAyIHw9IGI7CisJCWIgPj49IDE7CisJCWEgPj49IDE7CisJfQorCisJLyogU3RvcmUgdHdvIG9mIHRoZSBFQ0MgYnl0ZXMgKi8KKwllY2NfY29kZVswXSA9IHRtcDE7CisJZWNjX2NvZGVbMV0gPSB0bXAyOworfQorCisvKgorICogQ2FsY3VsYXRlIDMgYnl0ZSBFQ0MgY29kZSBmb3IgMjU2IGJ5dGUgYmxvY2sKKyAqLworLyogRUNDIENhbGN1bGF0aW9uIGlzIGRpZmZlcmVudCBiZXR3ZWVuIE5BTkQgYW5kIE5BTkQgTGVnYWN5IGNvZGUKKyAqIGluIFUtQm9vdC4gSWYgTkFORF9MRUdBQ1kgaXMgZW5hYmxlZCBpbiB1LWJvb3QgaXQgc2hvdWxkIGJlIAorICogZW5hYmxlZCBpbiB0aGUgY29uZmlnIGZpbGUgaW4geC1sb2FkZXIgYWxzbyAKKyAqLworI2lmZGVmIE5BTkRfTEVHQUNZCit2b2lkIG5hbmRfY2FsY3VsYXRlX2VjYyAoY29uc3QgdV9jaGFyICpkYXQsIHVfY2hhciAqZWNjX2NvZGUpCit7CisJdV9jaGFyIGlkeCwgcmVnMSwgcmVnMzsKKwlpbnQgajsKKworCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCisJcmVnMSA9IHJlZzMgPSAwOworCWVjY19jb2RlWzBdID0gZWNjX2NvZGVbMV0gPSBlY2NfY29kZVsyXSA9IDA7CisKKwkvKiBCdWlsZCB1cCBjb2x1bW4gcGFyaXR5ICovCisJZm9yKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKworCQkvKiBHZXQgQ1AwIC0gQ1A1IGZyb20gdGFibGUgKi8KKwkJaWR4ID0gbmFuZF9lY2NfcHJlY2FsY190YWJsZVtkYXRbal1dOworCQlyZWcxIF49IGlkeDsKKworCQkvKiBBbGwgYml0IFhPUiA9IDEgPyAqLworCQlpZiAoaWR4ICYgMHg0MCkgeworCQkJcmVnMyBePSAodV9jaGFyKSBqOworCQl9CisJfQorCisJLyogQ3JlYXRlIG5vbi1pbnZlcnRlZCBFQ0MgY29kZSBmcm9tIGxpbmUgcGFyaXR5ICovCisJbmFuZF90cmFuc19yZXN1bHQoKHJlZzEgJiAweDQwKSA/IH5yZWczIDogcmVnMywgcmVnMywgZWNjX2NvZGUpOworCisJLyogQ2FsY3VsYXRlIGZpbmFsIEVDQyBjb2RlICovCisJZWNjX2NvZGVbMF0gPSB+ZWNjX2NvZGVbMF07CisJZWNjX2NvZGVbMV0gPSB+ZWNjX2NvZGVbMV07CisJZWNjX2NvZGVbMl0gPSAoKH5yZWcxKSA8PCAyKSB8IDB4MDM7Cit9CisjZWxzZQordm9pZCBuYW5kX2NhbGN1bGF0ZV9lY2MgKGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKQoreworCXVfY2hhciBpZHgsIHJlZzEsIHJlZzIsIHJlZzM7CisJaW50IGo7CisKKwkvKiBJbml0aWFsaXplIHZhcmlhYmxlcyAqLworCXJlZzEgPSByZWcyID0gcmVnMyA9IDA7CisJZWNjX2NvZGVbMF0gPSBlY2NfY29kZVsxXSA9IGVjY19jb2RlWzJdID0gMDsKKworCS8qIEJ1aWxkIHVwIGNvbHVtbiBwYXJpdHkgKi8KKwlmb3IoaiA9IDA7IGogPCAyNTY7IGorKykgeworCisJCS8qIEdldCBDUDAgLSBDUDUgZnJvbSB0YWJsZSAqLworCQlpZHggPSBuYW5kX2VjY19wcmVjYWxjX3RhYmxlW2RhdFtqXV07CisJCXJlZzEgXj0gKGlkeCAmIDB4M2YpOworCisJCS8qIEFsbCBiaXQgWE9SID0gMSA/ICovCisJCWlmIChpZHggJiAweDQwKSB7CisJCQlyZWczIF49ICh1X2NoYXIpIGo7CisJCQlyZWcyIF49IH4oKHVfY2hhcikgaik7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgbm9uLWludmVydGVkIEVDQyBjb2RlIGZyb20gbGluZSBwYXJpdHkgKi8KKwluYW5kX3RyYW5zX3Jlc3VsdChyZWcyLCByZWczLCBlY2NfY29kZSk7CisKKwkvKiBDYWxjdWxhdGUgZmluYWwgRUNDIGNvZGUgKi8KKwllY2NfY29kZVswXSA9IH5lY2NfY29kZVswXTsKKwllY2NfY29kZVsxXSA9IH5lY2NfY29kZVsxXTsKKwllY2NfY29kZVsyXSA9ICgofnJlZzEpIDw8IDIpIHwgMHgwMzsKK30KKyNlbmRpZgorLyoKKyAqIERldGVjdCBhbmQgY29ycmVjdCBhIDEgYml0IGVycm9yIGZvciAyNTYgYnl0ZSBibG9jaworICovCitpbnQgbmFuZF9jb3JyZWN0X2RhdGEgKHVfY2hhciAqZGF0LCB1X2NoYXIgKnJlYWRfZWNjLCB1X2NoYXIgKmNhbGNfZWNjKQoreworCXVfY2hhciBhLCBiLCBjLCBkMSwgZDIsIGQzLCBhZGQsIGJpdCwgaTsKKworCS8qIERvIGVycm9yIGRldGVjdGlvbiAqLworCWQxID0gY2FsY19lY2NbMF0gXiByZWFkX2VjY1swXTsKKwlkMiA9IGNhbGNfZWNjWzFdIF4gcmVhZF9lY2NbMV07CisJZDMgPSBjYWxjX2VjY1syXSBeIHJlYWRfZWNjWzJdOworCisJaWYgKChkMSB8IGQyIHwgZDMpID09IDApIHsKKwkJLyogTm8gZXJyb3JzICovCisJCXJldHVybiAwOworCX0KKwllbHNlIHsKKwkJYSA9IChkMSBeIChkMSA+PiAxKSkgJiAweDU1OworCQliID0gKGQyIF4gKGQyID4+IDEpKSAmIDB4NTU7CisJCWMgPSAoZDMgXiAoZDMgPj4gMSkpICYgMHg1NDsKKworCQkvKiBGb3VuZCBhbmQgd2lsbCBjb3JyZWN0IHNpbmdsZSBiaXQgZXJyb3IgaW4gdGhlIGRhdGEgKi8KKwkJaWYgKChhID09IDB4NTUpICYmIChiID09IDB4NTUpICYmIChjID09IDB4NTQpKSB7CisJCQljID0gMHg4MDsKKwkJCWFkZCA9IDA7CisJCQlhID0gMHg4MDsKKwkJCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQkJCWlmIChkMSAmIGMpCisJCQkJCWFkZCB8PSBhOworCQkJCWMgPj49IDI7CisJCQkJYSA+Pj0gMTsKKwkJCX0KKwkJCWMgPSAweDgwOworCQkJZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJCQkJaWYgKGQyICYgYykKKwkJCQkJYWRkIHw9IGE7CisJCQkJYyA+Pj0gMjsKKwkJCQlhID4+PSAxOworCQkJfQorCQkJYml0ID0gMDsKKwkJCWIgPSAweDA0OworCQkJYyA9IDB4ODA7CisJCQlmb3IgKGk9MDsgaTwzOyBpKyspIHsKKwkJCQlpZiAoZDMgJiBjKQorCQkJCQliaXQgfD0gYjsKKwkJCQljID4+PSAyOworCQkJCWIgPj49IDE7CisJCQl9CisJCQliID0gMHgwMTsKKwkJCWEgPSBkYXRbYWRkXTsKKwkJCWEgXj0gKGIgPDwgYml0KTsKKwkJCWRhdFthZGRdID0gYTsKKwkJCXJldHVybiAxOworCQl9CisJCWVsc2UgeworCQkJaSA9IDA7CisJCQl3aGlsZSAoZDEpIHsKKwkJCQlpZiAoZDEgJiAweDAxKQorCQkJCQkrK2k7CisJCQkJZDEgPj49IDE7CisJCQl9CisJCQl3aGlsZSAoZDIpIHsKKwkJCQlpZiAoZDIgJiAweDAxKQorCQkJCQkrK2k7CisJCQkJZDIgPj49IDE7CisJCQl9CisJCQl3aGlsZSAoZDMpIHsKKwkJCQlpZiAoZDMgJiAweDAxKQorCQkJCQkrK2k7CisJCQkJZDMgPj49IDE7CisJCQl9CisJCQlpZiAoaSA9PSAxKSB7CisJCQkJLyogRUNDIENvZGUgRXJyb3IgQ29ycmVjdGlvbiAqLworCQkJCXJlYWRfZWNjWzBdID0gY2FsY19lY2NbMF07CisJCQkJcmVhZF9lY2NbMV0gPSBjYWxjX2VjY1sxXTsKKwkJCQlyZWFkX2VjY1syXSA9IGNhbGNfZWNjWzJdOworCQkJCXJldHVybiAyOworCQkJfQorCQkJZWxzZSB7CisJCQkJLyogVW5jb3JyZWN0YWJsZSBFcnJvciAqLworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwlyZXR1cm4gLTE7Cit9CisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9vbWFwX2JjaC5jIGIveC1sb2FkZXIvbGliL29tYXBfYmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0MjRhNgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9vbWFwX2JjaC5jCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogb21hcF9iY2guYworICoKKyAqIFN1cHBvcnQgbW9kdWxlcyBmb3IgQkNIIDQtYml0LzgtYml0IGVycm9yIGNvcnJlY3Rpb24uCisgKgorICogQ29weXJpZ2h0IChDKSB7MjAxMX0gVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2RlZmluZSBHUE1DX0VDQ19CQ0hfUkVTVUxUXzAgICAweDI0MAorI2RlZmluZSBQQUdFX1NJWkUgICAgICAgICAgICAgICAyMDQ4CisjZGVmaW5lIE5BTkRfRUNDX1JFQUQgICAgICAgICAgIDAKKyNkZWZpbmUgTkFORF9FQ0NfV1JJVEUgICAgICAgICAgMQorI2RlZmluZSBfX3Jhd193cml0ZWwodixhKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYSkgPSAodikpCisjZGVmaW5lIF9fcmF3X3JlYWRsKGEpICAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShhKSkKKworaW50IGRlY29kZV9iY2goaW50IHNlbGVjdF80XzgsIHVuc2lnbmVkIGNoYXIgKmVjYywgdW5zaWduZWQgaW50ICplcnJfbG9jKTsKKworLyoKKyAqICBvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoOCAtIFZlcnNpb24gZm9yIDhCSVQgQkNIIGNvcnJlY3Rpb24uCisgKgorICogIEBkYXQ6CXVudXNlZAorICogIEBlY2NfY29kZToJZWNjX2NvZGUgYnVmZmVyCisgKi8KK2ludCBvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoOChjb25zdCB1aW50OF90ICpkYXQsCisJCQkJICAgdWludDhfdCAqZWNjX2NvZGUpCit7CisgIHVuc2lnbmVkIGxvbmcgcmVnLCB2YWwxID0gMHgwLCB2YWwyID0gMHgwOworICB1bnNpZ25lZCBsb25nIHZhbDMgPSAweDAsIHZhbDQgPSAweDA7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkUvNTEyOyBpKyspIHsKKyAgICAvKiBSZWFkaW5nIEhXIEVDQ19CQ0hfUmVzdWx0cworICAgICAqIDB4MjQwLTB4MjRDLCAweDI1MC0weDI1QywgMHgyNjAtMHgyNkMsIDB4MjcwLTB4MjdDCisgICAgICovCisgICAgcmVnID0gKHVuc2lnbmVkIGxvbmcpKEdQTUNfQkFTRSArCisJCQkgIEdQTUNfRUNDX0JDSF9SRVNVTFRfMCArICgweDEwICogaSkpOworICAgIHZhbDEgPSBfX3Jhd19yZWFkbChyZWcpOworICAgIHZhbDIgPSBfX3Jhd19yZWFkbChyZWcgKyA0KTsKKyAgICB2YWwzID0gX19yYXdfcmVhZGwocmVnICsgOCk7CisgICAgdmFsNCA9IF9fcmF3X3JlYWRsKHJlZyArIDEyKTsKKworICAgICplY2NfY29kZSsrID0gKHZhbDQgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMyA+PiAyNCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMyA+PiAxNikgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMyA+PiA4KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKHZhbDMgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMiA+PiAyNCkgJiAweEZGKTsKKworICAgICplY2NfY29kZSsrID0gKCh2YWwyID4+IDE2KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwyID4+IDgpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAodmFsMiAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwxID4+IDI0KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwxID4+IDE2KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwxID4+IDgpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAodmFsMSAmIDB4RkYpOworICB9CisgIHJldHVybiAwOworfQorCisvKgorICogIG9tYXBfY2FsY3VsYXRlX2VjY19iY2g0IC0gVmVyc2lvbiBmb3IgNEJJVCBCQ0ggY29ycmVjdGlvbi4KKyAqCisgKiAgQGRhdDoJdW51c2VkCisgKiAgQGVjY19jb2RlOgllY2NfY29kZSBidWZmZXIKKyAqLworaW50IG9tYXBfY2FsY3VsYXRlX2VjY19iY2g0KGNvbnN0IHVpbnQ4X3QgKmRhdCwKKwkJCQkgICB1aW50OF90ICplY2NfY29kZSkKK3sKKyAgdW5zaWduZWQgbG9uZyByZWcsIHZhbDEgPSAweDAsIHZhbDIgPSAweDA7CQorICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFLzUxMjsgaSsrKSB7CisgICAgLyogUmVhZGluZyBIVyBFQ0NfQkNIX1Jlc3VsdHMKKyAgICAgKiAweDI0MC0weDI0QywgMHgyNTAtMHgyNUMsIDB4MjYwLTB4MjZDLCAweDI3MC0weDI3QworICAgICAqLworICAgIHJlZyA9ICh1bnNpZ25lZCBsb25nKShHUE1DX0JBU0UgKworCQkJICBHUE1DX0VDQ19CQ0hfUkVTVUxUXzAgKyAoMHgxMCAqIGkpKTsKKyAgICB2YWwxID0gX19yYXdfcmVhZGwocmVnKTsKKyAgICB2YWwyID0gX19yYXdfcmVhZGwocmVnICsgNCk7CisKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMiA+PiAxNikgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMiA+PiA4KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKHZhbDIgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMSA+PiAyNCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMSA+PiAxNikgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMSA+PiA4KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKHZhbDEgJiAweEZGKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyogSW1wbGVtZW50YXRpb24gZm9yIDRiLzhiIEJDSCBjb3JyZWN0aW9uLiAgUGFzcyBlaXRoZXIgNCBvciA4IGludG8gdGhlIAorICAgY29ycmVjdF9iaXRzIHBhcmFtZXRlci4gKi8KK3N0YXRpYyBpbnQgb21hcF9jb3JyZWN0X2RhdGFfYmNoKGludCBjb3JyZWN0X2JpdHMsIHVpbnQ4X3QgKmRhdCwKKwkJCQkgdWludDhfdCAqcmVhZF9lY2MsIHVpbnQ4X3QgKmNhbGNfZWNjKQoreworICBpbnQgaT0wLCBibG9ja0NudD00LCBqLCBlY2NmbGFnLCBjb3VudCwgY29ycmVjdGVkPTA7CisgIGludCBlY2NzaXplID0gKGNvcnJlY3RfYml0cyA9PSA4KSA/IDEzIDogNzsKKyAgaW50IG1vZGUgPSAoY29ycmVjdF9iaXRzID09IDgpID8gMSA6IDA7CisgIHVuc2lnbmVkIGludCBlcnJfbG9jWzhdOworCisgIGlmIChjb3JyZWN0X2JpdHMgPT0gNCkKKyAgICBvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoNChkYXQsIGNhbGNfZWNjKTsKKyAgZWxzZSBpZiAoY29ycmVjdF9iaXRzID09IDgpCisgICAgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDgoZGF0LCBjYWxjX2VjYyk7CisgIGVsc2UKKyAgICByZXR1cm4gLTE7ICAvKiB1bnN1cHBvcnRlZCBudW1iZXIgb2YgY29ycmVjdGlvbiBiaXRzICovCisKKyAgZm9yIChpID0gMDsgaSA8IGJsb2NrQ250OyBpKyspIHsKKyAgICAvKiBjaGVjayBpZiBhbnkgZWNjIGVycm9yICovCisgICAgZWNjZmxhZyA9IDA7CisgICAgZm9yIChqID0gMDsgKGogPCBlY2NzaXplKSAmJiAoZWNjZmxhZyA9PSAwKTsgaisrKQorICAgICAgaWYgKGNhbGNfZWNjW2pdICE9IDApCisJZWNjZmxhZyA9IDE7CisKKyAgICBpZiAoZWNjZmxhZyA9PSAxKSB7CisgICAgICBlY2NmbGFnID0gMDsKKyAgICAgIGZvciAoaiA9IDA7IChqIDwgZWNjc2l6ZSkgJiYgKGVjY2ZsYWcgPT0gMCk7IGorKykKKwlpZiAocmVhZF9lY2Nbal0gIT0gMHhGRikKKwkgIGVjY2ZsYWcgPSAxOworICAgIH0KKworICAgIGlmIChlY2NmbGFnID09IDEpIHsKKyAgICAgIGNvdW50ID0gMDsKKyAgICAgIC8qcHJpbnRrKEtFUk5fSU5GTyAiLi4uYmNoIGNvcnJlY3QoJWQgNTEyIGJ5dGUpXG4iLCBpKzEpOyovCisgICAgICBjb3VudCA9IGRlY29kZV9iY2gobW9kZSwgY2FsY19lY2MsIGVycl9sb2MpOworICAgICAgCisgICAgICAvKgorICAgICAgICogSWYgdW5jb3JyZWN0YWJsZSBlcnJvciBkZXRlY3RlZCBpbiBzdWItcGFnZSwKKyAgICAgICAqIGtlZXAgdW5jb3JyZWN0YWJsZSBmbGFnIHRvIHVwcGVyIGxheWVyCisgICAgICAgKi8KKyAgICAgIGlmKGNvdW50ID09IC0xKQorICAgICAgICBjb3JyZWN0ZWQgPSAtMTsKKyAgICAgIC8qCisgICAgICAgKiBJZiBubyB1bmNvcnJlY3RhYmxlIGVycm9yIHRoZW4gaW5jcmVtZW50CisgICAgICAgKiBjb3JyZWN0ZWQgY291bnQKKyAgICAgICAqLworICAgICAgaWYoY29ycmVjdGVkICE9IC0xKQorICAgICAgICBjb3JyZWN0ZWQgKz0gY291bnQ7CisJCQkKKyAgICAgIGZvciAoaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisJLypwcmludGsoS0VSTl9JTkZPICJlcnJfbG9jPSVkXG4iLCBlcnJfbG9jW2pdKTsqLworICAgICAgICBwcmludGYoImVycl9sb2M9JWRcbiIsIGVycl9sb2Nbal0pOworCWlmIChlcnJfbG9jW2pdIDwgNDA5NikKKwkgIGRhdFtlcnJfbG9jW2pdID4+IDNdIF49IDEgPDwgKGVycl9sb2Nbal0gJiA3KTsKKwkvKiBlbHNlLCBub3QgaW50ZXJlc3RlZCB0byBjb3JyZWN0IGVjYyAqLworICAgICAgfQorCisgICAgfQorCisgICAgY2FsY19lY2MgPSBjYWxjX2VjYyArIGVjY3NpemU7CisgICAgcmVhZF9lY2MgPSByZWFkX2VjYyArIGVjY3NpemU7CisgICAgZGF0ICs9IDUxMjsKKyAgfQorCisgIHJldHVybiBjb3JyZWN0ZWQ7Cit9CisKKy8qIFdyYXBwZXIgZnVuY3Rpb24gZm9yIDQgYml0IEJDSCBjb3JyZWN0aW9uICovCitpbnQgb21hcF9jb3JyZWN0X2RhdGFfYmNoNCh1aW50OF90ICpkYXQsIHVpbnQ4X3QgKnJlYWRfZWNjLCB1aW50OF90ICpjYWxjX2VjYykKK3sKKyAgcmV0dXJuIG9tYXBfY29ycmVjdF9kYXRhX2JjaCg0LCBkYXQsIHJlYWRfZWNjLCBjYWxjX2VjYyk7Cit9CisKKy8qIFdyYXBwZXIgZnVuY3Rpb24gZm9yIDggYml0IEJDSCBjb3JyZWN0aW9uICovCitpbnQgb21hcF9jb3JyZWN0X2RhdGFfYmNoOCh1aW50OF90ICpkYXQsIHVpbnQ4X3QgKnJlYWRfZWNjLCB1aW50OF90ICpjYWxjX2VjYykKK3sKKyAgcmV0dXJuIG9tYXBfY29ycmVjdF9kYXRhX2JjaCg4LCBkYXQsIHJlYWRfZWNjLCBjYWxjX2VjYyk7Cit9CisKKy8qCisgKiBvbWFwX2VuYWJsZV9lY2MgLSBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIGhhcmR3YXJlIGVjYyBmdW5jdGlvbmFsaXR5CisgKiBAbXRkOiAgICAgICAgTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBtb2RlOiAgICAgICBSZWFkL1dyaXRlIG1vZGUKKyAqLwordm9pZCBvbWFwX2VuYWJsZV9od2VjY19iY2g0KHVpbnQzMl90IGJ1c193aWR0aCwgaW50MzJfdCBtb2RlKQoreworICB1aW50MzJfdCBiY2hfbW9kPTA7CisgIHVpbnQzMl90IGRldl93aWR0aCA9IChidXNfd2lkdGg9PTgpPzA6MTsKKyAgdW5zaWduZWQgaW50IGVjY3NpemUxLCBlY2NzaXplMDsKKyAgdW5zaWduZWQgaW50IGVjY19jb25mX3ZhbCA9IDAsIGVjY19zaXplX2NvbmZfdmFsID0gMDsKKworICBzd2l0Y2ggKG1vZGUpIHsKKyAgY2FzZSBOQU5EX0VDQ19SRUFEICAgIDoKKyAgICBlY2NzaXplMSA9IDB4RDsgZWNjc2l6ZTAgPSAweDQ4OworICAgIC8qIEVDQ1NJWkUxPTI2IHwgRUNDU0laRTA9MTIgKi8KKyAgICBlY2Nfc2l6ZV9jb25mX3ZhbCA9IChlY2NzaXplMSA8PCAyMikgfCAoZWNjc2l6ZTAgPDwgMTIpOworCisgICAgLyogRUNDQUxHT1JJVEhNIHwgRUNDQkNIVDggfCBFQ0NXUkFQTU9ERSB8IEVDQzE2QiB8CisgICAgICogRUNDVE9QU0VDVE9SIHwgRUNDQ1MgfCBFQ0MgRW5hYmxlCisgICAgICovCisgICAgZWNjX2NvbmZfdmFsID0gKCgweDAxIDw8IDE2KSB8IChiY2hfbW9kIDw8IDEyKSB8ICgweDA5IDw8IDgpIHwKKwkJICAgIChkZXZfd2lkdGggPDwgNykgfCAoMHgwMyA8PCA0KSB8CisJCSAgICAoMCA8PCAxKSB8ICgweDEpKTsKKyAgICBicmVhazsKKyAgY2FzZSBOQU5EX0VDQ19XUklURSAgIDoKKyAgICBlY2NzaXplMSA9IDB4MjA7IGVjY3NpemUwID0gMHgwMDsKKworICAgIC8qIEVDQ1NJWkUxPTMyIHwgRUNDU0laRTA9MDAgKi8KKyAgICBlY2Nfc2l6ZV9jb25mX3ZhbCA9IChlY2NzaXplMSA8PCAyMikgfCAoZWNjc2l6ZTAgPDwgMTIpOworCisgICAgLyogRUNDQUxHT1JJVEhNIHwgRUNDQkNIVDggfCBFQ0NXUkFQTU9ERSB8IEVDQzE2QiB8CisgICAgICogRUNDVE9QU0VDVE9SIHwgRUNDQ1MgfCBFQ0MgRW5hYmxlCisgICAgICovCisgICAgZWNjX2NvbmZfdmFsID0gKCgweDAxIDw8IDE2KSB8IChiY2hfbW9kIDw8IDEyKSB8ICgweDA2IDw8IDgpIHwKKwkJICAgIChkZXZfd2lkdGggPDwgNykgfCAoMHgwMyA8PCA0KSB8CisJCSAgICAoMCA8PCAxKSB8ICgweDEpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBwcmludGYoIkVycm9yOiBVbnJlY29nbml6ZWQgTW9kZVslZF0hXG4iLCBtb2RlKTsKKyAgICBicmVhazsKKyAgfQorCisgIF9fcmF3X3dyaXRlbCgweDEsIChHUE1DX0VDQ19DT05UUk9MKSk7CisgIF9fcmF3X3dyaXRlbChlY2Nfc2l6ZV9jb25mX3ZhbCwgKEdQTUNfRUNDX1NJWkVfQ09ORklHKSk7CisgIF9fcmF3X3dyaXRlbChlY2NfY29uZl92YWwsIChHUE1DX0VDQ19DT05GSUcpKTsKKyAgX19yYXdfd3JpdGVsKDB4MTAxLCAoR1BNQ19FQ0NfQ09OVFJPTCkpOworfQorCisvKgorICogb21hcF9lbmFibGVfZWNjIC0gVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZSBoYXJkd2FyZSBlY2MgZnVuY3Rpb25hbGl0eQorICogQG10ZDogICAgICAgIE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbW9kZTogICAgICAgUmVhZC9Xcml0ZSBtb2RlCisgKi8KK3ZvaWQgb21hcF9lbmFibGVfaHdlY2NfYmNoOCh1aW50MzJfdCBidXNfd2lkdGgsIGludDMyX3QgbW9kZSkKK3sKKyAgdWludDMyX3QgYmNoX21vZD0xOworICB1aW50MzJfdCBkZXZfd2lkdGggPSAoYnVzX3dpZHRoPT04KT8wOjE7CisgIHVuc2lnbmVkIGludCBlY2NzaXplMSwgZWNjc2l6ZTA7CisgIHVuc2lnbmVkIGludCBlY2NfY29uZl92YWwgPSAwLCBlY2Nfc2l6ZV9jb25mX3ZhbCA9IDA7CisKKyAgc3dpdGNoIChtb2RlKSB7CisgIGNhc2UgTkFORF9FQ0NfUkVBRCAgICA6CisgICAgZWNjc2l6ZTEgPSAweDFBOyBlY2NzaXplMCA9IDB4MTg7CisgICAgLyogRUNDU0laRTE9MjYgfCBFQ0NTSVpFMD0xMiAqLworICAgIGVjY19zaXplX2NvbmZfdmFsID0gKGVjY3NpemUxIDw8IDIyKSB8IChlY2NzaXplMCA8PCAxMik7CisKKyAgICAvKiBFQ0NBTEdPUklUSE0gfCBFQ0NCQ0hUOCB8IEVDQ1dSQVBNT0RFIHwgRUNDMTZCIHwKKyAgICAgKiBFQ0NUT1BTRUNUT1IgfCBFQ0NDUyB8IEVDQyBFbmFibGUKKyAgICAgKi8KKyAgICBlY2NfY29uZl92YWwgPSAoKDB4MDEgPDwgMTYpIHwgKGJjaF9tb2QgPDwgMTIpIHwgKDB4MDQgPDwgOCkgfAorCQkgICAgKGRldl93aWR0aCA8PCA3KSB8ICgweDAzIDw8IDQpIHwKKwkJICAgICgwIDw8IDEpIHwgKDB4MSkpOworICAgIGJyZWFrOworICBjYXNlIE5BTkRfRUNDX1dSSVRFICAgOgorICAgIGVjY3NpemUxID0gMHgyMDsgZWNjc2l6ZTAgPSAweDAwOworCisgICAgLyogRUNDU0laRTE9MzIgfCBFQ0NTSVpFMD0wMCAqLworICAgIGVjY19zaXplX2NvbmZfdmFsID0gKGVjY3NpemUxIDw8IDIyKSB8IChlY2NzaXplMCA8PCAxMik7CisKKyAgICAvKiBFQ0NBTEdPUklUSE0gfCBFQ0NCQ0hUOCB8IEVDQ1dSQVBNT0RFIHwgRUNDMTZCIHwKKyAgICAgKiBFQ0NUT1BTRUNUT1IgfCBFQ0NDUyB8IEVDQyBFbmFibGUKKyAgICAgKi8KKyAgICBlY2NfY29uZl92YWwgPSAoKDB4MDEgPDwgMTYpIHwgKGJjaF9tb2QgPDwgMTIpIHwgKDB4MDYgPDwgOCkgfAorCQkgICAgKGRldl93aWR0aCA8PCA3KSB8ICgweDAzIDw8IDQpIHwKKwkJICAgICgwIDw8IDEpIHwgKDB4MSkpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHByaW50ZigiRXJyb3I6IFVucmVjb2duaXplZCBNb2RlWyVkXSFcbiIsIG1vZGUpOworICAgIGJyZWFrOworICB9CisKKyAgX19yYXdfd3JpdGVsKDB4MSwgKEdQTUNfRUNDX0NPTlRST0wpKTsKKyAgX19yYXdfd3JpdGVsKGVjY19zaXplX2NvbmZfdmFsLCAoR1BNQ19FQ0NfU0laRV9DT05GSUcpKTsKKyAgX19yYXdfd3JpdGVsKGVjY19jb25mX3ZhbCwgKEdQTUNfRUNDX0NPTkZJRykpOworICBfX3Jhd193cml0ZWwoMHgxMDEsIChHUE1DX0VDQ19DT05UUk9MKSk7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvb21hcF9iY2hfZGVjb2Rlci5jIGIveC1sb2FkZXIvbGliL29tYXBfYmNoX2RlY29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzdlOTNjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL29tYXBfYmNoX2RlY29kZXIuYwpAQCAtMCwwICsxLDQwNSBAQAorLyoKKyAqIGxpYi9vbWFwX2JjaF9kZWNvZGVyLmMKKyAqCisgKiBXaG9sZSBCQ0ggRUNDIERlY29kZXIgKFBvc3QgaGFyZHdhcmUgZ2VuZXJhdGVkIHN5bmRyb21lIGRlY29kaW5nKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIEF1dGhvcjogU3VrdW1hciBHaG9yYWkgPHMtZ2hvcmFpQHRpLmNvbQorICoJCSAgIE1pY2hhZWwgRmlsbGluZ2VyIDxtLWZpbGxpbmdlckB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgImFzIGlzIiBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjZGVmaW5lIHByaW50ayAvL3ByaW50ZgorCisjZGVmaW5lIG1tCQkxMworI2RlZmluZSBra19zaG9ydGVuCTQwOTYKKyNkZWZpbmUgbm4JCTgxOTEJLyogTGVuZ3RoIG9mIGNvZGV3b3JkLCBuID0gMioqbW0gLSAxICovCisKKyNkZWZpbmUgUFBQCTB4MjAxQgkvKiBQcmltYXJ5IFBvbHlub21pYWwgOiB4XjEzICsgeF40ICsgeF4zICsgeCArIDEgKi8KKyNkZWZpbmUgUAkweDAwMUIJLyogV2l0aCBvbWl0dGVkIHheMTMgKi8KKyNkZWZpbmUgUE9MWQkxMgkvKiBkZWdyZWUgb2YgdGhlIHByaW1hcnkgUG9seW5vbWlhbCBsZXNzIG9uZSAqLworCisvKioKKyAqIG1weV9tb2RfZ2YgLSBHQUxPSVMgZmllbGQgbXVsdGlwbGllcgorICogSW5wdXQgIDogQSh4KSwgQih4KQorICogT3V0cHV0IDogQSh4KSpCKHgpIG1vZCBQKHgpCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbXB5X21vZF9nZih1bnNpZ25lZCBpbnQgYSwgdW5zaWduZWQgaW50IGIpCit7CisJdW5zaWduZWQgaW50IFIgPSAwOworCXVuc2lnbmVkIGludCBSMSA9IDA7CisJdW5zaWduZWQgaW50IGsgPSAwOworCisJZm9yIChrID0gMDsgayA8IG1tOyBrKyspIHsKKworCQlSID0gKFIgPDwgMSkgJiAweDFGRkU7CisJCWlmIChSMSA9PSAxKQorCQkJUiBePSBQOworCisJCWlmICgoKGEgPj4gKFBPTFkgLSBrKSkgJiAxKSA9PSAxKQorCQkJUiBePSBiOworCisJCWlmIChrIDwgUE9MWSkKKwkJCVIxID0gKFIgPj4gUE9MWSkgJiAxOworCX0KKwlyZXR1cm4gUjsKK30KKworLyoqCisgKiBjaGllbiAtIENISUVOIHNlYXJjaAorICoKKyAqIEBsb2NhdGlvbiAtIEVycm9yIGxvY2F0aW9uIHZlY3RvciBwb2ludGVyCisgKgorICogSW5wdXRzICA6IEVMUCh6KQorICoJICAgICBOby4gb2YgZm91bmQgZXJyb3JzCisgKgkgICAgIFNpemUgb2YgaW5wdXQgY29kZXdvcmQKKyAqIE91dHB1dHMgOiBVcCB0byA4IGxvY2F0aW9ucworICoJICAgICBOby4gb2YgZXJyb3JzCisgKi8KK3N0YXRpYyBpbnQgY2hpZW4odW5zaWduZWQgaW50IHNlbGVjdF80XzgsIGludCBlcnJfbnVtcywKKwkJCQl1bnNpZ25lZCBpbnQgZXJyW10sIHVuc2lnbmVkIGludCAqbG9jYXRpb24pCit7CisJaW50IGksIGNvdW50OyAvKiBOdW1iZXIgb2YgZGVjdGVjdGVkIGVycm9ycyAqLworCS8qIENvbnRhaW5zIGFjY3VtdWxhdGlvbiBvZiBldmFsdWF0aW9uIGF0IHheaSAoaToxLT44KSAqLworCXVuc2lnbmVkIGludCBnYW1tYXNbOF07CisJdW5zaWduZWQgaW50IGFscGhhOworCXVuc2lnbmVkIGludCBiaXQsIGVjY19iaXRzOworCXVuc2lnbmVkIGludCBlbHBfc3VtOworCisJZWNjX2JpdHMgPSAoc2VsZWN0XzRfOCA9PSAwKSA/IDUyIDogMTA0OworCQorCS8qIFN0YXJ0IGV2YWx1YXRpb24gYXQgQWxwaGEqKjgxOTIgYW5kIGRlY3JlYXNpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlnYW1tYXNbaV0gPSBlcnJbaV07CisKKwljb3VudCA9IDA7CisJZm9yIChpID0gMTsgKGkgPD0gbm4pICYmIChjb3VudCA8IGVycl9udW1zKTsgaSsrKSB7CisKKwkJLyogUmVzdWx0IG9mIGV2YWx1YXRpb24gYXQgcm9vdCAqLworCQllbHBfc3VtID0gMSBeIGdhbW1hc1swXSBeIGdhbW1hc1sxXSBeCisJCQkJZ2FtbWFzWzJdIF4gZ2FtbWFzWzNdIF4KKwkJCQlnYW1tYXNbNF0gXiBnYW1tYXNbNV0gXgorCQkJCWdhbW1hc1s2XSBeIGdhbW1hc1s3XTsKKworCQlhbHBoYSA9IFBQUCA+PiAxOworCQlnYW1tYXNbMF0gPSBtcHlfbW9kX2dmKGdhbW1hc1swXSwgYWxwaGEpOworCQlhbHBoYSA9IG1weV9tb2RfZ2YoYWxwaGEsIChQUFAgPj4gMSkpOwkvKiB4IGFscGhoYV4tMiAqLworCQlnYW1tYXNbMV0gPSBtcHlfbW9kX2dmKGdhbW1hc1sxXSwgYWxwaGEpOworCQlhbHBoYSA9IG1weV9tb2RfZ2YoYWxwaGEsIChQUFAgPj4gMSkpOwkvKiB4IGFscGhoYV4tMiAqLworCQlnYW1tYXNbMl0gPSBtcHlfbW9kX2dmKGdhbW1hc1syXSwgYWxwaGEpOworCQlhbHBoYSA9IG1weV9tb2RfZ2YoYWxwaGEsIChQUFAgPj4gMSkpOwkvKiB4IGFscGhoYV4tMyAqLworCQlnYW1tYXNbM10gPSBtcHlfbW9kX2dmKGdhbW1hc1szXSwgYWxwaGEpOworCQlhbHBoYSA9IG1weV9tb2RfZ2YoYWxwaGEsIChQUFAgPj4gMSkpOwkvKiB4IGFscGhoYV4tNCAqLworCQlnYW1tYXNbNF0gPSBtcHlfbW9kX2dmKGdhbW1hc1s0XSwgYWxwaGEpOworCQlhbHBoYSA9IG1weV9tb2RfZ2YoYWxwaGEsIChQUFAgPj4gMSkpOwkvKiB4IGFscGhoYV4tNSAqLworCQlnYW1tYXNbNV0gPSBtcHlfbW9kX2dmKGdhbW1hc1s1XSwgYWxwaGEpOworCQlhbHBoYSA9IG1weV9tb2RfZ2YoYWxwaGEsIChQUFAgPj4gMSkpOwkvKiB4IGFscGhoYV4tNiAqLworCQlnYW1tYXNbNl0gPSBtcHlfbW9kX2dmKGdhbW1hc1s2XSwgYWxwaGEpOworCQlhbHBoYSA9IG1weV9tb2RfZ2YoYWxwaGEsIChQUFAgPj4gMSkpOwkvKiB4IGFscGhoYV4tNyAqLworCQlnYW1tYXNbN10gPSBtcHlfbW9kX2dmKGdhbW1hc1s3XSwgYWxwaGEpOworCisJCWlmIChlbHBfc3VtID09IDApIHsKKwkJCS8qIGNhbGN1bGF0ZSBsb2NhdGlvbiAqLworCQkJYml0ID0gKChpLTEpICYgfjcpfCg3LSgoaS0xKSAmIDcpKTsKKwkJCWxvY2F0aW9uW2NvdW50KytdID0ga2tfc2hvcnRlbiAtIChiaXQgLSAyICogZWNjX2JpdHMpIC0gMTsKKwkJfQorCX0KKworCS8qIEZhaWx1cmU6IE5vLiBvZiBkZXRlY3RlZCBlcnJvcnMgIT0gTm8uIG9yIGNvcnJlY3RlZCBlcnJvcnMgKi8KKwlpZiAoY291bnQgIT0gZXJyX251bXMpIHsKKwkJY291bnQgPSAtMTsKKwkJLyoJcHJpbnRrKEtFUk5fSU5GTyAiQkNIIGRlY29kaW5nIGZhaWxlZFxuIik7Ki8KKwl9CisJLyoKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJWQgIiwgbG9jYXRpb25baV0pOworCSovCisJcmV0dXJuIGNvdW50OworfQorCisvKiBzeW5kIDogMTYgU3luZHJvbWVzCisgKiByZXR1cm46IGdhbWFhcyAtIENvZWZmaWNpZW50cyB0byB0aGUgZXJyb3IgcG9seW5vbWlhbAorICogcmV0dXJuOiA6IE51bWJlciBvZiBkZXRlY3RlZCBlcnJvcnMKKyovCitzdGF0aWMgdW5zaWduZWQgaW50IGJlcmxla2FtcCh1bnNpZ25lZCBpbnQgc2VsZWN0XzRfOCwKKwkJCXVuc2lnbmVkIGludCBzeW5kW10sIHVuc2lnbmVkIGludCBlcnJbXSkKK3sKKwlpbnQgbG9vcCwgaXRlcmF0aW9uOworCXVuc2lnbmVkIGludCBMTCA9IDA7CQkvKiBEZXRlY3RlZCBlcnJvcnMgKi8KKwl1bnNpZ25lZCBpbnQgZCA9IDA7CS8qIERpc3RhbmNlIGJldHdlZW4gU3luZHJvbWVzIGFuZCBFTFBbbl0oeikgKi8KKwl1bnNpZ25lZCBpbnQgaW52ZCA9IDA7CQkvKiBJbnZlcnNlIG9mIGQgKi8KKwkvKiBJbnRlcm1lZGlhdGUgRUxQW25dKHopLgorCSAqIEZpbmFsIEVMUFtuXSh6KSBpcyBFcnJvciBMb2NhdGlvbiBQb2x5bm9taWFsCisJICovCisJdW5zaWduZWQgaW50IGdhbW1hc1sxNl07CisJLyogSW50ZXJtZWRpYXRlIG5vcm1hbGl6ZWQgRUxQW25dKHopIDogRFtuXSh6KSAqLworCXVuc2lnbmVkIGludCBEWzE2XTsKKwkvKiBUZW1wb3JhcnkgdmFsdWUgdGhhdCBob2xkcyBhbiBFTFBbbl0oeikgY29lZmZpY2llbnQgKi8KKwl1bnNpZ25lZCBpbnQgbmV4dF9nYW1tYSA9IDA7CisKKwlpbnQgZSA9IDA7CisJdW5zaWduZWQgaW50IHNpZ24gPSAwOworCXVuc2lnbmVkIGludCB1ID0gMDsKKwl1bnNpZ25lZCBpbnQgdiA9IDA7CisJdW5zaWduZWQgaW50IEMxID0gMCwgQzIgPSAwOworCXVuc2lnbmVkIGludCBzcyA9IDA7CisJdW5zaWduZWQgaW50IHRtcF92ID0gMCwgdG1wX3MgPSAwOworCXVuc2lnbmVkIGludCB0bXBfcG9seTsKKworCS8qLS0tLS0tLS0tLS0tLS0gU3RlcCAwIC0tLS0tLS0tLS0tLS0tLS0tLSovCisJZm9yIChsb29wID0gMDsgbG9vcCA8IDE2OyBsb29wKyspIHsKKwkJZ2FtbWFzW2xvb3BdID0gMDsKKwkJRFtsb29wXSA9IDA7CisJfQorCisJZ2FtbWFzWzBdID0gMTsKKwlEWzFdID0gMTsKKworCWl0ZXJhdGlvbiA9IDA7CisJTEwgPSAwOworCXdoaWxlICgoaXRlcmF0aW9uIDwgKChzZWxlY3RfNF84KzEpKjIqNCkpICYmCisJCQkoTEwgPD0gKChzZWxlY3RfNF84KzEpKjQpKSkgeworCisJICAvKnByaW50ayhLRVJOX0lORk8gIlxuSXRlcmF0aW9uLi4uLi4uLi4uLi4uLiVkXG4iLCBpdGVyYXRpb24pOyovCisJCWQgPSAwOworCQkvKiBTdGVwOiAwICovCisJCWZvciAobG9vcCA9IDA7IGxvb3AgPD0gTEw7IGxvb3ArKykgeworCQkJdG1wX3BvbHkgPSBtcHlfbW9kX2dmKAorCQkJCQlnYW1tYXNbbG9vcF0sIHN5bmRbaXRlcmF0aW9uIC0gbG9vcF0pOworCQkJZCBePSB0bXBfcG9seTsKKwkJCS8qcHJpbnRrKEtFUk5fSU5GTyAiJTAyZC4gcz0wIExMPSV4IHBvbHkgJXhcbiIsCisJCQkgIGxvb3AsIExMLCB0bXBfcG9seSk7Ki8KKwkJfQorCisJCS8qIFN0ZXAgMTogMSBjeWNsZSBvbmx5IHRvIHBlcmZvcm0gaW52ZXJzaW9uICovCisJCXYgPSBkIDw8IDE7CisJCWUgPSAtMTsKKwkJc2lnbiA9IDE7CisJCXNzID0gMHgyMDAwOworCQlpbnZkID0gMDsKKwkJdSA9IFBQUDsKKwkJZm9yIChsb29wID0gMDsgKGQgIT0gMCkgJiYgKGxvb3AgPD0gKDIgKiBQT0xZKSk7IGxvb3ArKykgeworCQkgIC8qcHJpbnRrKEtFUk5fSU5GTyAiJTAyZC4gcz0xIExMPSV4IHBvbHkgTlVMTFxuIiwKKwkJICAgIGxvb3AsIExMKTsqLworCQkJQzEgPSAodiA+PiAxMykgJiAxOworCQkJQzIgPSBDMSAmIHNpZ247CisKKwkJCXNpZ24gXj0gQzIgXiAoZSA9PSAwKTsKKworCQkJdG1wX3YgPSB2OworCQkJdG1wX3MgPSBzczsKKworCQkJaWYgKEMxID09IDEpIHsKKwkJCQl2IF49IHU7CisJCQkJc3MgXj0gaW52ZDsKKwkJCX0KKwkJCXYgPSAodiA8PCAxKSAmIDB4M0ZGRjsKKwkJCWlmIChDMiA9PSAxKSB7CisJCQkJdSA9IHRtcF92OworCQkJCWludmQgPSB0bXBfczsKKwkJCQllID0gLWU7CisJCQl9CisJCQlpbnZkID4+PSAxOworCQkJZS0tOworCQl9CisKKwkJZm9yIChsb29wID0gMDsgKGQgIT0gMCkgJiYgKGxvb3AgPD0gKGl0ZXJhdGlvbiArIDEpKTsgbG9vcCsrKSB7CisJCQkvKiBTdGVwIDIKKwkJCSAqIEludGVybGVhdmVkIHdpdGggU3RlcCAzLCBpZiBMPChuLWspCisJCQkgKiBpbnZkOiBVcGRhdGUgb2YgRUxQW25dKHopID0gRUxQW24tMV0oeikgLSBkLkRbbi0xXSh6KQorCQkJICovCisKKwkJCS8qIEhvbGRzIHZhbHVlIG9mIEVMUCBjb2VmZmljaWVudCB1bnRpbCBwcmVjZWRlbnQKKwkJCSAqIHZhbHVlIGRvZXMgbm90IGhhdmUgdG8gYmUgdXNlZCBhbnltb3JlCisJCQkgKi8KKwkJCXRtcF9wb2x5ID0gbXB5X21vZF9nZihkLCBEW2xvb3BdKTsKKwkJCS8qcHJpbnRrKEtFUk5fSU5GTyAiJTAyZC4gcz0yIExMPSV4IHBvbHkgJXhcbiIsCisJCQkgIGxvb3AsIExMLCB0bXBfcG9seSk7Ki8KKworCQkJbmV4dF9nYW1tYSA9IGdhbW1hc1tsb29wXSBeIHRtcF9wb2x5OworCQkJaWYgKCgyICogTEwpIDwgKGl0ZXJhdGlvbiArIDEpKSB7CisJCQkJLyogSW50ZXJsZWF2aW5nIHdpdGggU3RlcCAzCisJCQkJICogZm9yIHBhcmFsbGVsaXplZCB1cGRhdGUgb2YgRUxQKHopIGFuZCBEKHopCisJCQkJICovCisJCQl9IGVsc2UgeworCQkJCS8qIFVwZGF0ZSBvZiBFTFAoeikgb25seSAtPiBzdGF5IGluIFN0ZXAgMiAqLworCQkJCWdhbW1hc1tsb29wXSA9IG5leHRfZ2FtbWE7CisJCQkJaWYgKGxvb3AgPT0gKGl0ZXJhdGlvbiArIDEpKSB7CisJCQkJCS8qIHRvIHN0ZXAgNCAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCS8qIFN0ZXAgMworCQkJICogQWx3YXlzIGludGVybGVhdmVkIHdpdGggU3RlcCAyIChjYXNlIHdoZW4gTDwobi1rKSkKKwkJCSAqIFVwZGF0ZSBvZiBEW24tMV0oeikgPSBFTFBbbi0xXSh6KS9kCisJCQkgKi8KKwkJCURbbG9vcF0gPSBtcHlfbW9kX2dmKGdhbW1hc1tsb29wXSwgaW52ZCk7CisJCQkvKnByaW50ayhLRVJOX0lORk8gIiUwMmQuIHM9MyBMTD0leCBwb2x5ICV4XG4iLAorCQkJICBsb29wLCBMTCwgRFtsb29wXSk7Ki8KKworCQkJLyogQ2FuIHNhZmVseSB1cGRhdGUgRUxQW25dKHopICovCisJCQlnYW1tYXNbbG9vcF0gPSBuZXh0X2dhbW1hOworCisJCQlpZiAobG9vcCA9PSAoaXRlcmF0aW9uICsgMSkpIHsKKwkJCQkvKiBJZiB1cGRhdGUgZmluaXNoZWQgKi8KKwkJCQlMTCA9IGl0ZXJhdGlvbiAtIExMICsgMTsKKwkJCQkvKiB0byBzdGVwIDQgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIEVsc2UsIGludGVybGVhdmluZyB0byBzdGVwIDIqLworCQl9CisKKwkJLyogU3RlcCA0OiBVcGRhdGUgRCh6KTogaTowLT5MICovCisJCS8qIEZpbmFsIHVwZGF0ZSBvZiBEW25dKHopID0gRFtuXSh6KS56Ki8KKwkJZm9yIChsb29wID0gMDsgbG9vcCA8IDE1OyBsb29wKyspIC8qIExlZnQgU2hpZnQgKi8KKwkJCURbMTUgLSBsb29wXSA9IERbMTQgLSBsb29wXTsKKworCQlEWzBdID0gMDsKKworCQlpdGVyYXRpb24rKzsKKwl9IC8qIHdoaWxlICovCisKKwkvKiBQcm9jZXNzaW5nIGZpbmlzaGVkLCBjb3B5IEVMUCB0byBmaW5hbCByZWdpc3RlcnMgOiAwLT4ydC0xKi8KKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKQorCQllcnJbbG9vcF0gPSBnYW1tYXNbbG9vcCsxXTsKKworCS8qcHJpbnRrKEtFUk5fSU5GTyAiXG4gRXJyIHBvbHk6Iik7CisJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiMHgleCAiLCBlcnJbbG9vcF0pOworCSovCisJcmV0dXJuIExMOworfQorCisvKgorICogc3luZHJvbWUgLSBHZW5lcmF0ZSBzeW5kcm9tZSBjb21wb25lbnRzIGZyb20gaHcgZ2VuZXJhdGUgc3luZHJvbWUKKyAqIHIoeCkgPSBjKHgpICsgZSh4KQorICogcyh4KSA9IGMoeCkgbW9kIGcoeCkgKyBlKHgpIG1vZCBnKHgpID0gIGUoeCkgbW9kIGcoeCkKKyAqIHNvIHJlY2VpdmVyIGNoZWNrcyBpZiB0aGUgc3luZHJvbWUgcyh4KSA9IHIoeCkgbW9kIGcoeCkgaXMgZXF1YWwgdG8gemVyby4KKyAqIHVuc2lnbmVkIGludCBzWzE2XTsgLSBTeW5kcm9tZXMKKyAqLworc3RhdGljIHZvaWQgc3luZHJvbWUodW5zaWduZWQgaW50IHNlbGVjdF80XzgsCisJCQkJCXVuc2lnbmVkIGNoYXIgKmVjYywgdW5zaWduZWQgaW50IHN5bltdKQoreworCXVuc2lnbmVkIGludCBrLCBsLCB0OworCXVuc2lnbmVkIGludCBhbHBoYV9iaXQsIFJfYml0OworCWludCBlY2NfcG9zLCBlY2NfbWluOworCisJLyogMnQtMSA9IDE1IChmb3IgdD04KSBtaW5pbWFsIHBvbHlub21pYWxzIG9mIHRoZSBmaXJzdCAxNSBwb3dlcnMgb2YgYQorCSAqIHByaW1pdGl2ZSBlbGVtbWFudHMgb2YgR0YobSk7IEV2ZW4gcG93ZXJzIG1pbmltYWwgcG9seW5vbWlhbHMgYXJlCisJICogZHVwbGljYXRlIG9mIG9kZCBwb3dlcnMnIG1pbmltYWwgcG9seW5vbWlhbHMuCisJICogT2RkIHBvd2VycyBvZiBhbHBoYSAoMSB0byAxNSkKKwkgKi8KKwl1bnNpZ25lZCBpbnQgcG93X2FscGhhWzhdID0gezB4MDAwMiwgMHgwMDA4LCAweDAwMjAsIDB4MDA4MCwKKwkJCQkgMHgwMjAwLCAweDA4MDAsIDB4MDAxQiwgMHgwMDZDfTsKKworCS8qcHJpbnRrKEtFUk5fSU5GTyAiXG4gRUNDWzAuLm5dOiAiKTsKKwlmb3IgKGsgPSAwOyBrIDwgMTM7IGsrKykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiMHgleCAiLCBlY2Nba10pOworCSovCisKKwlpZiAoc2VsZWN0XzRfOCA9PSAwKSB7CisJCXQgPSA0OworCQllY2NfcG9zID0gNTU7IC8qIGJpdHMoNTItYml0cyk6IDU1LT40ICovCisJCWVjY19taW4gPSA0OworCX0gZWxzZSB7CisJCXQgPSA4OworCQllY2NfcG9zID0gMTAzOyAvKiBiaXRzOiAxMDMtPjAgKi8KKwkJZWNjX21pbiA9IDA7CisJfQorCisJLyogdG90YWwgbnVtYmJlciBvZiBzeW5kcm9tIHRvIGJlIHVzZWQgaXMgMnQgKi8KKwkvKiBTdGVwMTogY2FsY3VsYXRlIHRoZSBvZGQgc3luZHJvbWUocykgKi8KKwlSX2JpdCA9ICgoZWNjW2VjY19wb3MvOF0gPj4gKDcgLSBlY2NfcG9zJTgpKSAmIDEpOworCWVjY19wb3MtLTsKKwlmb3IgKGsgPSAwOyBrIDwgdDsgaysrKQorCQlzeW5bMiAqIGtdID0gUl9iaXQ7CisKKwl3aGlsZSAoZWNjX3BvcyA+PSBlY2NfbWluKSB7CisJCVJfYml0ID0gKChlY2NbZWNjX3Bvcy84XSA+PiAoNyAtIGVjY19wb3MlOCkpICYgMSk7CisJCWVjY19wb3MtLTsKKworCQlmb3IgKGsgPSAwOyBrIDwgdDsgaysrKSB7CisJCQkvKiBBY2N1bXVsYXRlIHZhbHVlIG9mIHheaSBhdCBhbHBoYV4oMmsrMSkgKi8KKwkJCWlmIChSX2JpdCA9PSAxKQorCQkJCXN5blsyKmtdIF49IHBvd19hbHBoYVtrXTsKKworCQkJLyogQ29tcHV0ZSBhKiooMmsrMSksIHVzaW5nIExTRlIgKi8KKwkJCWZvciAobCA9IDA7IGwgPCAoMiAqIGsgKyAxKTsgbCsrKSB7CisJCQkJYWxwaGFfYml0ID0gKHBvd19hbHBoYVtrXSA+PiBQT0xZKSAmIDE7CisJCQkJcG93X2FscGhhW2tdID0gKHBvd19hbHBoYVtrXSA8PCAxKSAmIDB4MUZGRjsKKwkJCQlpZiAoYWxwaGFfYml0ID09IDEpCisJCQkJCXBvd19hbHBoYVtrXSBePSBQOworCQkJfQorCQl9CisJfQorCisJLyogU3RlcDI6IGNhbGN1bGF0ZSB0aGUgZXZlbiBzeW5kcm9tZShzKQorCSAqIENvbXB1dGUgUyhhKSwgd2hlcmUgYSBpcyBhbiBldmVuIHBvd2VyIG9mIGFscGhhCisJICogRXZlbnJ5IGV2ZW4gcG93ZXIgb2YgcHJpbWl0aXZlIGVsZW1lbnQgaGFzIHRoZSBzYW1lIG1pbmltYWwKKwkgKiBwb2x5bm9taWFsIGFzIHNvbWUgb2RkIHBvd2VyIG9mIGVsZW1ldHMuCisJICogQW5kIGJhc2VkIG9uIFMoYV4yKSA9IFNeMihhKQorCSAqLworCWZvciAoayA9IDA7IGsgPCB0OyBrKyspCisJCXN5blsyKmsrMV0gPSBtcHlfbW9kX2dmKHN5bltrXSwgc3luW2tdKTsKKworCS8qcHJpbnRrKEtFUk5fSU5GTyAiXG4gU3luZHJvbWVzOiAiKTsKKwlmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykKKwlwcmludGsoS0VSTl9JTkZPICIweCV4ICIsIHN5bltrXSk7Ki8KK30KKworLyoqCisgKiBkZWNvZGVfYmNoIC0gQkNIIGRlY29kZXIgZm9yIDQtIGFuZCA4LWJpdCBlcnJvciBjb3JyZWN0aW9uCisgKgorICogQGVjYyAtIEVDQyBzeW5kcm9tZSBnZW5lcmF0ZWQgYnkgaHcgQkNIIGVuZ2luZQorICogQGVycl9sb2MgLSBwb2ludGVyIHRvIGVycm9yIGxvY2F0aW9uIGFycmF5CisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIHBvc3Qgc3lkcm9tZSBnZW5lcmF0aW9uIChodyBnZW5lcmF0ZWQpIGRlY29kaW5nCisgKiBmb3I6LQorICogRGltZW5zaW9uIG9mIEdhbG9pc2UgRmllbGQ6IG0gPSAxMworICogTGVuZ3RoIG9mIGNvZGV3b3JkOiBuID0gMioqbSAtIDEKKyAqIE51bWJlciBvZiBlcnJvcnMgdGhhdCBjYW4gYmUgY29ycmVjdGVkOiA0LSBvciA4LWJpdHMKKyAqIExlbmd0aCBvZiBpbmZvcm1hdGlvbiBiaXQ6IGtrID0gbm4gLSBycgorICovCitpbnQgZGVjb2RlX2JjaChpbnQgc2VsZWN0XzRfOCwgdW5zaWduZWQgY2hhciAqZWNjLCB1bnNpZ25lZCBpbnQgKmVycl9sb2MpCit7CisgICAgICAgIGludCBub19vZl9lcnIsIGk7CisJdW5zaWduZWQgaW50IHN5blsxNl07CS8qIDE2IFN5bmRyb21lcyAqLworCXVuc2lnbmVkIGludCBlcnJfcG9seVs4XTsKKwkvKiBDb2VmZmljaWVudHMgdG8gdGhlIGVycm9yIHBvbHlub21pYWwKKwkgKiBFTFAoeCkgPSAxICsgZXJyMC54ICsgZXJyMS54XjIgKyAuLi4gKyBlcnI3LnheOAorCSAqLworCisJLyogcGVyZm9ybSBtYW51YWwgaW5pdGlhbGl6YXRpb24gdG8gYXZvaWQgbWVtc2V0ICovCisJZm9yIChpPTA7IGk8MTY7IGkrKykgeworCSAgc3luW2ldID0gMDsKKwkgIGlmIChpPDgpCisJICAgIGVycl9wb2x5W2ldID0gMDsKKwl9CisKKwkvKiBEZWNvdGluZyBpbnZvbGVzIHRocmVlIHN0ZXBzCisJICogMS4gQ29tcHV0ZSB0aGUgc3luZHJvbSBmcm9tIHRlaCByZWNlaXZlZCBjb2Rld29yZCwKKwkgKiAyLiBGaW5kIHRoZSBlcnJvciBsb2NhdGlvbiBwb2x5bm9taWFsIGZyb20gYSBzZXQgb2YgZXF1YXRpb25zCisJICogICAgIGRlcml2ZWQgZnJvbSB0aGUgc3luZHJvbWUsCisJICogMy4gVXNlIHRoZSBlcnJvciBsb2NhdGlvbiBwb2x5bm9taWFsIHRvIGlkZW50aWZ5IGVycmFudHMgYml0cywKKwkgKgorCSAqIEFuZCBjb3JyZWN0dGlvbiBkb25lIGJ5IGJpdCBmbGlwcyB1c2luZyBlcnJvciBsb2NhaXRvbiBhbmQgZXhwZWN0ZWQKKwkgKiB0byBiZSBvdXRzZWlkZSBvZiB0aGlzIGltcGxlbWVudGF0aW9uLgorCSAqLworCXN5bmRyb21lKHNlbGVjdF80XzgsIGVjYywgc3luKTsKKwlub19vZl9lcnIgPSBiZXJsZWthbXAoc2VsZWN0XzRfOCwgc3luLCBlcnJfcG9seSk7CisJaWYgKG5vX29mX2VyciA8PSAoNCA8PCBzZWxlY3RfNF84KSkKKwkJbm9fb2ZfZXJyID0gY2hpZW4oc2VsZWN0XzRfOCwgbm9fb2ZfZXJyLCBlcnJfcG9seSwgZXJyX2xvYyk7CisKKwlyZXR1cm4gbm9fb2ZfZXJyOworfQorRVhQT1JUX1NZTUJPTChkZWNvZGVfYmNoKTsKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9wcmludGYuYyBiL3gtbG9hZGVyL2xpYi9wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWQyMmZjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL3ByaW50Zi5jCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKgorICogQmFzZWQgb24gdGhlIGZvbGxvd2luZyBmaWxlOgorICogIGxpbnV4L2xpYi92c3ByaW50Zi5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisvKiB2c3ByaW50Zi5jIC0tIExhcnMgV2lyemVuaXVzICYgTGludXMgVG9ydmFsZHMuICovCisvKgorICogV2lyemVuaXVzIHdyb3RlIHRoaXMgcG9ydGFibHksIFRvcnZhbGRzIGZ1Y2tlZCBpdCB1cCA6LSkKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfUFJJTlRGCisgCisvKiB3ZSB1c2UgdGhpcyBzbyB0aGF0IHdlIGNhbiBkbyB3aXRob3V0IHRoZSBjdHlwZSBsaWJyYXJ5ICovCisjZGVmaW5lIGlzX2RpZ2l0KGMpCSgoYykgPj0gJzAnICYmIChjKSA8PSAnOScpCisKK3NpemVfdCBzdHJubGVuKGNvbnN0IGNoYXIgKiBzLCBzaXplX3QgY291bnQpCit7CisJY29uc3QgY2hhciAqc2M7CisKKwlmb3IgKHNjID0gczsgY291bnQtLSAmJiAqc2MgIT0gJ1wwJzsgKytzYykKKwkJLyogbm90aGluZyAqLzsKKwlyZXR1cm4gc2MgLSBzOworfQorCitzdGF0aWMgaW50IHNraXBfYXRvaShjb25zdCBjaGFyICoqcykKK3sKKwlpbnQgaT0wOworCisJd2hpbGUgKGlzX2RpZ2l0KCoqcykpCisJCWkgPSBpKjEwICsgKigoKnMpKyspIC0gJzAnOworCXJldHVybiBpOworfQorCisjZGVmaW5lIFpFUk9QQUQJMQkJLyogcGFkIHdpdGggemVybyAqLworI2RlZmluZSBTSUdOCTIJCS8qIHVuc2lnbmVkL3NpZ25lZCBsb25nICovCisjZGVmaW5lIFBMVVMJNAkJLyogc2hvdyBwbHVzICovCisjZGVmaW5lIFNQQUNFCTgJCS8qIHNwYWNlIGlmIHBsdXMgKi8KKyNkZWZpbmUgTEVGVAkxNgkJLyogbGVmdCBqdXN0aWZpZWQgKi8KKyNkZWZpbmUgU1BFQ0lBTAkzMgkJLyogMHggKi8KKyNkZWZpbmUgTEFSR0UJNjQJCS8qIHVzZSAnQUJDREVGJyBpbnN0ZWFkIG9mICdhYmNkZWYnICovCisKKyNkZWZpbmUgZG9fZGl2KG4sYmFzZSkgKHsgXAoraW50IF9fcmVzOyBcCitfX3JlcyA9ICgodW5zaWduZWQgbG9uZykgbikgJSAodW5zaWduZWQpIGJhc2U7IFwKK24gPSAoKHVuc2lnbmVkIGxvbmcpIG4pIC8gKHVuc2lnbmVkKSBiYXNlOyBcCitfX3JlczsgfSkKKworc3RhdGljIGNoYXIgKiBudW1iZXIoY2hhciAqIHN0ciwgbG9uZyBudW0sIGludCBiYXNlLCBpbnQgc2l6ZSwgaW50IHByZWNpc2lvbgorCSxpbnQgdHlwZSkKK3sKKwljaGFyIGMsc2lnbix0bXBbNjZdOworCWNvbnN0IGNoYXIgKmRpZ2l0cz0iMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKwlpbnQgaTsKKworCWlmICh0eXBlICYgTEFSR0UpCisJCWRpZ2l0cyA9ICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOworCWlmICh0eXBlICYgTEVGVCkKKwkJdHlwZSAmPSB+WkVST1BBRDsKKwlpZiAoYmFzZSA8IDIgfHwgYmFzZSA+IDM2KQorCQlyZXR1cm4gMDsKKwljID0gKHR5cGUgJiBaRVJPUEFEKSA/ICcwJyA6ICcgJzsKKwlzaWduID0gMDsKKwlpZiAodHlwZSAmIFNJR04pIHsKKwkJaWYgKG51bSA8IDApIHsKKwkJCXNpZ24gPSAnLSc7CisJCQludW0gPSAtbnVtOworCQkJc2l6ZS0tOworCQl9IGVsc2UgaWYgKHR5cGUgJiBQTFVTKSB7CisJCQlzaWduID0gJysnOworCQkJc2l6ZS0tOworCQl9IGVsc2UgaWYgKHR5cGUgJiBTUEFDRSkgeworCQkJc2lnbiA9ICcgJzsKKwkJCXNpemUtLTsKKwkJfQorCX0KKwlpZiAodHlwZSAmIFNQRUNJQUwpIHsKKwkJaWYgKGJhc2UgPT0gMTYpCisJCQlzaXplIC09IDI7CisJCWVsc2UgaWYgKGJhc2UgPT0gOCkKKwkJCXNpemUtLTsKKwl9CisJaSA9IDA7CisJaWYgKG51bSA9PSAwKQorCQl0bXBbaSsrXT0nMCc7CisJZWxzZSB3aGlsZSAobnVtICE9IDApCisJCXRtcFtpKytdID0gZGlnaXRzW2RvX2RpdihudW0sYmFzZSldOworCWlmIChpID4gcHJlY2lzaW9uKQorCQlwcmVjaXNpb24gPSBpOworCXNpemUgLT0gcHJlY2lzaW9uOworCWlmICghKHR5cGUmKFpFUk9QQUQrTEVGVCkpKQorCQl3aGlsZShzaXplLS0+MCkKKwkJCSpzdHIrKyA9ICcgJzsKKwlpZiAoc2lnbikKKwkJKnN0cisrID0gc2lnbjsKKwlpZiAodHlwZSAmIFNQRUNJQUwpIHsKKwkJaWYgKGJhc2U9PTgpCisJCQkqc3RyKysgPSAnMCc7CisJCWVsc2UgaWYgKGJhc2U9PTE2KSB7CisJCQkqc3RyKysgPSAnMCc7CisJCQkqc3RyKysgPSBkaWdpdHNbMzNdOworCQl9CisJfQorCWlmICghKHR5cGUgJiBMRUZUKSkKKwkJd2hpbGUgKHNpemUtLSA+IDApCisJCQkqc3RyKysgPSBjOworCXdoaWxlIChpIDwgcHJlY2lzaW9uLS0pCisJCSpzdHIrKyA9ICcwJzsKKwl3aGlsZSAoaS0tID4gMCkKKwkJKnN0cisrID0gdG1wW2ldOworCXdoaWxlIChzaXplLS0gPiAwKQorCQkqc3RyKysgPSAnICc7CisJcmV0dXJuIHN0cjsKK30KKworIAorc3RhdGljIGludCB2c3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQoreworCWludCBsZW47CisJdW5zaWduZWQgbG9uZyBudW07CisJaW50IGksIGJhc2U7CisJY2hhciAqIHN0cjsKKwljb25zdCBjaGFyICpzOworCisJaW50IGZsYWdzOwkJLyogZmxhZ3MgdG8gbnVtYmVyKCkgKi8KKworCWludCBmaWVsZF93aWR0aDsJLyogd2lkdGggb2Ygb3V0cHV0IGZpZWxkICovCisJaW50IHByZWNpc2lvbjsJCS8qIG1pbi4gIyBvZiBkaWdpdHMgZm9yIGludGVnZXJzOyBtYXgKKwkJCQkgICBudW1iZXIgb2YgY2hhcnMgZm9yIGZyb20gc3RyaW5nICovCisJaW50IHF1YWxpZmllcjsJCS8qICdoJywgJ2wnLCBvciAnTCcgZm9yIGludGVnZXIgZmllbGRzICovCisKKwlmb3IgKHN0cj1idWYgOyAqZm10IDsgKytmbXQpIHsKKwkJaWYgKCpmbXQgIT0gJyUnKSB7CisJCQkqc3RyKysgPSAqZm10OworCQkJY29udGludWU7CisJCX0KKworCQkvKiBwcm9jZXNzIGZsYWdzICovCisJCWZsYWdzID0gMDsKKwkJcmVwZWF0OgorCQkJKytmbXQ7CQkvKiB0aGlzIGFsc28gc2tpcHMgZmlyc3QgJyUnICovCisJCQlzd2l0Y2ggKCpmbXQpIHsKKwkJCQljYXNlICctJzogZmxhZ3MgfD0gTEVGVDsgZ290byByZXBlYXQ7CisJCQkJY2FzZSAnKyc6IGZsYWdzIHw9IFBMVVM7IGdvdG8gcmVwZWF0OworCQkJCWNhc2UgJyAnOiBmbGFncyB8PSBTUEFDRTsgZ290byByZXBlYXQ7CisJCQkJY2FzZSAnIyc6IGZsYWdzIHw9IFNQRUNJQUw7IGdvdG8gcmVwZWF0OworCQkJCWNhc2UgJzAnOiBmbGFncyB8PSBaRVJPUEFEOyBnb3RvIHJlcGVhdDsKKwkJCQl9CisKKwkJLyogZ2V0IGZpZWxkIHdpZHRoICovCisJCWZpZWxkX3dpZHRoID0gLTE7CisJCWlmIChpc19kaWdpdCgqZm10KSkKKwkJCWZpZWxkX3dpZHRoID0gc2tpcF9hdG9pKCZmbXQpOworCQllbHNlIGlmICgqZm10ID09ICcqJykgeworCQkJKytmbXQ7CisJCQkvKiBpdCdzIHRoZSBuZXh0IGFyZ3VtZW50ICovCisJCQlmaWVsZF93aWR0aCA9IHZhX2FyZyhhcmdzLCBpbnQpOworCQkJaWYgKGZpZWxkX3dpZHRoIDwgMCkgeworCQkJCWZpZWxkX3dpZHRoID0gLWZpZWxkX3dpZHRoOworCQkJCWZsYWdzIHw9IExFRlQ7CisJCQl9CisJCX0KKworCQkvKiBnZXQgdGhlIHByZWNpc2lvbiAqLworCQlwcmVjaXNpb24gPSAtMTsKKwkJaWYgKCpmbXQgPT0gJy4nKSB7CisJCQkrK2ZtdDsKKwkJCWlmIChpc19kaWdpdCgqZm10KSkKKwkJCQlwcmVjaXNpb24gPSBza2lwX2F0b2koJmZtdCk7CisJCQllbHNlIGlmICgqZm10ID09ICcqJykgeworCQkJCSsrZm10OworCQkJCS8qIGl0J3MgdGhlIG5leHQgYXJndW1lbnQgKi8KKwkJCQlwcmVjaXNpb24gPSB2YV9hcmcoYXJncywgaW50KTsKKwkJCX0KKwkJCWlmIChwcmVjaXNpb24gPCAwKQorCQkJCXByZWNpc2lvbiA9IDA7CisJCX0KKworCQkvKiBnZXQgdGhlIGNvbnZlcnNpb24gcXVhbGlmaWVyICovCisJCXF1YWxpZmllciA9IC0xOworCQlpZiAoKmZtdCA9PSAnaCcgfHwgKmZtdCA9PSAnbCcgfHwgKmZtdCA9PSAnTCcpIHsKKwkJCXF1YWxpZmllciA9ICpmbXQ7CisJCQkrK2ZtdDsKKwkJfQorCisJCS8qIGRlZmF1bHQgYmFzZSAqLworCQliYXNlID0gMTA7CisKKwkJc3dpdGNoICgqZm10KSB7CisJCWNhc2UgJ2MnOgorCQkJaWYgKCEoZmxhZ3MgJiBMRUZUKSkKKwkJCQl3aGlsZSAoLS1maWVsZF93aWR0aCA+IDApCisJCQkJCSpzdHIrKyA9ICcgJzsKKwkJCSpzdHIrKyA9ICh1bnNpZ25lZCBjaGFyKSB2YV9hcmcoYXJncywgaW50KTsKKwkJCXdoaWxlICgtLWZpZWxkX3dpZHRoID4gMCkKKwkJCQkqc3RyKysgPSAnICc7CisJCQljb250aW51ZTsKKworCQljYXNlICdzJzoKKwkJCXMgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKKwkJCWlmICghcykKKwkJCQlzID0gIjxOVUxMPiI7CisKKwkJCWxlbiA9IHN0cm5sZW4ocywgcHJlY2lzaW9uKTsKKworCQkJaWYgKCEoZmxhZ3MgJiBMRUZUKSkKKwkJCQl3aGlsZSAobGVuIDwgZmllbGRfd2lkdGgtLSkKKwkJCQkJKnN0cisrID0gJyAnOworCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorCQkJCSpzdHIrKyA9ICpzKys7CisJCQl3aGlsZSAobGVuIDwgZmllbGRfd2lkdGgtLSkKKwkJCQkqc3RyKysgPSAnICc7CisJCQljb250aW51ZTsKKworCQljYXNlICdwJzoKKwkJCWlmIChmaWVsZF93aWR0aCA9PSAtMSkgeworCQkJCWZpZWxkX3dpZHRoID0gMipzaXplb2Yodm9pZCAqKTsKKwkJCQlmbGFncyB8PSBaRVJPUEFEOworCQkJfQorCQkJc3RyID0gbnVtYmVyKHN0ciwKKwkJCQkodW5zaWduZWQgbG9uZykgdmFfYXJnKGFyZ3MsIHZvaWQgKiksIDE2LAorCQkJCWZpZWxkX3dpZHRoLCBwcmVjaXNpb24sIGZsYWdzKTsKKwkJCWNvbnRpbnVlOworCisKKwkJY2FzZSAnbic6CisJCQlpZiAocXVhbGlmaWVyID09ICdsJykgeworCQkJCWxvbmcgKiBpcCA9IHZhX2FyZyhhcmdzLCBsb25nICopOworCQkJCSppcCA9IChzdHIgLSBidWYpOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgKiBpcCA9IHZhX2FyZyhhcmdzLCBpbnQgKik7CisJCQkJKmlwID0gKHN0ciAtIGJ1Zik7CisJCQl9CisJCQljb250aW51ZTsKKworCQljYXNlICclJzoKKwkJCSpzdHIrKyA9ICclJzsKKwkJCWNvbnRpbnVlOworCisJCS8qIGludGVnZXIgbnVtYmVyIGZvcm1hdHMgLSBzZXQgdXAgdGhlIGZsYWdzIGFuZCAiYnJlYWsiICovCisJCWNhc2UgJ28nOgorCQkJYmFzZSA9IDg7CisJCQlicmVhazsKKworCQljYXNlICdYJzoKKwkJCWZsYWdzIHw9IExBUkdFOworCQljYXNlICd4JzoKKwkJCWJhc2UgPSAxNjsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2QnOgorCQljYXNlICdpJzoKKwkJCWZsYWdzIHw9IFNJR047CisJCWNhc2UgJ3UnOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCSpzdHIrKyA9ICclJzsKKwkJCWlmICgqZm10KQorCQkJCSpzdHIrKyA9ICpmbXQ7CisJCQllbHNlCisJCQkJLS1mbXQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocXVhbGlmaWVyID09ICdsJykKKwkJCW51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKKwkJZWxzZSBpZiAocXVhbGlmaWVyID09ICdoJykgeworCQkJbnVtID0gKHVuc2lnbmVkIHNob3J0KSB2YV9hcmcoYXJncywgaW50KTsKKwkJCWlmIChmbGFncyAmIFNJR04pCisJCQkJbnVtID0gKHNob3J0KSBudW07CisJCX0gZWxzZSBpZiAoZmxhZ3MgJiBTSUdOKQorCQkJbnVtID0gdmFfYXJnKGFyZ3MsIGludCk7CisJCWVsc2UKKwkJCW51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQpOworCQlzdHIgPSBudW1iZXIoc3RyLCBudW0sIGJhc2UsIGZpZWxkX3dpZHRoLCBwcmVjaXNpb24sIGZsYWdzKTsKKwl9CisJKnN0ciA9ICdcMCc7CisJcmV0dXJuIHN0ci1idWY7Cit9CisKK3ZvaWQgc2VyaWFsX3ByaW50ZiAoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXVpbnQgaTsKKwljaGFyIHByaW50YnVmZmVyW0NGR19QQlNJWkVdOworCisJdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisKKwkvKiBGb3IgdGhpcyB0byB3b3JrLCBwcmludGJ1ZmZlciBtdXN0IGJlIGxhcmdlciB0aGFuCisJICogYW55dGhpbmcgd2UgZXZlciB3YW50IHRvIHByaW50LgorCSAqLworCWkgPSB2c3ByaW50ZiAocHJpbnRidWZmZXIsIGZtdCwgYXJncyk7CisJdmFfZW5kIChhcmdzKTsKKworCS8qIFByaW50IHRoZSBzdHJpbmcgKi8KKwlzZXJpYWxfcHV0cyAocHJpbnRidWZmZXIpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvc3RyaW5nLmMgYi94LWxvYWRlci9saWIvc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkODY3NQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9zdHJpbmcuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogIGxpbnV4L2xpYi9zdHJpbmcuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworLyoKKyAqIHN0dXBpZCBsaWJyYXJ5IHJvdXRpbmVzLi4gVGhlIG9wdGltaXplZCB2ZXJzaW9ucyBzaG91bGQgZ2VuZXJhbGx5IGJlIGZvdW5kCisgKiBhcyBpbmxpbmUgY29kZSBpbiA8YXNtLXh4L3N0cmluZy5oPgorICoKKyAqIFRoZXNlIGFyZSBidWdneSBhcyB3ZWxsLi4KKyAqCisgKiAqIEZyaSBKdW4gMjUgMTk5OSwgSW5nbyBPZXNlciA8aW9lQGluZm9ybWF0aWsudHUtY2hlbW5pdHouZGU+CisgKiAtICBBZGRlZCBzdHJzZXAoKSB3aGljaCB3aWxsIHJlcGxhY2Ugc3RydG9rKCkgc29vbiAoYmVjYXVzZSBzdHJzZXAoKSBpcworICogICAgcmVlbnRyYW50IGFuZCBzaG91bGQgYmUgZmFzdGVyKS4gVXNlIG9ubHkgc3Ryc2VwKCkgaW4gbmV3IGNvZGUsIHBsZWFzZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNTU9WRQorLyoqCisgKiBtZW1tb3ZlIC0gQ29weSBvbmUgYXJlYSBvZiBtZW1vcnkgdG8gYW5vdGhlcgorICogQGRlc3Q6IFdoZXJlIHRvIGNvcHkgdG8KKyAqIEBzcmM6IFdoZXJlIHRvIGNvcHkgZnJvbQorICogQGNvdW50OiBUaGUgc2l6ZSBvZiB0aGUgYXJlYS4KKyAqCisgKiBVbmxpa2UgbWVtY3B5KCksIG1lbW1vdmUoKSBjb3BlcyB3aXRoIG92ZXJsYXBwaW5nIGFyZWFzLgorICovCit2b2lkICogbWVtbW92ZSh2b2lkICogZGVzdCxjb25zdCB2b2lkICpzcmMsc2l6ZV90IGNvdW50KQoreworCWNoYXIgKnRtcCwgKnM7CisKKwlpZiAoZGVzdCA8PSBzcmMpIHsKKwkJdG1wID0gKGNoYXIgKikgZGVzdDsKKwkJcyA9IChjaGFyICopIHNyYzsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqdG1wKysgPSAqcysrOworCQl9CisJZWxzZSB7CisJCXRtcCA9IChjaGFyICopIGRlc3QgKyBjb3VudDsKKwkJcyA9IChjaGFyICopIHNyYyArIGNvdW50OworCQl3aGlsZSAoY291bnQtLSkKKwkJCSotLXRtcCA9ICotLXM7CisJCX0KKworCXJldHVybiBkZXN0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9ta2NvbmZpZyBiL3gtbG9hZGVyL21rY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhNWE2OGMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ta2NvbmZpZwpAQCAtMCwwICsxLDEzOCBAQAorIyEvYmluL3NoIC1lCisKKyMgU2NyaXB0IHRvIGNyZWF0ZSBoZWFkZXIgZmlsZXMgYW5kIGxpbmtzIHRvIGNvbmZpZ3VyZQorIyBYLUxvYWRlciBmb3IgYSBzcGVjaWZpYyBib2FyZC4KKyMKKyMgUGFyYW1ldGVyczogIFRhcmdldCAgQXJjaGl0ZWN0dXJlICBDUFUgIEJvYXJkIFtWRU5ET1JdIFtTT0NdCisjCisjIChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzCisjIChDKSAyMDAyLTIwMDYgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyMKKworQVBQRU5EPW5vCSMgRGVmYXVsdDogQ3JlYXRlIG5ldyBjb25maWcgZmlsZQorQk9BUkRfTkFNRT0iIgkjIE5hbWUgdG8gcHJpbnQgaW4gbWFrZSBvdXRwdXQKK1RBUkdFVFM9IiIKKworYXJjaD0iIgorY3B1PSIiCitib2FyZD0iIgordmVuZG9yPSIiCitzb2M9IiIKKworaWYgWyBcKCAkIyAtZXEgMiBcKSAtYSBcKCAiJDEiID0gIi1BIiBcKSBdIDsgdGhlbgorCSMgQXV0b21hdGljIG1vZGUKKwlsaW5lPWBlZ3JlcCAtaSAiXltbOnNwYWNlOl1dKiR7Mn1bWzpzcGFjZTpdXSIgYm9hcmRzLmNmZ2AgfHwgeworCQllY2hvICJtYWtlOiAqKiogTm8gcnVsZSB0byBtYWtlIHRhcmdldCBcYCQyX2NvbmZpZycuICBTdG9wLiIgPiYyCisJCWV4aXQgMQorCX0KKworCXNldCAke2xpbmV9CisJIyBhZGQgZGVmYXVsdCBib2FyZCBuYW1lIGlmIG5lZWRlZAorCVsgJCMgPSAzIF0gJiYgc2V0ICR7bGluZX0gJHsxfQorZmkKKword2hpbGUgWyAkIyAtZ3QgMCBdIDsgZG8KKwljYXNlICIkMSIgaW4KKwktLSkgc2hpZnQgOyBicmVhayA7OworCS1hKSBzaGlmdCA7IEFQUEVORD15ZXMgOzsKKwktbikgc2hpZnQgOyBCT0FSRF9OQU1FPSIkezElX2NvbmZpZ30iIDsgc2hpZnQgOzsKKwktdCkgc2hpZnQgOyBUQVJHRVRTPSJgZWNobyAkMSB8IHNlZCAnczpfOiA6ZydgICR7VEFSR0VUU30iIDsgc2hpZnQgOzsKKwkqKSAgYnJlYWsgOzsKKwllc2FjCitkb25lCisKK1sgJCMgLWx0IDQgXSAmJiBleGl0IDEKK1sgJCMgLWd0IDYgXSAmJiBleGl0IDEKKworQ09ORklHX05BTUU9IiR7MSVfY29uZmlnfSIKKworWyAiJHtCT0FSRF9OQU1FfSIgXSB8fCBCT0FSRF9OQU1FPSIke0NPTkZJR19OQU1FfSIKKworYXJjaD0iJDIiCitjcHU9IiQzIgoraWYgWyAiJDQiID0gIi0iIF0gOyB0aGVuCisJYm9hcmQ9JHtCT0FSRF9OQU1FfQorZWxzZQorCWJvYXJkPSIkNCIKK2ZpCitbICQjIC1ndCA0IF0gJiYgWyAiJDUiICE9ICItIiBdICYmIHZlbmRvcj0iJDUiCitbICQjIC1ndCA1IF0gJiYgWyAiJDYiICE9ICItIiBdICYmIHNvYz0iJDYiCisKK2lmIFsgIiR7QVJDSH0iIC1hICIke0FSQ0h9IiAhPSAiJHthcmNofSIgXTsgdGhlbgorCWVjaG8gIkZhaWxlZDogXCRBUkNIPSR7QVJDSH0sIHNob3VsZCBiZSAnJHthcmNofScgZm9yICR7Qk9BUkRfTkFNRX0iIDE+JjIKKwlleGl0IDEKK2ZpCisKK2VjaG8gIkNvbmZpZ3VyaW5nIGZvciAke0JPQVJEX05BTUV9IGJvYXJkLi4uIgorCisjCisjIENyZWF0ZSBsaW5rIHRvIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBoZWFkZXJzCisjCitpZiBbICIkU1JDVFJFRSIgIT0gIiRPQkpUUkVFIiBdIDsgdGhlbgorCW1rZGlyIC1wICR7T0JKVFJFRX0vaW5jbHVkZQorCW1rZGlyIC1wICR7T0JKVFJFRX0vaW5jbHVkZTIKKwljZCAke09CSlRSRUV9L2luY2x1ZGUyCisJcm0gLWYgYXNtCisJbG4gLXMgJHtTUkNUUkVFfS9pbmNsdWRlL2FzbSBhc20KKwlMTlBSRUZJWD0ke1NSQ1RSRUV9L2luY2x1ZGUvYXNtLworCWNkIC4uL2luY2x1ZGUKKwlybSAtZiBhc20KKwlsbiAtcyAke1NSQ1RSRUV9L2luY2x1ZGUvYXNtIGFzbQorZWxzZQorCWNkIC4vaW5jbHVkZQorZmkKKworcm0gLWYgYXNtL2FyY2gKKworaWYgWyAteiAiJHtzb2N9IiBdIDsgdGhlbgorCWxuIC1zICR7TE5QUkVGSVh9YXJjaC0ke2NwdX0gYXNtL2FyY2gKK2Vsc2UKKwlsbiAtcyAke0xOUFJFRklYfWFyY2gtJHtzb2N9IGFzbS9hcmNoCitmaQorCitpZiBbICIke2FyY2h9IiA9ICJhcm0iIF0gOyB0aGVuCisJcm0gLWYgYXNtL3Byb2MKKwlsbiAtcyAke0xOUFJFRklYfXByb2MtYXJtdiBhc20vcHJvYworZmkKKworIworIyBDcmVhdGUgaW5jbHVkZSBmaWxlIGZvciBNYWtlCisjCitlY2hvICJBUkNIICAgPSAke2FyY2h9IiAgPiAgY29uZmlnLm1rCitlY2hvICJDUFUgICAgPSAke2NwdX0iICAgPj4gY29uZmlnLm1rCitlY2hvICJCT0FSRCAgPSAke2JvYXJkfSIgPj4gY29uZmlnLm1rCisKK1sgIiR7dmVuZG9yfSIgXSAmJiBlY2hvICJWRU5ET1IgPSAke3ZlbmRvcn0iID4+IGNvbmZpZy5taworCitbICIke3NvY30iICAgIF0gJiYgZWNobyAiU09DICAgID0gJHtzb2N9IiAgICA+PiBjb25maWcubWsKKworIyBBc3NpZ24gYm9hcmQgZGlyZWN0b3J5IHRvIEJPQVJESVIgdmFyaWFibGUKK2lmIFsgLXogIiR7dmVuZG9yfSIgXSA7IHRoZW4KKyAgICBCT0FSRERJUj0ke2JvYXJkfQorZWxzZQorICAgIEJPQVJERElSPSR7dmVuZG9yfS8ke2JvYXJkfQorZmkKKworIworIyBDcmVhdGUgYm9hcmQgc3BlY2lmaWMgaGVhZGVyIGZpbGUKKyMKK2lmIFsgIiRBUFBFTkQiID0gInllcyIgXQkjIEFwcGVuZCB0byBleGlzdGluZyBjb25maWcgZmlsZQordGhlbgorCWVjaG8gPj4gY29uZmlnLmgKK2Vsc2UKKwk+IGNvbmZpZy5oCQkjIENyZWF0ZSBuZXcgY29uZmlnIGZpbGUKK2ZpCitlY2hvICIvKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAtIGRvIG5vdCBlZGl0ICovIiA+PmNvbmZpZy5oCisKK2ZvciBpIGluICR7VEFSR0VUU30gOyBkbworCWVjaG8gIiNkZWZpbmUgQ09ORklHX01LXyR7aX0gMSIgPj5jb25maWcuaCA7Citkb25lCisKK2NhdCA8PCBFT0YgPj4gY29uZmlnLmgKKyNkZWZpbmUgQ09ORklHX0JPQVJERElSIGJvYXJkLyRCT0FSRERJUgorI2luY2x1ZGUgPGNvbmZpZ19kZWZhdWx0cy5oPgorI2luY2x1ZGUgPGNvbmZpZ3MvJHtDT05GSUdfTkFNRX0uaD4KKyNpbmNsdWRlIDxhc20vY29uZmlnLmg+CitFT0YKKworZXhpdCAwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ydWxlcy5tayBiL3gtbG9hZGVyL3J1bGVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNjcwYWMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ydWxlcy5tawpAQCAtMCwwICsxLDQ0IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK19kZXBlbmQ6CSQob2JqKS5kZXBlbmQKKworJChvYmopLmRlcGVuZDoJJChzcmMpTWFrZWZpbGUgJChUT1BESVIpL2NvbmZpZy5tayAkKFNSQ1MpICQoSE9TVFNSQ1MpCisJCUBybSAtZiAkQAorCQlAZm9yIGYgaW4gJChTUkNTKTsgZG8gXAorCQkJZz1gYmFzZW5hbWUgJCRmIHwgc2VkIC1lICdzL1woLipcKVwuXHcvXDEuby8nYDsgXAorCQkJJChDQykgLU0gJChDUFBGTEFHUykgLU1RICQob2JqKSQkZyAkJGYgPj4gJEAgOyBcCisJCWRvbmUKKwkJQGZvciBmIGluICQoSE9TVFNSQ1MpOyBkbyBcCisJCQlnPWBiYXNlbmFtZSAkJGYgfCBzZWQgLWUgJ3MvXCguKlwpXC5cdy9cMS5vLydgOyBcCisJCQkkKEhPU1RDQykgLU0gJChIT1NUQ1BQRkxBR1MpIC1NUSAkKG9iaikkJGcgJCRmID4+ICRAIDsgXAorCQlkb25lCisKKyQoSE9TVE9CSlMpOiAkKG9iaiklLm86ICUuYworCSQoSE9TVENDKSAkKEhPU1RDRkxBR1MpICQoSE9TVENGTEFHU18kKEBGKSkgJChIT1NUQ0ZMQUdTXyQoQkNVUkRJUikpIC1vICRAICQ8IC1jCiskKE5PUEVET0JKUyk6ICQob2JqKSUubzogJS5jCisJJChIT1NUQ0MpICQoSE9TVENGTEFHU19OT1BFRCkgJChIT1NUQ0ZMQUdTXyQoQEYpKSAkKEhPU1RDRkxBR1NfJChCQ1VSRElSKSkgLW8gJEAgJDwgLWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvc2NyaXB0cy9ta29uZWJvb3Quc2ggYi94LWxvYWRlci9zY3JpcHRzL21rb25lYm9vdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDg2MmE1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvc2NyaXB0cy9ta29uZWJvb3Quc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCisKK0lNQUdFMT14LWxvYWQuYmluLmlmdAorSU1BR0UyPXgtbG9hZC1zaWduZWQuaWZ0CitUTVA9b25lbG9hZGVyCitQQUdFU0laRT0yMDQ4CisKK3NpemU9YGxzIC1sYSAkSU1BR0UxIHwgYXdrIC1GJyAnICd7IHByaW50ZiAkNX0nYAorbGV0IHJlbWFpbj0kUEFHRVNJWkUtJHNpemUKK2RkIGlmPS9kZXYvemVybyBvZj0kSU1BR0UyIGJzPTEgY291bnQ9NTEyCisjZGQgaWY9L2Rldi96ZXJvIG9mPXplcm9maWxlIGJzPSRyZW1haW4gY291bnQ9MSA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwKK2NhdCAkSU1BR0UxPj4kSU1BR0UyCisKK3JtIC1mICRJTUFHRTEKKworZWNobyAiQ3JlYXRlICRJTUFHRTIgY29tcGxldGVkLi4uIgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvdG9vbHMvTWFrZWZpbGUgYi94LWxvYWRlci90b29scy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTQ1YjJiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvdG9vbHMvTWFrZWZpbGUKQEAgLTAsMCArMSw4OSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitUT09MU1VCRElSUyA9CisKKyMKKyMgdG9vbGNoYWlucyB0YXJnZXRpbmcgd2luMzIgZ2VuZXJhdGUgLmV4ZSBmaWxlcworIworaWZuZXEgKCwkKGZpbmRzdHJpbmcgV0lOMzIgLCQoc2hlbGwgJChIT1NUQ0MpIC1FIC1kTSAteGMgL2Rldi9udWxsKSkpCitTRlggPSAuZXhlCitlbHNlCitTRlggPQorZW5kaWYKKworIworIyBJbmNsdWRlIHRoaXMgYWZ0ZXIgSE9TVE9TIEhPU1RBUkNIIGNoZWNrCisjIHNvIHRoYXQgd2UgY2FuIGFjdCBpbnRlbGxpZ2VudGx5LgorIworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKKyMgR2VuZXJhdGVkIGV4ZWN1dGFibGUgZmlsZXMKK0JJTl9GSUxFUy15ICs9IHNpZ25HUCQoU0ZYKQorT0JKX0ZJTEVTLXkgKz0gc2lnbkdQLm8KKworIyBub3cgJChvYmopIGlzIGRlZmluZWQKK0hPU1RTUkNTICs9ICQoYWRkcHJlZml4ICQoU1JDVFJFRSkvdG9vbHMvLCQoT0JKX0ZJTEVTLXk6Lm89LmMpKQorQklOUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChzb3J0ICQoQklOX0ZJTEVTLXkpKSkKK0hPU1RPQkpTIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKE9CSl9GSUxFUy15KSkKK05PUEVET0JKUyA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChOT1BFRF9PQkpfRklMRVMteSkpCisKKyMKKyMgVXNlIG5hdGl2ZSB0b29scyBhbmQgb3B0aW9ucworIyBEZWZpbmUgX19LRVJORUxfU1RSSUNUX05BTUVTIHRvIHByZXZlbnQgdHlwZWRlZiBvdmVybGFwcworIworSE9TVENQUEZMQUdTID0JLWlkaXJhZnRlciAkKFNSQ1RSRUUpL2luY2x1ZGUgXAorCQktaWRpcmFmdGVyICQoT0JKVFJFRSkvaW5jbHVkZTIgXAorCQktaWRpcmFmdGVyICQoT0JKVFJFRSkvaW5jbHVkZSBcCisJICAgICAgICAtSSAkKFNSQ1RSRUUpL2xpYi9saWJmZHQgXAorCQktSSAkKFNSQ1RSRUUpL3Rvb2xzIFwKKwkJLURURVhUX0JBU0U9JChURVhUX0JBU0UpIC1EVVNFX0hPU1RDQyBcCisJCS1EX19LRVJORUxfU1RSSUNUX05BTUVTCisKKworYWxsOgkkKG9iaikuZGVwZW5kICQoQklOUykgJChMT0dPLXkpIHN1YmRpcnMKKworJChvYmopc2lnbkdQJChTRlgpOgkkKG9iailzaWduR1AubworCSQoSE9TVENDKSAkKEhPU1RDRkxBR1MpICQoSE9TVExERkxBR1MpIC1vICRAICReCisJJChIT1NUU1RSSVApICRACisKK3N1YmRpcnM6CitpZmVxICgkKFRPT0xTVUJESVJTKSwpCisJQDoKK2Vsc2UKKwlAZm9yIGRpciBpbiAkKFRPT0xTVUJESVJTKSA7IGRvIFwKKwkgICAgJChNQUtFKSBcCisJCUhPU1RPUz0kKEhPU1RPUykgXAorCQlIT1NUQVJDSD0kKEhPU1RBUkNIKSBcCisJCS1DICQkZGlyIHx8IGV4aXQgMSA7IFwKKwlkb25lCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvdG9vbHMvc2V0bG9jYWx2ZXJzaW9uIGIveC1sb2FkZXIvdG9vbHMvc2V0bG9jYWx2ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxMWY1NGYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci90b29scy9zZXRsb2NhbHZlcnNpb24KQEAgLTAsMCArMSw0MCBAQAorIyEvYmluL3NoCisjIFByaW50IGFkZGl0aW9uYWwgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3Igbm9uLXJlbGVhc2UgdHJlZXMuCisKK3VzYWdlKCkgeworCWVjaG8gIlVzYWdlOiAkMCBbc3JjdHJlZV0iID4mMgorCWV4aXQgMQorfQorCitjZCAiJHsxOi0ufSIgfHwgdXNhZ2UKKworIyBDaGVjayBmb3IgZ2l0IGFuZCBhIGdpdCByZXBvLgoraWYgaGVhZD1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIDI+L2Rldi9udWxsYDsgdGhlbgorCSMgRG8gd2UgaGF2ZSBhbiB1bnRhZ2dlZCB2ZXJzaW9uPworCWlmIGdpdCBuYW1lLXJldiAtLXRhZ3MgSEVBRCB8IFwKKwkgICBncmVwIC1FICdeSEVBRFtbOnNwYWNlOl1dKyguKn5bMC05XSp8dW5kZWZpbmVkKSQnID4gL2Rldi9udWxsOyB0aGVuCisJICAgICAgICAoZ2l0IGRlc2NyaWJlIHx8IGdpdCBkZXNjcmliZSAtLXRhZ3MgfHwgZ2l0IGRlc2NyaWJlIC0tYWxsIC0tbG9uZykgXAorCQkJCTI+L2Rldi9udWxsIHwgYXdrIC1GLSAne3ByaW50ZigiLSUwNWQtJXMiLCAkKE5GLTEpLCQoTkYpKX0nCisJZmkKKworCSMgQXJlIHRoZXJlIHVuY29tbWl0dGVkIGNoYW5nZXM/CisJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggLS11bm1lcmdlZCA+IC9kZXYvbnVsbAorCWlmIGdpdCBkaWZmLWluZGV4IC0tbmFtZS1vbmx5IEhFQUQgfCBncmVwIC12ICJec2NyaXB0cy9wYWNrYWdlIiBcCisJICAgIHwgcmVhZCBkdW1teTsgdGhlbgorCQlwcmludGYgJyVzJyAtZGlydHkKKwlmaQorCisJIyBJcyB0aGlzIGdpdCBvbiBzdm4/CisJaWYgZ2l0IGNvbmZpZyAtLWdldCBzdm4tcmVtb3RlLnN2bi51cmwgPi9kZXYvbnVsbDsgdGhlbgorCQlwcmludGYgLS0gJy1zdm4lcycgImBnaXQgc3ZuIGZpbmQtcmV2ICRoZWFkYCIKKwlmaQorZmkKKworIyBDaGVjayBmb3Igc3ZuIGFuZCBhIHN2biByZXBvLgoraWYgcmV2PWBzdm4gaW5mbyAyPi9kZXYvbnVsbGAgOyB0aGVuCisJcmV2PWBlY2hvICIke3Jldn0iIHwgZ3JlcCAnXlJldmlzaW9uJyB8IGF3ayAne3ByaW50ICRORn0nYAorCXByaW50ZiAtLSAnLXN2biVzJyAkcmV2CitmaQorCisjIENoZWNrIGZvciBhbnkgbG9jYWx2ZXJzaW9uLSogZmlsZXMKK3ByaW50ZiAnJXMnICJgY2F0IGxvY2FsdmVyc2lvbi0qIDI+L2Rldi9udWxsYCIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL3Rvb2xzL3NpZ25HUC5jIGIveC1sb2FkZXIvdG9vbHMvc2lnbkdQLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4ZWQwNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL3Rvb2xzL3NpZ25HUC5jCkBAIC0wLDAgKzEsNzMgQEAKKy8vCisvLyBzaWduR1AuYworLy8gUmVhZCB0aGUgeC1sb2FkLmJpbiBmaWxlIGFuZCB3cml0ZSBvdXQgdGhlIHgtbG9hZC5iaW4uaWZ0IGZpbGUuCisvLyBUaGUgc2lnbmVkIGltYWdlIGlzIHRoZSBvcmlnaW5hbCBwcmUtcGVuZGVkIHdpdGggdGhlIHNpemUgb2YgdGhlIGltYWdlCisvLyBhbmQgdGhlIGxvYWQgYWRkcmVzcy4gIElmIG5vdCBlbnRlcmVkIG9uIGNvbW1hbmQgbGluZSwgZmlsZSBuYW1lIGlzCisvLyBhc3N1bWVkIHRvIGJlIHgtbG9hZC5iaW4gaW4gY3VycmVudCBkaXJlY3RvcnkgYW5kIGxvYWQgYWRkcmVzcyBpcworLy8gMHg0MDIwMDgwMC4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorCisKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQJaTsKKwljaGFyCWlmbmFtZVtGSUxFTkFNRV9NQVhdLCBvZm5hbWVbRklMRU5BTUVfTUFYXSwgY2g7CisJRklMRQkqaWZpbGUsICpvZmlsZTsKKwl1bnNpZ25lZCBsb25nCWxvYWRhZGRyLCBsZW47CisJc3RydWN0IHN0YXQJc2luZm87CisKKworCS8vIERlZmF1bHQgdG8geC1sb2FkLmJpbiBhbmQgMHg0MDIwMDgwMC4KKwlzdHJjcHkoaWZuYW1lLCAieC1sb2FkLmJpbiIpOworCWxvYWRhZGRyID0gMHg0MDIwMDgwMDsKKworCWlmICgoYXJnYyA9PSAyKSB8fCAoYXJnYyA9PSAzKSkKKwkJc3RyY3B5KGlmbmFtZSwgYXJndlsxXSk7CisKKwlpZiAoYXJnYyA9PSAzKQorCQlsb2FkYWRkciA9IHN0cnRvbChhcmd2WzJdLCBOVUxMLCAxNik7CisKKwkvLyBGb3JtIHRoZSBvdXRwdXQgZmlsZSBuYW1lLgorCXN0cmNweShvZm5hbWUsIGlmbmFtZSk7CisJc3RyY2F0KG9mbmFtZSwgIi5pZnQiKTsKKworCS8vIE9wZW4gdGhlIGlucHV0IGZpbGUuCisJaWZpbGUgPSBmb3BlbihpZm5hbWUsICJyYiIpOworCWlmIChpZmlsZSA9PSBOVUxMKSB7CisJCXByaW50ZigiQ2Fubm90IG9wZW4gJXNcbiIsIGlmbmFtZSk7CisJCWV4aXQoMCk7CisJfQorCisJLy8gR2V0IGZpbGUgbGVuZ3RoLgorCXN0YXQoaWZuYW1lLCAmc2luZm8pOworCWxlbiA9IHNpbmZvLnN0X3NpemU7CisKKwkvLyBPcGVuIHRoZSBvdXRwdXQgZmlsZSBhbmQgd3JpdGUgaXQuCisJb2ZpbGUgPSBmb3BlbihvZm5hbWUsICJ3YiIpOworCWlmIChvZmlsZSA9PSBOVUxMKSB7CisJCXByaW50ZigiQ2Fubm90IG9wZW4gJXNcbiIsIG9mbmFtZSk7CisJCWZjbG9zZShpZmlsZSk7CisJCWV4aXQoMCk7CisJfQorCisJLy8gUGFkIDEgc2VjdG9yIG9mIHplcm9lcy4KKwkvL2NoID0gMHgwMDsKKwkvL2ZvciAoaT0wOyBpPDB4MjAwOyBpKyspCisJLy8JZndyaXRlKCZjaCwgMSwgMSwgb2ZpbGUpOworCisJZndyaXRlKCZsZW4sIDEsIDQsIG9maWxlKTsKKwlmd3JpdGUoJmxvYWRhZGRyLCAxLCA0LCBvZmlsZSk7CisJZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKwkJZnJlYWQoJmNoLCAxLCAxLCBpZmlsZSk7CisJCWZ3cml0ZSgmY2gsIDEsIDEsIG9maWxlKTsKKwl9CisKKwlmY2xvc2UoaWZpbGUpOworCWZjbG9zZShvZmlsZSk7Cit9Cg==