ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1ZDE1MgotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTA2IEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMCBOZXN0IExhYnMsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdCBMYWJzLiBJdCBpcyBjb25zaWRlcmVkCisjICAgIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24uCisjCisjICAgIFRoaXMgZG9jdW1lbnQgbWF5IG5vdCBiZSByZXByb2R1Y2VkIG9yIHRyYW5zbWl0dGVkIGluIGFueSBmb3JtLAorIyAgICBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHRoZSBleHByZXNzIHdyaXR0ZW4gcGVybWlzc2lvbiBvZgorIyAgICBOZXN0IExhYnMuCisjCisjICAgIERlc2NyaXB0aW9uOgorIyAgICAgIFRoaXMgZmlsZSBpcyB0aGUgbWFrZSBmaWxlIGZvciBYLUxvYWRlciwgYW4gaW5pdGlhbCBwcm9ncmFtCisjICAgICAgbG9hZGVyIChJUEwpIGZvciBlbWJlZGRlZCBib2FyZHMgYmFzZWQgb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMgICAgICBPTUFQIHByb2Nlc3NvcnMuCisjCisKK2luY2x1ZGUgcHJlLm1haworCitQYWNrYWdlUm9vdAkJOj0gLgorCitQYWNrYWdlTmFtZQkJOj0geC1sb2FkZXIKKworUGFja2FnZVNlcGFyYXRvcgk6PSAKKworUGFja2FnZVZlcnNpb24JCTo9IAorUGFja2FnZVNvdXJjZURpcgk6PSAkKFBhY2thZ2VSb290KS8kKFBhY2thZ2VOYW1lKSQoUGFja2FnZVNlcGFyYXRvcikkKFBhY2thZ2VWZXJzaW9uKQorCitQYWNrYWdlQnVpbGRNYWtlZmlsZQk9ICQoY2FsbCBHZW5lcmF0ZUJ1aWxkUGF0aHMsaW5jbHVkZS9jb25maWcubWspCisKK0NsZWFuUGF0aHMJCSs9ICQoUGFja2FnZUxpY2Vuc2VGaWxlKQorCithbGw6ICQoUGFja2FnZURlZmF1bHRHb2FsKQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGxpY2Vuc2UgY29udGVudHMuCisKKyQoUGFja2FnZVNvdXJjZURpcikvUkVBRE1FOiBzb3VyY2UKKworJChQYWNrYWdlTGljZW5zZUZpbGUpOiAkKFBhY2thZ2VTb3VyY2VEaXIpL1JFQURNRQorCSQoRWNobykgIkV4dHJhY3RpbmcgXCIkKGNhbGwgR2VuZXJhdGVCdWlsZFJvb3RFbGxpcHNlZFBhdGgsJChAKSlcIiIKKwkkKFZlcmJvc2UpJChTRUQpIC1uIC1lICcxMCwyNXAnIDwgJDwgPiAkQAorCisjIFdlIGFyZSBidWlsZGluZyB0aGlzIHBhY2thZ2UgZnJvbSB2ZXJzaW9uLWNvbnRyb2xsZXIgc291cmNlLCBzbworIyB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGZvciB0aGlzIHRhcmdldCBnb2FsLgorCiskKFBhY2thZ2VTb3VyY2VEaXIpOgorCisjIFByZXBhcmUgdGhlIHNvdXJjZXMuCisKKy5QSE9OWTogc291cmNlCitzb3VyY2U6IHwgJChQYWNrYWdlU291cmNlRGlyKQorCisjIFBhdGNoIHRoZSBzb3VyY2VzLCBpZiBuZWNlc3NhcnkuCisKKy5QSE9OWTogcGF0Y2gKK3BhdGNoOiBzb3VyY2UKKworIyBYLUxvYWRlciBoYXMgbm8gd2F5IG9mIGV4cGxpY2l0bHkgc2V0dGluZyBDQywgTEQsIE9CSkNPUFksIGV0IGFsIGFuZAorIyBpbnN0ZWFkIHJlbGllcyBvbiB0aGUgdmFsdWUgb2YgQ1JPU1NfQ09NUElMRS4gQ29uc2VxdWVudGx5LCB3ZSBoYXZlCisjIHRvIGVuc3VyZSB0aGF0ICdUb29sQmluRGlyJyBpcyBpbiAnUEFUSCcgc28gdGhhdCB0aGUga2VybmVsIGJ1aWxkCisjIGluZnJhc3RydWN0dXJlIGNhbiBmaW5kICQoQ1JPU1NfQ09NUElMRSlnY2MsICQoQ1JPU1NfQ09NUElMRSlsZCwgZXQgYWwuCisKK2NvbmZpZ3VyZSBidWlsZCBzdGFnZTogUEFUSCA6PSAkKFBBVEgpOiQoVG9vbEJpbkRpcikKK2NvbmZpZ3VyZSBidWlsZCBzdGFnZTogQ1JPU1NfQ09NUElMRSA6PSAkKENDQUNIRSkgJChDUk9TU19DT01QSUxFKQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGJ1aWxkIG1ha2VmaWxlLgorCiskKFBhY2thZ2VCdWlsZE1ha2VmaWxlKTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpICQoQnVpbGREaXJlY3RvcnkpCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKFBhY2thZ2VTb3VyY2VEaXIpIE89JChDVVJESVIpLyQoQnVpbGREaXJlY3RvcnkpIFwKKwlJTlNUQUxMPSIkKElOU1RBTEwpICQoSU5TVEFMTEZMQUdTKSIgXAorCSQoWExvYWRlclByb2R1Y3Rpb25Db25maWcpCisKKyMgQ29uZmlndXJlIHRoZSBzb3VyY2UgZm9yIGJ1aWxkaW5nLgorCisuUEhPTlk6IGNvbmZpZ3VyZQorY29uZmlndXJlOiBzb3VyY2UgJChQYWNrYWdlQnVpbGRNYWtlZmlsZSkKKworIyBCdWlsZCB0aGUgc291cmNlLgorCisuUEhPTlk6IGJ1aWxkCitidWlsZDogY29uZmlndXJlCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKFBhY2thZ2VTb3VyY2VEaXIpIE89JChDVVJESVIpLyQoQnVpbGREaXJlY3RvcnkpIFwKKwlJTlNUQUxMPSIkKElOU1RBTEwpICQoSU5TVEFMTEZMQUdTKSIgXAorCWFsbAorCisjIFN0YWdlIHRoZSBidWlsZCB0byBhIHRlbXBvcmFyeSBpbnN0YWxsYXRpb24gYXJlYS4KKyMKKyMgWC1Mb2FkZXIgZG9lcyBub3Qgc3VwcG9ydCBhIG5vdGlvbiBvZiBpbnN0YWxsaW5nLCBzbyB3ZSBoYXZlIHRvCisjIGNoZXJyeS1waWNrIHRoZSBjb21wb25lbnRzIHdlIHdhbnQgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5IGFuZAorIyBjb3B5L2luc3RhbGwgdGhlbSB0byB0aGUgcmVzdWx0cyBkaXJlY3RvcnkuCisKKy5QSE9OWTogc3RhZ2UKK3N0YWdlOiBjb3B5CisKKy5QSE9OWTogY29weQorJChjYWxsIEdlbmVyYXRlUmVzdWx0UGF0aHMsZncveC1sb2FkZXIseC1sb2FkLmJpbikgY29weTogYnVpbGQgfCAkKFJlc3VsdERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpY3AgLWYgJCh3aWxkY2FyZCAkKGNhbGwgR2VuZXJhdGVCdWlsZFBhdGhzLHgtbG9hZCopKSAkKFJlc3VsdERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpY3AgLWYgJChjYWxsIEdlbmVyYXRlQnVpbGRQYXRocyxTeXN0ZW0ubWFwKSAkKFJlc3VsdERpcmVjdG9yeSkKKworY2xlYW46CisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgLXIgJChCdWlsZERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKFJlc3VsdERpcmVjdG9yeSkKKworaW5jbHVkZSBwb3N0Lm1hawpkaWZmIC0tZ2l0IGEveC1sb2FkZXIudmVyc2lvbiBiL3gtbG9hZGVyLnZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmMDk1YgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyLnZlcnNpb24KQEAgLTAsMCArMSBAQAorMS40Nl9PTUFQUFNQXzAzLjAwLjAxLjA2CmRpZmYgLS1naXQgYS94LWxvYWRlci8uZmlsZS1saXN0IGIveC1sb2FkZXIvLmZpbGUtbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWQ1MDY5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvLmZpbGUtbGlzdApAQCAtMCwwICsxLDExMSBAQAorLkBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC81CisuL1JFQURNRUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vYXJtX2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmRAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC80CisuL2JvYXJkL29tYXAxNzEwaDNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAxNzEwaDMvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAxNzEwaDMvY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMTcxMGgzL29tYXAxNzEwaDMuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDE3MTBoMy9wbGF0Zm9ybS5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMTcxMGgzL3gtbG9hZC5sZHNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAyNDIwaDRAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAyNDIwaDQvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAyNDIwaDQvY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMjQyMGg0L29tYXAyNDIwaDQuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vYm9hcmQvb21hcDI0MjBoNC9wbGF0Zm9ybS5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9ib2FyZC9vbWFwMjQyMGg0L3gtbG9hZC5sZHNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAyNDMwc2RwQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9ib2FyZC9vbWFwMjQzMHNkcC9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vYm9hcmQvb21hcDI0MzBzZHAvY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMjQzMHNkcC9vbWFwMjQzMHNkcC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvNworLi9ib2FyZC9vbWFwMjQzMHNkcC9wbGF0Zm9ybS5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9ib2FyZC9vbWFwMjQzMHNkcC94LWxvYWQubGRzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMzQzMHNkcEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDM0MzBzZHAvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAzNDMwc2RwL2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDM0MzBzZHAvb21hcDM0MzBzZHAuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vYm9hcmQvb21hcDM0MzBzZHAvcGxhdGZvcm0uU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vYm9hcmQvb21hcDM0MzBzZHAveC1sb2FkLmxkc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9jcHVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2NwdS9hcm0xMTM2QEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtMTEzNi9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTExMzYvY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvNworLi9jcHUvYXJtMTEzNi9jcHUuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTExMzYvc3RhcnQuU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTkyNmVqc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTkyNmVqcy9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTkyNmVqcy9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2NwdS9hcm05MjZlanMvY3B1LmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9hcm05MjZlanMvc3RhcnQuU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vY3B1L29tYXAzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvb21hcDMvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9vbWFwMy9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9vbWFwMy9jcHUuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L29tYXAzL3N0YXJ0LlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2RyaXZlcnNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2RyaXZlcnMvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2RyaXZlcnMvazlmNTYxNi5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9kcml2ZXJzL2s5azEyMTYuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vZHJpdmVycy9uczE2NTUwLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2RyaXZlcnMvb25lbmFuZC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9kcml2ZXJzL29uZW5hbmRfcmVncy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9kcml2ZXJzL3NlcmlhbC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2QEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvYml0cy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2NrczI0MnguaAorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzMjQzeC5oCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9tZW0uaAorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvb21hcDI0MjAuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L29tYXAyNDMwLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9zaXplcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvc3lzX2luZm8uaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm05MjZlanNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtOTI2ZWpzL3NpemVzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvYml0cy5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY2xvY2tzLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jbG9ja3MzNDN4LmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jcHUuaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL21lbS5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbXV4LmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9vbWFwMzQzMC5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc2l6ZXMuaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3N5c19pbmZvLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zeXNfcHJvdG8uaAorLi9pbmNsdWRlL2FzbS9hdG9taWMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vcHJvYy1hcm12QEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9zZXR1cC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9zaXplcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9zdHJpbmcuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vdHlwZXMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20veC1sb2FkLWFybS5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2NvbW1vbi5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9pbmNsdWRlL2NvbmZpZ3NAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC80CisuL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE3MTBoMy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MjBoNC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvNAorLi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MzBzZHAuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzYKKy4vaW5jbHVkZS9jb25maWdzL29tYXAzNDMwc2RwLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvbGludXhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvbGludXgvY29uZmlnLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvbGludXgvcG9zaXhfdHlwZXMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9saW51eC9zdGRkZWYuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9saW51eC90eXBlcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL25zMTY1NTAuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vbGliQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9saWIvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2xpYi9fdWRpdnNpMy5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9saWIvX3Vtb2RzaTMuU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vbGliL2JvYXJkLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC84CisuL2xpYi9kaXYwLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2xpYi9lY2MuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vbGliL3ByaW50Zi5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ta2NvbmZpZ0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vc2NyaXB0c0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vc2NyaXB0cy9ta29uZWJvb3Quc2hAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCmRpZmYgLS1naXQgYS94LWxvYWRlci9NYWtlZmlsZSBiL3gtbG9hZGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDNkYWUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDM4NiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNiwgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIyBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAxMAorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1ZFUlNJT04gPSAxCitQQVRDSExFVkVMID0gNDYKK1NVQkxFVkVMID0KK0VYVFJBVkVSU0lPTiA9CitpZm5lcSAiJChTVUJMRVZFTCkiICIiCitYX0xPQURFUl9WRVJTSU9OID0gJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pCitlbHNlCitYX0xPQURFUl9WRVJTSU9OID0gJChWRVJTSU9OKS4kKFBBVENITEVWRUwpJChFWFRSQVZFUlNJT04pCitlbmRpZgorVElNRVNUQU1QX0ZJTEUgPSAkKG9iailpbmNsdWRlL3RpbWVzdGFtcF9hdXRvZ2VuZXJhdGVkLmgKK1ZFUlNJT05fRklMRSA9ICQob2JqKWluY2x1ZGUvdmVyc2lvbl9hdXRvZ2VuZXJhdGVkLmgKKworSE9TVEFSQ0ggOj0gJChzaGVsbCB1bmFtZSAtbSB8IFwKKwlzZWQgLWUgcy9pLjg2L2kzODYvIFwKKwkgICAgLWUgcy9zdW40dS9zcGFyYzY0LyBcCisJICAgIC1lIHMvYXJtLiovYXJtLyBcCisJICAgIC1lIHMvc2ExMTAvYXJtLyBcCisJICAgIC1lIHMvcHBjNjQvcG93ZXJwYy8gXAorCSAgICAtZSBzL3BwYy9wb3dlcnBjLyBcCisJICAgIC1lIHMvbWFjcHBjL3Bvd2VycGMvXAorCSAgICAtZSBzL3NoLiovc2gvKQorCitIT1NUT1MgOj0gJChzaGVsbCB1bmFtZSAtcyB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgXAorCSAgICBzZWQgLWUgJ3MvXChjeWd3aW5cKS4qL2N5Z3dpbi8nKQorCisjIFNldCBzaGVsbCB0byBiYXNoIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHNoCitTSEVMTCA6PSAkKHNoZWxsIGlmIFsgLXggIiQkQkFTSCIgXTsgdGhlbiBlY2hvICQkQkFTSDsgXAorCWVsc2UgaWYgWyAteCAvYmluL2Jhc2ggXTsgdGhlbiBlY2hvIC9iaW4vYmFzaDsgXAorCWVsc2UgZWNobyBzaDsgZmk7IGZpKQorCitleHBvcnQJSE9TVEFSQ0ggSE9TVE9TIFNIRUxMCisKKyMgRGVhbCB3aXRoIGNvbGxpZGluZyBkZWZpbml0aW9ucyBmcm9tIHRjc2ggZXRjLgorVkVORE9SPQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFsbG93IGZvciBzaWxlbnQgYnVpbGRzCitpZmVxICgsJChmaW5kc3RyaW5nIHMsJChNQUtFRkxBR1MpKSkKK1hFQ0hPID0gZWNobworZWxzZQorWEVDSE8gPSA6CitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFgtbG9hZGVyIGJ1aWxkIHN1cHBvcnRzIHByb2R1Y2luZyBhIG9iamVjdCBmaWxlcyB0byB0aGUgc2VwYXJhdGUgZXh0ZXJuYWwKKyMgZGlyZWN0b3J5LiBUd28gdXNlIGNhc2VzIGFyZSBzdXBwb3J0ZWQ6CisjCisjIDEpIEFkZCBPPSB0byB0aGUgbWFrZSBjb21tYW5kIGxpbmUKKyMgJ21ha2UgTz0vdG1wL2J1aWxkIGFsbCcKKyMKKyMgMikgU2V0IGVudmlyb25lbWVudCB2YXJpYWJsZSBCVUlMRF9ESVIgdG8gcG9pbnQgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24KKyMgJ2V4cG9ydCBCVUlMRF9ESVI9L3RtcC9idWlsZCcKKyMgJ21ha2UnCisjCisjIFRoZSBzZWNvbmQgYXBwcm9hY2ggY2FuIGFsc28gYmUgdXNlZCB3aXRoIGEgTUFLRUFMTCBzY3JpcHQKKyMgJ2V4cG9ydCBCVUlMRF9ESVI9L3RtcC9idWlsZCcKKyMgJy4vTUFLRUFMTCcKKyMKKyMgQ29tbWFuZCBsaW5lICdPPScgc2V0dGluZyBvdmVycmlkZXMgQlVJTERfRElSIGVudmlyb25lbnQgdmFyaWFibGUuCisjCisjIFdoZW4gbm9uZSBvZiB0aGUgYWJvdmUgbWV0aG9kcyBpcyB1c2VkIHRoZSBsb2NhbCBidWlsZCBpcyBwZXJmb3JtZWQgYW5kCisjIHRoZSBvYmplY3QgZmlsZXMgYXJlIHBsYWNlZCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KKyMKKworaWZkZWYgTworaWZlcSAoIiQob3JpZ2luIE8pIiwgImNvbW1hbmQgbGluZSIpCitCVUlMRF9ESVIgOj0gJChPKQorZW5kaWYKK2VuZGlmCisKK2lmbmVxICgkKEJVSUxEX0RJUiksKQorc2F2ZWQtb3V0cHV0IDo9ICQoQlVJTERfRElSKQorCisjIEF0dGVtcHQgdG8gY3JlYXRlIGEgb3V0cHV0IGRpcmVjdG9yeS4KKyQoc2hlbGwgWyAtZCAke0JVSUxEX0RJUn0gXSB8fCBta2RpciAtcCAke0JVSUxEX0RJUn0pCisKKyMgVmVyaWZ5IGlmIGl0IHdhcyBzdWNjZXNzZnVsLgorQlVJTERfRElSIDo9ICQoc2hlbGwgY2QgJChCVUlMRF9ESVIpICYmIC9iaW4vcHdkKQorJChpZiAkKEJVSUxEX0RJUiksLCQoZXJyb3Igb3V0cHV0IGRpcmVjdG9yeSAiJChzYXZlZC1vdXRwdXQpIiBkb2VzIG5vdCBleGlzdCkpCitlbmRpZiAjIGlmbmVxICgkKEJVSUxEX0RJUiksKQorCitPQkpUUkVFCQk6PSAkKGlmICQoQlVJTERfRElSKSwkKEJVSUxEX0RJUiksJChDVVJESVIpKQorU1JDVFJFRQkJOj0gJChDVVJESVIpCitUT1BESVIJCTo9ICQoU1JDVFJFRSkKK0xORElSCQk6PSAkKE9CSlRSRUUpCitleHBvcnQJVE9QRElSIFNSQ1RSRUUgT0JKVFJFRQorCitNS0NPTkZJRwk6PSAkKFNSQ1RSRUUpL21rY29uZmlnCitleHBvcnQgTUtDT05GSUcKKworaWZuZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKK1JFTU9URV9CVUlMRAk6PSAxCitleHBvcnQgUkVNT1RFX0JVSUxECitlbmRpZgorCisjICQob2JqKSBhbmQgKHNyYykgYXJlIGRlZmluZWQgaW4gY29uZmlnLm1rIGJ1dCBoZXJlIGluIG1haW4gTWFrZWZpbGUKKyMgd2UgYWxzbyBuZWVkIHRoZW0gYmVmb3JlIGNvbmZpZy5tayBpcyBpbmNsdWRlZCB3aGljaCBpcyB0aGUgY2FzZSBmb3IKKyMgc29tZSB0YXJnZXRzIGxpa2UgdW5jb25maWcsIGNsZWFuLCBjbG9iYmVyLCBkaXN0Y2xlYW4sIGV0Yy4KK2lmbmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCitvYmogOj0gJChPQkpUUkVFKS8KK3NyYyA6PSAkKFNSQ1RSRUUpLworZWxzZQorb2JqIDo9CitzcmMgOj0KK2VuZGlmCitleHBvcnQgb2JqIHNyYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlICJ0b29scyIgYXJlIG5lZWRlZCBlYXJseSwgc28gcHV0IHRoaXMgZmlyc3QKKyMgRG9uJ3QgaW5jbHVkZSBzdHVmZiBhbHJlYWR5IGRvbmUgaW4gJChMSUJTKQorU1VCRElSUyA9IHRvb2xzCisuUEhPTlkgOiAkKFNVQkRJUlMpCisKK2lmZXEgKCQob2JqKWluY2x1ZGUvY29uZmlnLm1rLCQod2lsZGNhcmQgJChvYmopaW5jbHVkZS9jb25maWcubWspKQorCisjIEluY2x1ZGUgYXV0b2NvbmYubWsgYmVmb3JlIGNvbmZpZy5tayBzbyB0aGF0IHRoZSBjb25maWcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlCisjIHRvIGFsbCB0b3AgbGV2ZWwgYnVpbGQgZmlsZXMuICBXZSBuZWVkIHRoZSBkdW1teSBhbGw6IHRhcmdldCB0byBwcmV2ZW50IHRoZQorIyBkZXBlbmRlbmN5IHRhcmdldCBpbiBhdXRvY29uZi5tay5kZXAgZnJvbSBiZWluZyB0aGUgZGVmYXVsdC4KK2FsbDoKK3NpbmNsdWRlICQob2JqKWluY2x1ZGUvYXV0b2NvbmYubWsuZGVwCitzaW5jbHVkZSAkKG9iailpbmNsdWRlL2F1dG9jb25mLm1rCisKKyMgbG9hZCBBUkNILCBCT0FSRCwgYW5kIENQVSBjb25maWd1cmF0aW9uCitpbmNsdWRlICQob2JqKWluY2x1ZGUvY29uZmlnLm1rCitleHBvcnQJQVJDSCBDUFUgQk9BUkQgVkVORE9SIFNPQworCisjIHNldCBkZWZhdWx0IHRvIG5vdGhpbmcgZm9yIG5hdGl2ZSBidWlsZHMKK2lmZXEgKCQoSE9TVEFSQ0gpLCQoQVJDSCkpCitDUk9TU19DT01QSUxFID89CitlbmRpZgorCisjIGxvYWQgb3RoZXIgY29uZmlndXJhdGlvbgoraW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgWC1Mb2FkIG9iamVjdHMuLi4ub3JkZXIgaXMgaW1wb3J0YW50IChpLmUuIHN0YXJ0IG11c3QgYmUgZmlyc3QpCisKK09CSlMgID0gJChDUFVESVIpL3N0YXJ0Lm8KKworT0JKUyA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChPQkpTKSkKKworTElCUyArPSAkKHNoZWxsIGlmIFsgLWYgYm9hcmQvJChWRU5ET1IpL2NvbW1vbi9NYWtlZmlsZSBdOyB0aGVuIGVjaG8gXAorCSJib2FyZC8kKFZFTkRPUikvY29tbW9uL2xpYiQoVkVORE9SKS5hIjsgZmkpCitMSUJTICs9ICQoQ1BVRElSKS9saWIkKENQVSkuYQorTElCUyArPSBsaWIvbGliJChBUkNIKS5hCitMSUJTICs9IGNvbW1vbi9saWJjb21tb24uYQorTElCUyArPSBmcy9mYXQvbGliZmF0LmEKK0xJQlMgKz0gZGlzay9saWJkaXNrLmEKK0xJQlMgKz0gZHJpdmVycy9tdGQvbmFuZC9saWJuYW5kLmEKK0xJQlMgKz0gZHJpdmVycy9tdGQvb25lbmFuZC9saWJvbmVuYW5kLmEKK0xJQlMgKz0gZHJpdmVycy9ydGMvbGlicnRjLmEKK0xJQlMgKz0gZHJpdmVycy9zZXJpYWwvbGlic2VyaWFsLmEKK0xJQlMgKz0gZHJpdmVycy91c2IvbGlidXNiLmEKKworTElCUyA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChMSUJTKSkKKy5QSE9OWSA6ICQoTElCUykgJChUSU1FU1RBTVBfRklMRSkgJChWRVJTSU9OX0ZJTEUpCisKK0xJQkJPQVJEID0gYm9hcmQvJChCT0FSRERJUikvbGliJChCT0FSRCkuYQorTElCQk9BUkQgOj0gJChhZGRwcmVmaXggJChvYmopLCQoTElCQk9BUkQpKQorCisjIEFkZCBHQ0MgbGliCitQTEFURk9STV9MSUJHQ0MgPSAtTCAkKHNoZWxsIGRpcm5hbWUgYCQoQ0MpICQoQ0ZMQUdTKSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZWApIC1sZ2NjCitQTEFURk9STV9MSUJTICs9ICQoUExBVEZPUk1fTElCR0NDKQorZXhwb3J0IFBMQVRGT1JNX0xJQlMKKworX19PQkpTIDo9ICQoc3Vic3QgJChvYmopLCwkKE9CSlMpKQorX19MSUJTIDo9ICQoc3Vic3QgJChvYmopLCwkKExJQlMpKSAkKHN1YnN0ICQob2JqKSwsJChMSUJCT0FSRCkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBBbHdheXMgYXBwZW5kIEFMTCBzbyB0aGF0IGFyY2ggY29uZmlnLm1rJ3MgY2FuIGFkZCBjdXN0b20gb25lcworQUxMICs9ICQob2JqKXgtbG9hZC5zcmVjICQob2JqKXgtbG9hZC5iaW4gJChvYmopeC1sb2FkLmJpbi5pZnQgJChvYmopU3lzdGVtLm1hcAorCithbGw6CQkkKEFMTCkKKworJChvYmopeC1sb2FkLmhleDoJJChvYmopeC1sb2FkCisJCSQoT0JKQ09QWSkgJHtPQkpDRkxBR1N9IC1PIGloZXggJDwgJEAKKworJChvYmopeC1sb2FkLnNyZWM6CSQob2JqKXgtbG9hZAorCQkkKE9CSkNPUFkpIC1PIHNyZWMgJDwgJEAKKworJChvYmopeC1sb2FkLmJpbjoJJChvYmopeC1sb2FkCisJCSQoT0JKQ09QWSkgJHtPQkpDRkxBR1N9IC1PIGJpbmFyeSAkPCAkQAorCiskKG9iail4LWxvYWQuYmluLmlmdDoJJChvYmopeC1sb2FkLmJpbgorCQkkKG9iail0b29scy9zaWduR1AgJDwKKworJChvYmopeC1sb2FkLmRpczoJJChvYmopeC1sb2FkCisJCSQoT0JKRFVNUCkgLWQgJDwgPiAkQAorCitHRU5fWExPQUQgPSBcCisJCVVOREVGX1NZTT1gJChPQkpEVU1QKSAteCAkKExJQkJPQVJEKSAkKExJQlMpIHwgXAorCQlzZWQgIC1uIC1lICdzLy4qXCgkKFNZTV9QUkVGSVgpX191X2Jvb3RfY21kXy4qXCkvLXVcMS9wJ3xzb3J0fHVuaXFgO1wKKwkJY2QgJChMTkRJUikgJiYgJChMRCkgJChMREZMQUdTKSAkJFVOREVGX1NZTSAkKF9fT0JKUykgXAorCQkJLS1zdGFydC1ncm91cCAkKF9fTElCUykgLS1lbmQtZ3JvdXAgJChQTEFURk9STV9MSUJTKSBcCisJCQktTWFwIHgtbG9hZC5tYXAgLW8geC1sb2FkCQorJChvYmopeC1sb2FkOglkZXBlbmQgJChTVUJESVJTKSAkKE9CSlMpICQoTElCQk9BUkQpICQoTElCUykgJChMRFNDUklQVCkgJChvYmopeC1sb2FkLmxkcworCQkkKEdFTl9YTE9BRCkKKworJChPQkpTKToJZGVwZW5kCisJCSQoTUFLRSkgLUMgJChDUFVESVIpICQoaWYgJChSRU1PVEVfQlVJTEQpLCRALCQobm90ZGlyICRAKSkKKworJChMSUJTKToJZGVwZW5kICQoU1VCRElSUykKKwkJJChNQUtFKSAtQyAkKGRpciAkKHN1YnN0ICQob2JqKSwsJEApKQorCiskKExJQkJPQVJEKToJZGVwZW5kICQoTElCUykKKwkJJChNQUtFKSAtQyAkKGRpciAkKHN1YnN0ICQob2JqKSwsJEApKQorCiskKFNVQkRJUlMpOglkZXBlbmQKKwkJJChNQUtFKSAtQyAkQCBhbGwKKworJChMRFNDUklQVCk6CWRlcGVuZAorCQkkKE1BS0UpIC1DICQoZGlyICRAKSAkKG5vdGRpciAkQCkKKworJChvYmopeC1sb2FkLmxkczogJChMRFNDUklQVCkKKwkJJChDUFApICQoQ1BQRkxBR1MpICQoTERQUEZMQUdTKSAtYW5zaSAtRF9fQVNTRU1CTFlfXyAtUCAtIDwkXiA+JEAKKworJChvYmopb25lYm9vdDoJJChvYmopeC1sb2FkLmJpbgorCQlzY3JpcHRzL21rb25lYm9vdC5zaAorJChWRVJTSU9OX0ZJTEUpOgorCQlAKCBwcmludGYgJyNkZWZpbmUgWF9MT0FERVJfVkVSU0lPTiAiVGV4YXMgSW5zdHJ1bWVudHMgWC1Mb2FkZXIgJXMlcyJcbicgIiQoWF9MT0FERVJfVkVSU0lPTikiIFwKKwkJICckKHNoZWxsICQoVE9QRElSKS90b29scy9zZXRsb2NhbHZlcnNpb24gJChUT1BESVIpKScgKSA+ICRALnRtcAorCQlAY21wIC1zICRAICRALnRtcCAmJiBybSAtZiAkQC50bXAgfHwgbXYgLWYgJEAudG1wICRACisKKyQoVElNRVNUQU1QX0ZJTEUpOgorCQlATENfQUxMPUMgZGF0ZSArJyNkZWZpbmUgWF9MT0FERVJfREFURSAiJWIgJWQgJUMleSInID4gJEAKKwkJQExDX0FMTD1DIGRhdGUgKycjZGVmaW5lIFhfTE9BREVSX1RJTUUgIiVUIicgPj4gJEAKKworIyBFeHBsaWNpdGx5IG1ha2UgX2RlcGVuZCBpbiBzdWJkaXJzIGNvbnRhaW5pbmcgbXVsdGlwbGUgdGFyZ2V0cyB0byBwcmV2ZW50CisjIHBhcmFsbGVsIHN1Yi1tYWtlcyBjcmVhdGluZyAuZGVwZW5kIGZpbGVzIHNpbXVsdGFuZW91c2x5LgorZGVwZW5kIGRlcDoJJChUSU1FU1RBTVBfRklMRSkgJChWRVJTSU9OX0ZJTEUpCisJCWZvciBkaXIgaW4gJChTVUJESVJTKSAkKENQVURJUikgJChkaXIgJChMRFNDUklQVCkpIDsgZG8gXAorCQkJJChNQUtFKSAtQyAkJGRpciBfZGVwZW5kIDsgZG9uZQorCitUQUdfU1VCRElSUyA9ICQoU1VCRElSUykKK1RBR19TVUJESVJTICs9ICQoZGlyICQoX19MSUJTKSkKK1RBR19TVUJESVJTICs9IGluY2x1ZGUKKwordGFncyBjdGFnczoKKwkJY3RhZ3MgLXcgLW8gJChvYmopY3RhZ3MgYGZpbmQgJChUQUdfU1VCRElSUykgXAorCQkJCQkJLW5hbWUgJyouW2NoU10nIC1wcmludGAKKworZXRhZ3M6CisJCWV0YWdzIC1hIC1vICQob2JqKWV0YWdzIGBmaW5kICQoVEFHX1NVQkRJUlMpIFwKKwkJCQkJCS1uYW1lICcqLltjaFNdJyAtcHJpbnRgCitjc2NvcGU6CisJCWZpbmQgJChUQUdfU1VCRElSUykgLW5hbWUgJyouW2NoU10nIC1wcmludCA+IGNzY29wZS5maWxlcworCQljc2NvcGUgLWIgLXEgLWsKKworU1lTVEVNX01BUCA9IFwKKwkJJChOTSkgJDEgfCBcCisJCWdyZXAgLXYgJ1woY29tcGlsZWRcKVx8XChcLm8kJFwpXHxcKCBbYVV3XSBcKVx8XChcLlwubmckJFwpXHxcKExBU0hbUkxdRElcKScgfCBcCisJCUxDX0FMTD1DIHNvcnQKKyQob2JqKVN5c3RlbS5tYXA6CSQob2JqKXgtbG9hZAorCQlAJChjYWxsIFNZU1RFTV9NQVAsJDwpID4gJChvYmopU3lzdGVtLm1hcAorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZWxzZQkjICFjb25maWcubWsKK2FsbCAkKG9iail4LWxvYWQuaGV4ICQob2JqKXgtbG9hZC5zcmVjICQob2JqKXgtbG9hZC5iaW4gXAorJChvYmopeC1sb2FkLmRpcyAkKG9iail4LWxvYWQgXAorJChvYmopb25lYm9vdCBcCiskKGZpbHRlci1vdXQgdG9vbHMsJChTVUJESVJTKSkgJChUSU1FU1RBTVBfRklMRSkgJChWRVJTSU9OX0ZJTEUpIFwKK2RlcGVuZCBkZXAgdGFncyBjdGFncyBldGFncyBjc2NvcGUgJChvYmopU3lzdGVtLm1hcDoKKwlAZWNobyAiU3lzdGVtIG5vdCBjb25maWd1cmVkIC0gc2VlIFJFQURNRSIgPiYyCisJQCBleGl0IDEKKwordG9vbHM6CisJJChNQUtFKSAtQyB0b29scwordG9vbHMtYWxsOgorCSQoTUFLRSkgLUMgdG9vbHMgSE9TVF9UT09MU19BTEw9eQorZW5kaWYJIyBjb25maWcubWsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCit1bmNvbmZpZzoKKwlAcm0gLWYgJChvYmopaW5jbHVkZS9jb25maWcuaCAkKG9iailpbmNsdWRlL2NvbmZpZy5taworCislX2NvbmZpZzo6CXVuY29uZmlnCisJQCQoTUtDT05GSUcpIC1BICQoQDpfY29uZmlnPSkKKworIworIyBGdW5jdGlvbnMgdG8gZ2VuZXJhdGUgY29tbW9uIGJvYXJkIGRpcmVjdG9yeSBuYW1lcworIworbGNuYW1lCT0gJChzaGVsbCBlY2hvICQoMSkgfCBzZWQgLWUgJ3MvXCguKlwpX2NvbmZpZy9cTFwxLycpCit1Y25hbWUJPSAkKHNoZWxsIGVjaG8gJCgxKSB8IHNlZCAtZSAncy9cKC4qXClfY29uZmlnL1xVXDEvJykKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBBUk0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIE9NQVAxIChBUk05MnhUKSBTeXN0ZW1zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK29tYXAxNzEwaDNfY29uZmlnIDogICAgdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtOTI2ZWpzIG9tYXAxNzEwaDMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgT01BUDIgKEFSTTExMzYpIFN5c3RlbXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworb21hcDI0MjBoNF9jb25maWcgOiAgICB1bmNvbmZpZworCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBhcm0xMTM2IG9tYXAyNDIwaDQKKworb21hcDI0MzBzZHBfY29uZmlnIDogICAgdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtMTEzNiBvbWFwMjQzMHNkcAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBPTUFQMyAoQVJNLUNvcnRleEE4KSBTeXN0ZW1zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitvbWFwMzQzMHNkcF9jb25maWcgOiAgICB1bmNvbmZpZworCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBvbWFwMyBvbWFwMzQzMHNkcAorCitvbWFwMzQzMGxhYnJhZG9yX2NvbmZpZyA6ICAgIHVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIG9tYXAzIG9tYXAzNDMwbGFicmFkb3IKKworb21hcDNldm1fY29uZmlnIDoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gb21hcDMgb21hcDNldm0KKworYW0zNTE3ZXZtX2NvbmZpZyA6ICAgICAgIHVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIG9tYXAzIGFtMzUxN2V2bQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitjbGVhbjoKKwlAcm0gLWYgJChvYmopdG9vbHMvc2lnbkdQCisJQHJtIC1mICQoVElNRVNUQU1QX0ZJTEUpICQoVkVSU0lPTl9GSUxFKQorCUBmaW5kICQoT0JKVFJFRSkgLXR5cGUgZiBcCisJCVwoIC1uYW1lICdjb3JlJyAtbyAtbmFtZSAnKi5iYWsnIC1vIC1uYW1lICcqficgXAorCQktbyAtbmFtZSAnKi5vJwktbyAtbmFtZSAnKi5hJyAtbyAtbmFtZSAnKi5leGUnCVwpIC1wcmludCBcCisJCXwgeGFyZ3Mgcm0gLWYKKworY2xvYmJlcjoJY2xlYW4KKwlAZmluZCAkKE9CSlRSRUUpIC10eXBlIGYgXCggLW5hbWUgLmRlcGVuZCBcCisJCS1vIC1uYW1lICcqLnNyZWMnIC1vIC1uYW1lICcqLmJpbicgLW8gLW5hbWUgJyouYmluLmlmdCcgXCkgXAorCQktcHJpbnQwIFwKKwkJfCB4YXJncyAtMCBybSAtZgorCUBybSAtZiAkKE9CSlMpICQob2JqKSouYmFrICQob2JqKWN0YWdzICQob2JqKWV0YWdzICQob2JqKVRBR1MgXAorCQkkKG9iailjc2NvcGUuKiAkKG9iaikqLip+CisJQHJtIC1mICQob2JqKXgtbG9hZCAkKG9iail4LWxvYWQubWFwICQob2JqKXgtbG9hZC5oZXggJChBTEwpCisJQHJtIC1mICQob2JqKWluY2x1ZGUvYXNtL3Byb2MgJChvYmopaW5jbHVkZS9hc20vYXJjaCAkKG9iailpbmNsdWRlL2FzbQorCitpZmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCittcnByb3BlciBcCitkaXN0Y2xlYW46CWNsb2JiZXIgdW5jb25maWcKK2Vsc2UKK21ycHJvcGVyIFwKK2Rpc3RjbGVhbjoJY2xvYmJlciB1bmNvbmZpZworCXJtIC1yZiAkKG9iaikqCitlbmRpZgorCitiYWNrdXA6CisJRj1gYmFzZW5hbWUgJChUT1BESVIpYCA7IGNkIC4uIDsgXAorCWd0YXIgLS1mb3JjZS1sb2NhbCAtemN2ZiBgTENfQUxMPUMgZGF0ZSAiKyQkRi0lWS0lbS0lZC0lVC50YXIuZ3oiYCAkJEYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvUkVBRE1FIGIveC1sb2FkZXIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMjY2MmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9SRUFETUUKQEAgLTAsMCArMSwxNTIgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgU29tZSBjdXQvcGFzdGUgZnJvbSBVLUJvb3QgUkVBRE1FCisjIChDKSBDb3B5cmlnaHQgMjAwMCAtIDIwMDQKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitTdW1tYXJ5OgorPT09PT09PT0KKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIHNvdXJjZSBjb2RlIGZvciBYLUxvYWRlciwgYW4gaW5pdGlhbCBwcm9ncmFtCitsb2FkZXIgZm9yIEVtYmVkZGVkIGJvYXJkcyBiYXNlZCBvbiBPTUFQIHByb2Nlc3NvcnMuIFgtTG9hZGVyIGNhbiBiZQorc2lnbmVkIGJ5IFRleGFzIEluc3RydW1lbnRzIElGVCBhbmQgaW5zdGFsbGVkIHRvIE5hbmQgZmxhc2ggdG8gYWNoaWV2ZQorTmFuZCBib290aW5nLgorCisKK1N0YXR1czoKKz09PT09PT0KKworVGhlIHN1cHBvcnQgZm9yIFRleGFzIEluc3RydW1lbnRzIEgzIGJvYXJkIChPTUFQMTcxMCkgaGFzIGJlZW4gaW1wbGVtZW50ZWQKK2FuZCB0ZXN0ZWQuIChNYXkgMjAwNCkKK1RoZSBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyBINCBib2FyZCAoT01BUDI0MjApIGhhcyBiZWVuIGltcGxlbWVudGVkCithbmQgdGVzdGVkLiAoTm92IDIwMDQpCitUaGUgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgMjQzMFNEUCBib2FyZCAoT01BUDI0MzApIGhhcyBiZWVuIGltcGxlbWVudGVkCithbmQgdGVzdGVkLiAoSnVsIDIwMDYpCitUaGUgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgMzQzMFNEUCBib2FyZCAoT01BUDM0MzApIGhhcyBiZWVuIGltcGxlbWVudGVkCithbmQgdGVzdGVkLiAoRGVjIDIwMDYpCisKKworU3VwcG9ydCBmb3Igb3RoZXIgT01BUCBib2FyZHMgY2FuIGJlIGFkZGVkLgorIAorICAKK0RpcmVjdG9yeSBIaWVyYXJjaHk6Cis9PT09PT09PT09PT09PT09PT09PQorCistIGJvYXJkCQlCb2FyZCBkZXBlbmRlbnQgZmlsZXMKKy0gY3B1CQlDUFUgc3BlY2lmaWMgZmlsZXMKKy0gZHJpdmVycwlDb21tb25seSB1c2VkIGRldmljZSBkcml2ZXJzCistIGxpYgkJTGlicmFyaWVzCisgCistIGNwdS9hcm05MjZlanMgRmlsZXMgc3BlY2lmaWMgdG8gQVJNIDkyNiBDUFVzCistIGNwdS9hcm0xMTM2IEZpbGVzIHNwZWNpZmljIHRvIEFSTSAxMTM2IENQVXMKKy0gY3B1L29tYXAzIEZpbGVzIHNwZWNpZmljIHRvIEFSTSBDb3J0ZXhBOCBDUFUKKworIAorLSBib2FyZC9vbWFwMTcxMGgzCisJCUZpbGVzIHNwZWNpZmljIHRvIE9NQVAgMTcxMCBIMyBib2FyZHMKKy0gYm9hcmQvb21hcDI0MjBoNAorCQlGaWxlcyBzcGVjaWZpYyB0byBPTUFQIDI0MjAgSDQgYm9hcmRzCistIGJvYXJkL29tYXAyNDMwc2RwCisJCUZpbGVzIHNwZWNpZmljIHRvIE9NQVAgMjQzMCAyNDMwc2RwIGJvYXJkcworLSBib2FyZC9vbWFwMzQzMHNkcAorCQlGaWxlcyBzcGVjaWZpYyB0byBPTUFQIDM0MjBzZHAgYm9hcmRzCisKKyAKK1NvZnR3YXJlIENvbmZpZ3VyYXRpb246Cis9PT09PT09PT09PT09PT09PT09PT09PQorCitDb25maWd1cmF0aW9uIGlzIHVzdWFsbHkgZG9uZSB1c2luZyBDIHByZXByb2Nlc3NvciBkZWZpbmVzLiBDb25maWd1cmF0aW9uCitkZXBlbmRzIG9uIHRoZSBjb21iaW5hdGlvbiBvZiBib2FyZCBhbmQgQ1BVIHR5cGU7IGFsbCBzdWNoIGluZm9ybWF0aW9uIGlzCitrZXB0IGluIGEgY29uZmlndXJhdGlvbiBmaWxlICJpbmNsdWRlL2NvbmZpZ3MvPGJvYXJkX25hbWU+LmgiLgorCitFeGFtcGxlOiBGb3IgYSBIMyBtb2R1bGUsIGFsbCBjb25maWd1cmF0aW9uIHNldHRpbmdzIGFyZSBpbgorImluY2x1ZGUvY29uZmlncy9vbWFwMTcxMGgzLmgiLgorICAKK0ZvciBhbGwgc3VwcG9ydGVkIGJvYXJkcyB0aGVyZSBhcmUgcmVhZHktdG8tdXNlIGRlZmF1bHQKK2NvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZTsganVzdCB0eXBlICJtYWtlIDxib2FyZF9uYW1lPl9jb25maWciLgorCitFeGFtcGxlOiBGb3IgYSBIMyBtb2R1bGUgdHlwZToKKworCWNkIHgtbG9hZAorCW1ha2Ugb21hcDE3MTBoM19jb25maWcKKworQWZ0ZXIgYSBib2FyZCBoYXMgYmVlbiBjb25maWd1cmVkLCB0eXBlICJtYWtlIiB0byBidWlsZCBpdCBzdXBwb3NpbmcgdGhlCituZWVkZWQgY3Jvc3MgdG9vbHMgYXJlIGluIHlvdXIgcGF0aC4KKworIAorSW1hZ2UgRm9ybWF0OgorPT09PT09PT09PT09PQorCitYLUxvYWRlciBleHBlY3RzIE9TIGJvb3QgbG9hZGVyIChlLmcuIFUtQm9vdCkgaW4gTmFuZCBmbGFzaCB1c2luZworSkZGUzIgc3R5bGUgRUNDLiAKKworCitQcmVwYXJlIEJvb3RpbmcgTmFuZCBGbGFzaDoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBZnRlciB5b3UgaGF2ZSBidWlsdCB4LWxvYWQuYmluIGZvciB5b3VyIGJvYXJkLCB5b3UgbmVlZCB0byBkbyB0aGUKK2ZvbGxvd2luZ3MgdG8gZ2V0IGl0IGludG8gTmFuZCBmbGFzaDoKKworMS4gVXNlIFRleGFzIEluc3RydW1lbnRzIElGVCB0byBzaWduIHgtbG9hZC5iaW4uIFRoaXMgcmVzdWx0cyBpbiBhCitzaWduZWQgaW1hZ2UgY2FsbGVkIHgtbG9hZC5iaW4uaWZ0LgorMi4gVXNlIFRleGFzIEluc3RydW1lbnRzIEZsYXNoUHJlcCB0byBnZW5lcmF0ZSBhIC5vdXQgZmlsZSB1c2luZworRmxhc2hXcml0ZXJOYW5kIGFuZCBzcGVjaWZ5aW5nIDAgYXMgbmFuZCB0YXJnZXQgYWRkcmVzcy4KKzMuIFVzZSBUZXhhcyBpbnN0cnVtbmV0cyBDb2RlIENvbXBvc2VyIFN0dWRpbyB0byBydW4gdGhlIC5vdXQgZmlsZSAKK3doaWNoIGZsYXNoZXMgeC1sb2FkLmJpbi5pZnQgdG8gTmFuZCBmbGFzaC4KKworTmV4dCB5b3UgbmVlZCB0byBnZXQgeW91ciBPUyBib290IGxvYWRlciB0byBOYW5kIGF0IHRoZSBhZGRyZXNzIHlvdXIKK1gtTG9hZGVyIGV4cGVjdHMuIEZvciB0aGUgSDMgZXhhbXBsZSwgeW91IGNhbiB1c2UgVS1Cb290IHRvIGZsYXNoIFUtQm9vdC4KK1lvdSBjYW4ndCB1c2UgRmxhc2hXcml0ZXJOYW5kIGJlY2F1c2UgaXQgdXNlcyBST00gY29kZSBFQ0Mgc3R5bGUuICAKKworCitNb3JlIEluZm9ybWF0aW9uCis9PT09PT09PT09PT09PT09CisKK09NQVAxNzEwIE5BTkQgQm9vdGluZyBEZXNpZ24gRG9jdW1lbnQgaGFzIG1vcmUgaW5mb3JtYXRpb24uCisKK0ltcGxlbWVuYXRpb24gbm90ZXM6Cis9PT09PT09PT09PT09PT09PT09PQorSDMsIEg0IHN1cHBvcnQgTkFORCBmbGFzaCBib290aW5nCisyNDMwc2RwICYgMzQzMHNkcCBzdXBwb3J0IE9uZU5BTkQgYm9vdGluZworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2FybV9jb25maWcubWsgYi94LWxvYWRlci9hcm1fY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZDk2MjUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9hcm1fY29uZmlnLm1rCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfQVJNIC1EX19BUk1fXwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYzI5MjQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vTWFrZWZpbGUKQEAgLTAsMCArMSw0OSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDkKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIyBNYW5pa2FuZGFuIFBpbGxhaTxtYW5pLnBpbGxhaUB0aS5jb20+CisjIFRoaXMgZmlsZSBpcyBjb3BpZWQgZnJvbSBib2FyZC9vbWFwM2V2bS9NYWtlZmlsZQorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IGFtMzUxN2V2bS5vCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL2FtMzUxN2V2bS5jIGIveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL2FtMzUxN2V2bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDRiZTkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vYW0zNTE3ZXZtLmMKQEAgLTAsMCArMSw5MDggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDkKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIE1hbmlrYW5kYW4gUGlsbGFpPG1hbmkucGlsbGFpQHRpLmNvbT4KKyAqIFRoaXMgZmlsZSBpcyBjb3BpZWQgZnJvbSBib2FyZC9vbWFwM2V2bS9vbWFwM2V2bS5jCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisgICAgICAgIHVuc2lnbmVkIGludCBtOworICAgICAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGZzZWw7CisgICAgICAgIHVuc2lnbmVkIGludCBtMjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworI2RlZmluZSBNQVhfU0lMX0lOREVYCTMKKworLyogRGVmaW5pdGlvbnMgZm9yIEVNSUY0IGNvbmZpZ3VyYXRpb24gdmFsdWVzICovCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SUAkJMHgzCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SQ0QJMHgzCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9XUgkJMHgzCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SQVMJMHg4CisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SQwkJMHhBCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SUkQJMHgyCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9XVFIJMHgyCisKKyNkZWZpbmUJRU1JRjRfVElNMl9UX1hQCQkweDIKKyNkZWZpbmUJRU1JRjRfVElNMl9UX09EVAkweDAKKyNkZWZpbmUJRU1JRjRfVElNMl9UX1hTTlIJMHgxQworI2RlZmluZQlFTUlGNF9USU0yX1RfWFNSRAkweEM4CisjZGVmaW5lCUVNSUY0X1RJTTJfVF9SVFAJMHgxCisjZGVmaW5lCUVNSUY0X1RJTTJfVF9DS0UJMHgyCisKKyNkZWZpbmUJRU1JRjRfVElNM19UX1REUVNDS01BWAkweDAKKyNkZWZpbmUJRU1JRjRfVElNM19UX1JGQwkweDI1CisjZGVmaW5lCUVNSUY0X1RJTTNfVF9SQVNfTUFYCTB4NworCisjZGVmaW5lCUVNSUY0X1BXUl9JRExFCQkweDIKKyNkZWZpbmUJRU1JRjRfUFdSX0RQRF9FTgkweDAKKyNkZWZpbmUJRU1JRjRfUFdSX1BNX0VOCQkweDAKKyNkZWZpbmUJRU1JRjRfUFdSX1BNX1RJTQkweDAKKworI2RlZmluZQlFTUlGNF9JTklUUkVGX0RJUwkweDAKKyNkZWZpbmUJRU1JRjRfUEFTUgkJMHgwCisjZGVmaW5lCUVNSUY0X1JFRlJFU0hfUkFURQkweDUwRgorCisvKgorICogU0RSQU0gQ29uZmlnIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUJRU1JRjRfQ0ZHX1NEUkFNX1RZUAkweDIKKyNkZWZpbmUJRU1JRjRfQ0ZHX0lCQU5LX1BPUwkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX0REUl9URVJNCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfRERSMl9ERFFTCTB4MQorI2RlZmluZQlFTUlGNF9DRkdfRFlOX09EVAkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX0REUl9ESVNfRExMCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfU0RSX0RSVgkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX0NXTAkJMHgwCisjZGVmaW5lCUVNSUY0X0NGR19OQVJST1dfTUQJMHgwCisjZGVmaW5lCUVNSUY0X0NGR19DTAkJMHg1CisjZGVmaW5lCUVNSUY0X0NGR19ST1dTSVpFCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfSUJBTksJCTB4MworI2RlZmluZQlFTUlGNF9DRkdfRUJBTksJCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfUEdTSVpFCTB4MgorCisvKgorICogRU1JRjQgUEhZIENvbnRyb2wgMSByZWdpc3RlciBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgRU1JRjRfRERSMV9SRF9MQVQJMHg2CisjZGVmaW5lCUVNSUY0X0REUjFfUFdSRE5fRElTCTB4MAorI2RlZmluZSBFTUlGNF9ERFIxX1NUUkJFTl9FWFQJMHgwCisjZGVmaW5lIEVNSUY0X0REUjFfRExMX01PREUJMHgwCisjZGVmaW5lIEVNSUY0X0REUjFfVlRQX0RZTgkweDAKKyNkZWZpbmUgRU1JRjRfRERSMV9MQl9DS19TRUwJMHgwCisKKy8qCisgKiBFTUlGNCBQSFkgQ29udHJvbCAyIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBFTUlGNF9ERFIyX1RYX0RBVEFfQUxJR04JMHgwCisjZGVmaW5lIEVNSUY0X0REUjJfUlhfRExMX0JZUEFTUwkweDAKKworLyogRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsb3dsZXZlbF9pbml0LlMgKi8KK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfbXB1X2RwbGxfcGFyYW0odm9pZCk7CisjaWYgMAorZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKKyNlbmRpZgorZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCitleHRlcm4gaW50IG1tY19pbml0KGludCB2ZXJib3NlKTsKK2V4dGVybiBibG9ja19kZXZfZGVzY190ICptbWNfZ2V0X2RldihpbnQgZGV2KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogYm9hcmRfaW5pdAorICogRGVzY3JpcHRpb246IEVhcmx5IGhhcmR3YXJlIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogVE9ETzogTW92ZSBpdCB0byBjb21tb24gcGxhY2Ugc28gdGhhdCBzaG91bGQgYmUgdXNlZAorICogZm9yIGFsbCBPTUFQIHNlcmllcyBvZiBkZXZpY2VzCisgKi8KK3UzMiBpc19jcHVfZmFtaWx5KHZvaWQpCit7CisJdTMyIGNwdWlkID0gMCwgY3B1X2ZhbWlseSA9IDA7CisJdTE2IGhhd2tleWU7CisKKwljcHVpZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0NPTlRST0xfSUQpOworCWhhd2tleWUgID0gKGNwdWlkID4+IEhBV0tFWUVfU0hJRlQpICYgMHhmZmZmOworCisJc3dpdGNoIChoYXdrZXllKSB7CisJY2FzZSBIQVdLRVlFX0FNMzVYWDoKKwlkZWZhdWx0OgorCQljcHVfZmFtaWx5ID0gQ1BVX0FNMzVYWDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBjcHVfZmFtaWx5OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBnZXRfZGV2aWNlX3R5cGUoKTogdGVsbCBpZiBHUC9IUy9FTVUvVFNUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoREVWSUNFX01BU0spOworICAgICAgICByZXR1cm4obW9kZSA+Pj0gOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNib290X3ZhbHVlKHZvaWQpIC0gcmV0dXJuIFNZU19CT09UWzQ6MF0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoU1lTQk9PVF9NQVNLKTsKKyAgICAgICAgcmV0dXJuIG1vZGU7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZ2V0X21lbV90eXBlKHZvaWQpIC0gcmV0dXJucyB0aGUga2luZCBvZiBtZW1vcnkgY29ubmVjdGVkCisgKiB0byBHUE1DIHRoYXQgd2UgYXJlIHRyeWluZyB0byBib290IGZvcm0uIFVzZXMgU1lTIEJPT1Qgc2V0dGluZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfbWVtX3R5cGUodm9pZCkKK3sKKyAgICAgICAgdTMyICAgbWVtX3R5cGUgPSBnZXRfc3lzYm9vdF92YWx1ZSgpOworICAgICAgICBzd2l0Y2ggKG1lbV90eXBlKXsKKworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgY2FzZSAyNzogICAgcmV0dXJuIEdQTUNfTkFORDsKKworCisKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAJCXJldHVybiBNTUNfTkFORDsKKworICAgICAgICAgICAgZGVmYXVsdDogICAgcmV0dXJuIEdQTUNfTkFORDsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9jcHVfcmV2KHZvaWQpCit7CisJdTMyIGNwdWlkPTA7CisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisJaWYoKGNwdWlkICAmIDB4ZikgPT0gMHgwKQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMxOworCWVsc2UKKwkJcmV0dXJuIENQVV8zNDMwX0VTMjsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHNyMzIgLSBjbGVhciAmIHNldCBhIHZhbHVlIGluIGEgYml0IHJhbmdlIGZvciBhIDMyIGJpdCBhZGRyZXNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisJbXNrID0gMSA8PCBudW1fYml0czsKKwktLW1zazsKKwl0bXAgPSBfX3Jhd19yZWFkbChhZGRyKSAmIH4obXNrIDw8IHN0YXJ0X2JpdCk7CisJdG1wIHw9ICB2YWx1ZSA8PCBzdGFydF9iaXQ7CisJX19yYXdfd3JpdGVsKHRtcCwgYWRkcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhaXRfb25fdmFsdWUoKSAtIGNvbW1vbiByb3V0aW5lIHRvIGFsbG93IHdhaXRpbmcgZm9yIGNoYW5nZXMgaW4KKyAqICAgdm9sYXRpbGUgcmVncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgd2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjb25maWdfZW1pZjRfZGRyKCkgLSBJbml0L0NvbmZpZ3VyZSBERFIgb24gQU0zNTE3IEVWTSBib2FyZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNvbmZpZ19lbWlmNF9kZHIodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVndmFsOworCisJLyogU2V0IHRoZSBERFIgUEhZIHBhcmFtZXRlcnMgaW4gUEhZIGN0cmwgcmVnaXN0ZXJzICovCisJcmVndmFsID0gKEVNSUY0X0REUjFfUkRfTEFUIHwgKEVNSUY0X0REUjFfUFdSRE5fRElTIDw8IDYpIHwKKwkJKEVNSUY0X0REUjFfU1RSQkVOX0VYVCA8PCA3KSB8IChFTUlGNF9ERFIxX0RMTF9NT0RFIDw8IDEyKSB8CisJCShFTUlGNF9ERFIxX1ZUUF9EWU4gPDwgMTUpIHwgKEVNSUY0X0REUjFfTEJfQ0tfU0VMIDw8IDIzKSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfRERSX1BIWUNUTDEpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X0REUl9QSFlDVEwxX1NIRFcpOworCisJcmVndmFsID0gKEVNSUY0X0REUjJfVFhfREFUQV9BTElHTiB8IChFTUlGNF9ERFIyX1JYX0RMTF9CWVBBU1MgPDwgMSkpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X0REUl9QSFlDVEwyKTsKKworCS8qIFJlc2V0IHRoZSBERFIgUEhZIGFuZCB3YWl0IHRpbGwgY29tcGxldGVkICovCisJc3IzMihFTUlGNF9JT0RGVF9UTEdDLCAxMCwgMSwgMSk7CisJLypXYWl0IHRpbGwgdGhhdCBiaXQgY2xlYXJzKi8KKwl3aGlsZSAoKF9fcmF3X3JlYWRsKEVNSUY0X0lPREZUX1RMR0MpICYgQklUMTApID09IDB4MSk7CisJLypSZS12ZXJpZnkgdGhlIEREUiBQSFkgc3RhdHVzKi8KKwl3aGlsZSAoKF9fcmF3X3JlYWRsKEVNSUY0X1NEUkFNX1NUUykgJiBCSVQyKSA9PSAweDApOworCisJc3IzMihFTUlGNF9JT0RGVF9UTEdDLCAwLCAxLCAxKTsKKwkvKiBTZXQgU0RSIHRpbWluZyByZWdpc3RlcnMgKi8KKwlyZWd2YWwgPSAoRU1JRjRfVElNMV9UX1dUUiB8IChFTUlGNF9USU0xX1RfUlJEIDw8IDMpIHwKKwkJKEVNSUY0X1RJTTFfVF9SQyA8PCA2KSB8IChFTUlGNF9USU0xX1RfUkFTIDw8IDEyKSB8CisJCShFTUlGNF9USU0xX1RfV1IgPDwgMTcpIHwgKEVNSUY0X1RJTTFfVF9SQ0QgPDwgMjEpIHwKKwkJKEVNSUY0X1RJTTFfVF9SUCA8PCAyNSkpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTEpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTFfU0hEVyk7CisKKwlyZWd2YWwgPSAoRU1JRjRfVElNMl9UX0NLRSB8IChFTUlGNF9USU0yX1RfUlRQIDw8IDMpIHwKKwkJKEVNSUY0X1RJTTJfVF9YU1JEIDw8IDYpIHwgKEVNSUY0X1RJTTJfVF9YU05SIDw8IDE2KSB8CisJCShFTUlGNF9USU0yX1RfT0RUIDw8IDI1KSB8IChFTUlGNF9USU0yX1RfWFAgPDwgMjgpKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9USU0yKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9USU0yX1NIRFcpOworCisJcmVndmFsID0gKEVNSUY0X1RJTTNfVF9SQVNfTUFYIHwgKEVNSUY0X1RJTTNfVF9SRkMgPDwgNCkgfAorCQkoRU1JRjRfVElNM19UX1REUVNDS01BWCA8PCAxMykpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTMpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTNfU0hEVyk7CisKKwkvKiBTZXQgdGhlIFBXUiBjb250cm9sIHJlZ2lzdGVyICovCisJcmVndmFsID0gKEVNSUY0X1BXUl9QTV9USU0gfCAoRU1JRjRfUFdSX1BNX0VOIDw8IDgpIHwKKwkJKEVNSUY0X1BXUl9EUERfRU4gPDwgMTApIHwgKEVNSUY0X1BXUl9JRExFIDw8IDMwKSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfUFdSX01HVF9DVFJMKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9QV1JfTUdUX0NUUkxfU0hEVyk7CisKKwkvKiBTZXQgdGhlIEREUiByZWZyZXNoIHJhdGUgY29udHJvbCByZWdpc3RlciAqLworCXJlZ3ZhbCA9IChFTUlGNF9SRUZSRVNIX1JBVEUgfCAoRU1JRjRfUEFTUiA8PCAyNCkgfAorCQkoRU1JRjRfSU5JVFJFRl9ESVMgPDwgMzEpKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9SRkNSKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9SRkNSX1NIRFcpOworCisJLyogc2V0IHRoZSBTRFJBTSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJcmVndmFsID0gKEVNSUY0X0NGR19QR1NJWkUgfCAoRU1JRjRfQ0ZHX0VCQU5LIDw8IDMpIHwKKwkJKEVNSUY0X0NGR19JQkFOSyA8PCA0KSB8IChFTUlGNF9DRkdfUk9XU0laRSA8PCA3KSB8CisJCShFTUlGNF9DRkdfQ0wgPDwgMTApIHwgKEVNSUY0X0NGR19OQVJST1dfTUQgPDwgMTQpIHwKKwkJKEVNSUY0X0NGR19DV0wgPDwgMTYpIHwgKEVNSUY0X0NGR19TRFJfRFJWIDw8IDE4KSB8CisJCShFTUlGNF9DRkdfRERSX0RJU19ETEwgPDwgMjApIHwgKEVNSUY0X0NGR19EWU5fT0RUIDw8IDIxKSB8CisJCShFTUlGNF9DRkdfRERSMl9ERFFTIDw8IDIzKSB8IChFTUlGNF9DRkdfRERSX1RFUk0gPDwgMjQpIHwKKwkJKEVNSUY0X0NGR19JQkFOS19QT1MgPDwgMjcpIHwgKEVNSUY0X0NGR19TRFJBTV9UWVAgPDwgMjkpKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9DRkcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtfc3BlZWQgLSBkZXRlcm1pbmUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQKKyAqICBiYXNlZCBvbiBrbm93biAzMmtIeiBjbG9jayBhbmQgZ3B0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCS8qIElmIFNZU19DTEsgaXMgYmVpbmcgZGl2aWRlZCBieSAyLCByZW1vdmUgZm9yIG5vdyAqLworCXZhbCA9ICh2YWwgJiAofkJJVDcpKSB8IEJJVDY7CisJX19yYXdfd3JpdGVsKHZhbCwgUFJNX0NMS1NSQ19DVFJMKTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtpbl9zZWwoKSAtIHJldHVybnMgdGhlIHN5c19jbGtpbl9zZWwgZmllbGQgdmFsdWUgYmFzZWQgb24KKyAqICAgLS0gaW5wdXQgb3NjaWxsYXRvciBjbG9jayBmcmVxdWVuY3kuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBnZXRfc3lzX2Nsa2luX3NlbCh1MzIgb3NjX2NsaywgdTMyICpzeXNfY2xraW5fc2VsKQoreworCWlmKG9zY19jbGsgPT0gUzM4XzRNKQorCQkqc3lzX2Nsa2luX3NlbD0gIDQ7CisJZWxzZSBpZihvc2NfY2xrID09IFMyNk0pCisJCSpzeXNfY2xraW5fc2VsID0gMzsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzE5XzJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDI7CisJZWxzZSBpZihvc2NfY2xrID09IFMxM00pCisJCSpzeXNfY2xraW5fc2VsID0gMTsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEyTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwcmNtX2luaXQoKSAtIGluaXRzIGNsb2NrcyBmb3IgUFJDTSBhcyBkZWZpbmVkIGluIGNsb2Nrcy5oCisgKiAgIC0tIGNhbGxlZCBmcm9tIFNSQU0sIG9yIEZsYXNoICh1c2luZyB0ZW1wIFNSQU0gc3RhY2spLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgb3NjX2Nsaz0wLCBzeXNfY2xraW5fc2VsOworCWRwbGxfcGFyYW0gKmRwbGxfcGFyYW1fcDsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJb3NjX2NsayA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwob3NjX2NsaywgJnN5c19jbGtpbl9zZWwpOworCisJc3IzMihQUk1fQ0xLU0VMLCAwLCAzLCBzeXNfY2xraW5fc2VsKTsgLyogc2V0IGlucHV0IGNyeXN0YWwgc3BlZWQgKi8KKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZS8yICovCisJaWYoc3lzX2Nsa2luX3NlbCA+IDIpIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDIpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbC8yOworCX0gZWxzZSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAxKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWw7CisJfQorCisJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZQorCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LgorCSAqLworCXNpbF9pbmRleCA9IGdldF9jcHVfcmV2KCkgLSAxOworCisJLyogVW5sb2NrIE1QVSBEUExMIChzbG93cyB0aGluZ3MgZG93biwgYW5kIG5lZWRlZCBsYXRlcikgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT1dfUE9XRVJfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogQ09SRSBEUExMICovCisJLyogc3IzMihDTV9DTEtTRUwyX0VNVSkgc2V0IG92ZXJyaWRlIHRvIHdvcmsgd2hlbiBhc2xlZXAgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CS8qIG0zeDIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgMiwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIFNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogU2V0IE0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBTZXQgTiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOwkJCS8qIDk2TSBTcmMgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIFBFUiAgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgY2xrX2luZGV4OworCS8qIFBFUiBEUExMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJLyogc2V0IE0zICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIHNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBzZXQgbSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIHNldCBuICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOy8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBTZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIFNldCBNICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7IC8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRyeV91bmxvY2tfbWVtb3J5KHZvaWQpCit7CisJaW50IG1vZGU7CisKKwkvKiBpZiBHUCBkZXZpY2UgdW5sb2NrIGRldmljZSBTUkFNIGZvciBnZW5lcmFsIHVzZSAqLworCS8qIHNlY3VyZSBjb2RlIGJyZWFrcyBmb3IgU2VjdXJlL0VtdWxhdGlvbiBkZXZpY2UgLSBIUy9FL1QqLworCW1vZGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKwlpZiAobW9kZSA9PSBHUF9ERVZJQ0UpIHsKKwkJc2VjdXJlX3VubG9jaygpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzX2luaXQKKyAqIERlc2NyaXB0aW9uOiBEb2VzIGVhcmx5IHN5c3RlbSBpbml0IG9mIG11eGluZyBhbmQgY2xvY2tzLgorICogLSBDYWxsZWQgYXQgdGltZSB3aGVuIG9ubHkgc3RhY2sgaXMgYXZhaWxhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworI2lmZGVmIENPTkZJR18zNDMwX0FTXzM0MTAKKwkvKiBzZXR1cCB0aGUgc2NhbGFiaWxpdHkgY29udHJvbCByZWdpc3RlciBmb3IKKwkgKiAzNDMwIHRvIHdvcmsgaW4gMzQxMCBtb2RlCisJICovCisJX19yYXdfd3JpdGVsKDB4NUFCRixDT05UUk9MX1NDQUxBQkxFX09NQVBfT0NQKTsKKyNlbmRpZgorCXRyeV91bmxvY2tfbWVtb3J5KCk7CisJc2V0X211eGNvbmZfcmVncygpOworCWRlbGF5KDEwMCk7CisJcHJjbV9pbml0KCk7CisJcGVyX2Nsb2Nrc19lbmFibGUoKTsKKworCS8qIGVuYWJsZSB0aGUgRERSUEhZIGNsayAqLworCXNyMzIoKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NTg4KSwgMTUsIDE1LCAweDEpOworCS8qIGVuYWJsZSB0aGUgRU1JRjQgY2xrICovCisJc3IzMigoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHg1ODgpLCAxNCwgMTQsIDB4MSk7CisJLyogRW5hYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrcyAqLworCXNyMzIoKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NTlDKSwgMCwgNCwgMHhGKTsKKwlzcjMyKChPTUFQMzRYWF9DVFJMX0JBU0UgKyAweDU5QyksIDgsIDEwLCAweDcpOworCisJLyogYnJpbmcgY3BnbWFjIG91dCBvZiByZXNldCAqLworCXNyMzIoKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NTk4KSwgMSwgMSwgMHgxKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgRU1JRjQgZm9yIG91ciBERFIgKi8KKwljb25maWdfZW1pZjRfZGRyKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBtaXNjX2luaXRfcgorICogRGVzY3JpcHRpb246IEluaXQgZXRoZXJuZXQgKGRvbmUgaGVyZSBzbyB1ZGVsYXkgd29ya3MpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkcmFtX2luaXQKKyAqIERlc2NyaXB0aW9uOiBzZXRzIHVib290cyBpZGVhIG9mIHNkcmFtIHNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBlcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworCisJLyogRW5hYmxlIFVBUlQyIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxNCwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTQsIDEsIDB4MSk7CisKKwkvKiBFbmFibGUgVUFSVDIgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAxMSwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTl9QRVIsIDExLCAxLCAweDEpOworI2VuZGlmCisJLyogRW5hYmxlIE1NQzEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKworCS8qIEVuYWJsZSBNTUMyIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAyNSwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMjUsIDEsIDB4MSk7CisKKwlkZWxheSgxMDAwKTsKK30KKworLyogU2V0IE1VWCBmb3IgVUFSVCwgR1BNQywgU0RSQywgR1BJTyAqLworCisvKgorICogSUVOICAtIElucHV0IEVuYWJsZQorICogSURJUyAtIElucHV0IERpc2FibGUKKyAqIFBURCAgLSBQdWxsIHR5cGUgRG93bgorICogUFRVICAtIFB1bGwgdHlwZSBVcAorICogRElTICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgaW5hY3RpdmUKKyAqIEVOICAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGFjdGl2ZQorICogTTAgICAtIE1vZGUgMAorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICovCisjZGVmaW5lIE1VWF9ERUZBVUxUKClcCisJTVVYX1ZBTChDUChTRFJDX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENCovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19DTEsqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMzKi9cCisJTVVYX1ZBTChDUChzZHJjX2NrZTApLCAgICAgIChNMCkpIC8qU0RSQ19DS0UwKi9cCisJTVVYX1ZBTChDUChzZHJjX2NrZTEpLCAgICAgIChNMCkpIC8qU0RSQ19DS0UxKi9cCisJTVVYX1ZBTChDUChHUE1DX0ExKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTIpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EzKi9cCisJTVVYX1ZBTChDUChHUE1DX0E0KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTUpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E3KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTcqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTgpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0ExMCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENCovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDYqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDkqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MwKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MzKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M2Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNyovXAorCU1VWF9WQUwoQ1AoR1BNQ19DTEspLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0NMSyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05BRFZfQUxFKi9cCisJTVVYX1ZBTChDUChHUE1DX05PRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTk9FKi9cCisJTVVYX1ZBTChDUChHUE1DX05XRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkJFMF9DTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182MSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XUCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQwKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT182NCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMyksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzY1Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fODgqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184OSovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzkwKi9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIxKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOTEqL1wKKwlNVVhfVkFMKENQKENBTV9XRU4pLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNjcqL1wKKwlNVVhfVkFMKENQKFVBUlQzX1RYX0lSVFgpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9UWCovXAorCU1VWF9WQUwoQ1AoVUFSVDNfUlRTX1NEKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQzX0NUU19SQ1RYKSwgICAgICAoSUVOIHwgUFRVIHwgRElTIHwgTTApKSAvKlVBUlQxX0NUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDNfUlhfSVJSWCksICAgICAgIChJRU4gfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfUlgqL1wKKwkvKkV4cGFuc2lvbiBjYXJkICAqL1wKKwlNVVhfVkFMKENQKE1NQzFfQ0xLKSwgICAgICAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qTU1DMV9DTEsqL1wKKwlNVVhfVkFMKENQKE1NQzFfQ01EKSwgICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9DTUQqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUMCksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQwKi9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDEpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUMSovXAorCU1VWF9WQUwoQ1AoTU1DMV9EQVQyKSwgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0RBVDIqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUMyksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQzKi9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDQpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUNCovXAorCU1VWF9WQUwoQ1AoTU1DMV9EQVQ1KSwgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0RBVDUqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUNiksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQ2Ki9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDcpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUNyovXAorCU1VWF9WQUwoQ1AoTWNCU1AxX0RYKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE1OCovXAorCU1VWF9WQUwoQ1AoU1lTXzMySyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTWVNfMzJLKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMiAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18zICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzQgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNSAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzcgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOCAqL1wKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT18xODYqL1wKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19uVFJTVCovXAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RDSyovXAorCU1VWF9WQUwoQ1AoSlRBR19UTVMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RNUyovXAorCU1VWF9WQUwoQ1AoSlRBR19UREkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RESSovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTAqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUxKi9cCisJTVVYX1ZBTChDUChFVEtfQ0xLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTIqL1wKKwlNVVhfVkFMKENQKEVUS19DVEwpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMyovXAorCU1VWF9WQUwoQ1AoRVRLX0QwICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTUqL1wKKwlNVVhfVkFMKENQKEVUS19EMiApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDExKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjUqL1wKKwlNVVhfVkFMKENQKEVUS19EMTIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI3Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjgqL1wKKwlNVVhfVkFMKENQKEVUS19EMTUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZXRfbXV4Y29uZl9yZWdzCisgKiBEZXNjcmlwdGlvbjogU2V0dGluZyB1cCB0aGUgY29uZmlndXJhdGlvbiBNdXggcmVnaXN0ZXJzCisgKiAgICAgICAgICAgICAgc3BlY2lmaWMgdG8gdGhlIGhhcmR3YXJlLiBNYW55IHBpbnMgbmVlZAorICogICAgICAgICAgICAgIHRvIGJlIG1vdmVkIGZyb20gcHJvdGVjdCB0byBwcmltYXJ5IG1vZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJTVVYX0RFRkFVTFQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG5hbmQrX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTZXQgdXAgbmFuZCBmb3IgbmFuZCBhbmQgamZmczIgY29tbWFuZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBuYW5kX2luaXQodm9pZCkKK3sKKwkvKiBnbG9iYWwgc2V0dGluZ3MgKi8KKwlfX3Jhd193cml0ZWwoMHgxMCwgR1BNQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlICovCisJX19yYXdfd3JpdGVsKDB4MCwgR1BNQ19JUlFFTkFCTEUpOwkvKiBpc3IncyBzb3VyY2VzIG1hc2tlZCAqLworCV9fcmF3X3dyaXRlbCgwLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7LyogdGltZW91dCBkaXNhYmxlICovCisKKwkvKiBTZXQgdGhlIEdQTUMgVmFscyAuIEZvciBOQU5EIGJvb3Qgb24gMzQzMFNEUCwgTkFORCBpcyBtYXBwZWQgYXQgQ1MwCisgICAgICAgICAqICAsIE5PUiBhdCBDUzEgYW5kIE1QREIgYXQgQ1MzLiBBbmQgb25lTkFORCBib290LCB3ZSBtYXAgb25lTkFORCBhdCBDUzAuCisJICogIFdlIGNvbmZpZ3VyZSBvbmx5IEdQTUMgQ1MwIHdpdGggcmVxdWlyZWQgdmFsdWVzLiBDb25maWdpcmluZyBvdGhlciBkZXZpY2VzCisJICogIGF0IG90aGVyIENTIGluIGRvbmUgaW4gdS1ib290IGFueXdheS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBib3RoZXIgZG9pbmcgaXQgaGVyZS4KKyAgICAgICAgICovCisJX19yYXdfd3JpdGVsKDAgLCBHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApOworCWRlbGF5KDEwMDApOworCisJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX05BTkQpIHx8IChnZXRfbWVtX3R5cGUoKSA9PSBNTUNfTkFORCkpeworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworCisgICAgICAgIAkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworICAgICAgICAJX19yYXdfd3JpdGVsKCggKChPTUFQMzRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorICAgICAgICAJCSAgICAgKChOQU5EX0JBU0VfQURSPj4yNCkgJiAweDNGKSB8CisgICAgICAgIAkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKyAgICAgICAgCWRlbGF5KDIwMDApOworCisgICAgICAgICAJaWYgKG5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisgICAgICAgIAkJcHJpbnRmKCJVbnN1cHBvcnRlZCBDaGlwIVxuIik7CisjZW5kaWYKKyAgICAgICAgCQlyZXR1cm4gMTsKKyAgICAgICAgCX0KKworCX0KKworCWlmICgoZ2V0X21lbV90eXBlKCkgPT0gR1BNQ19PTkVOQU5EKSB8fCAoZ2V0X21lbV90eXBlKCkgPT0gTU1DX09ORU5BTkQpKXsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKworICAgICAgICAJLyogRW5hYmxlIHRoZSBHUE1DIE1hcHBpbmcgKi8KKyAgICAgICAgCV9fcmF3X3dyaXRlbCgoICgoT01BUDM0WFhfR1BNQ19DUzBfU0laRSAmIDB4Rik8PDgpIHwKKyAgICAgICAgCQkgICAgICgoT05FTkFORF9CQVNFPj4yNCkgJiAweDNGKSB8CisgICAgICAgIAkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKyAgICAgICAgCWRlbGF5KDIwMDApOworCisgICAgICAgIAlpZiAob25lbmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKyAgICAgICAgCQlwcmludGYoIk9uZU5BTkQgVW5zdXBwb3J0ZWQgIVxuIik7CisjZW5kaWYKKyAgICAgICAgCQlyZXR1cm4gMTsKKyAgICAgICAgCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKwordHlwZWRlZiBpbnQgKG1tY19ib290X2FkZHIpICh2b2lkKTsKK2ludCBtbWNfYm9vdCh1bnNpZ25lZCBjaGFyICpidWYpCit7CisKKyAgICAgICBsb25nIHNpemUgPSAwOworI2lmZGVmIENGR19DTURfRkFUCisgICAgICAgYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MgPSBOVUxMOworICAgICAgIHVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgWC1sb2FkZXIgb24gTU1DIFxuIik7CisKKyAgICAgICByZXQgPSBtbWNfaW5pdCgxKTsKKyAgICAgICBpZihyZXQgPT0gMCl7CisgICAgICAgICAgICAgICBwcmludGYoIlxuIE1NQyBpbml0IGZhaWxlZCBcbiIpOworICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgZGV2X2Rlc2MgPSBtbWNfZ2V0X2RldigwKTsKKyAgICAgICBmYXRfcmVnaXN0ZXJfZGV2aWNlKGRldl9kZXNjLCAxKTsKKyAgICAgICBzaXplID0gZmlsZV9mYXRfcmVhZCgidS1ib290LmJpbiIsIGJ1ZiwgMCk7CisgICAgICAgaWYgKHNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKyAgICAgICBwcmludGYoIlxuJWxkIEJ5dGVzIFJlYWQgZnJvbSBNTUMgXG4iLCBzaXplKTsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgT1MgQm9vdGxvYWRlciBmcm9tIE1NQy4uLlxuIik7CisjZW5kaWYKKyAgICAgICByZXR1cm4gc2l6ZTsKK30KKworLyogb3B0aW9uYWxseSBkbyBzb21ldGhpbmcgbGlrZSBibGlua2luZyBMRUQgKi8KK3ZvaWQgYm9hcmRfaGFuZyAodm9pZCkKK3sgd2hpbGUgKDApIHt9O30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjEyYTQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vY29uZmlnLm1rCkBAIC0wLDAgKzEsMTkgQEAKKyMgKEMpIENvcHlyaWdodCAyMDA5CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgT01BUDNFVk0gYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cyMKKyMKKyMgT01BUDNFVk0gaGFzIDEgYmFuayBvZiAxMjhNQiBtUE9QLVNEUkFNIG9uIENTMAorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwMDgwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOThmNmU3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL3BsYXRmb3JtLlMKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA5CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBNYW5pa2FuZGFuIFBpbGxhaSA8bWFuaS5waWxsYWlAdGkuY29tPgorICogVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIGJvYXJkL29tYXAzZXZtL3BsYXRmb3JtLlMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLgorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLworICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzEpCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzMpCitmbGFzaF9jZmczX3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc1KQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorCisjZW5kaWYKKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRQorLndvcmQgMHgwNworLndvcmQgMHgwNQorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDFGNAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5Cisud29yZCAweDEyCisud29yZCAweDA0Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDE5Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEKKy53b3JkIDB4MzIKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE2OAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDBCCisud29yZCAweDA2Cisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YKKy53b3JkIDB4MzAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MEUKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MTAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNEMKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgyMQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgxMworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0veC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmUwY2U1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOQorICogTWFuaWthbmRhbiBQaWxsYWk8bWFuaS5waWxsYWlAdGkuY29tPgorICogVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIGJvYXJkL29tYXAzZXZtL3gtbG9hZC5sZHMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjY3OTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvTWFrZWZpbGUKQEAgLTAsMCArMSw2MiBAQAorIworIyAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlIGZpbGUgZm9yIHBvcnRpb25zIG9mIFgtTG9hZGVyIHNwZWNpZmljCisjICAgICAgdG8gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyMKKworIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gZGlhbW9uZC5vIG11eC5vIHByY20ubworU09CSlMJOj0gcGxhdGZvcm0ubworCitDUFBGTEFHUyArPSAtSSQoVE9QRElSKS9ib2FyZC8kKEJPQVJERElSKQorCitTUkNTICAgIDo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQorCiskKExJQik6ICQob2JqKS5kZXBlbmQgJChTT0JKUykgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChTT0JKUykgJChPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjogIGNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxMzgwYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9jb25maWcubWsKQEAgLTAsMCArMSwyMSBAQAorCisKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgT01BUDNFVk0gYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cyMKKyMKKyMgT01BUDNFVk0gaGFzIDEgYmFuayBvZiAxMjhNQiBtUE9QLVNEUkFNIG9uIENTMAorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwMDgwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL2RpYW1vbmQuYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9kaWFtb25kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwNmY2NwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9kaWFtb25kLmMKQEAgLTAsMCArMSwxMDc1IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogICAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0FDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBvbiBHUElPLCBSQU0gYW5kIGZsYXNoIGluaXRpYWxpemF0aW9uLgorICoKKyAqICAgICAgVGhpcyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgT01BUDMgRVZNIGVxdWl2YWxlbnQgZmlsZS4KKyAqCisgKiAgICAgIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG9yZGVyIGlzIHJvdWdobHk6CisgKgorICogICAgICAgIDEpIHNfaW5pdAorICogICAgICAgIDIpIGJvYXJkX2luaXQKKyAqICAgICAgICAzKSBtaXNjX2luaXRfcgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjZGVmaW5lIE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUyAoMSkKKworCit2b2lkCit1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykgeworCWRlbGF5KHVzZWNzKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2dldF9jcHVfaWQodm9pZCkKK3sKKwl1MzIgY3B1aWQgPSAwOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisKKwlyZXR1cm4gKGNwdWlkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlpZiAoKGNwdWlkICAmIDB4ZikgPT0gMHgwKSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMxKTsKKworCX0gZWxzZSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMyKTsKKworCX0KKworfQorCit1MzIKK2lzX2NwdV9mYW1pbHkodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisJdTMyIGNwdV9mYW1pbHkgPSAwLCBvbWFwMzR4eF9pZCA9IDA7CisJdTE2IGhhd2tleWU7CisKKwlpZiAoKGNwdWlkICYgMHhmKSA9PSAweDApIHsKKwkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKworCX0gZWxzZSB7CisJCW9tYXAzNHh4X2lkID0gX19yYXdfcmVhZGwoT01BUDM0WFhfQ09OVFJPTF9JRCk7CisJCWhhd2tleWUgID0gKG9tYXAzNHh4X2lkID4+IEhBV0tFWUVfU0hJRlQpICYgMHhmZmZmOworCisJCXN3aXRjaCAoaGF3a2V5ZSkgeworCisJCWNhc2UgSEFXS0VZRV9BTTM1WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX0FNMzVYWDsKKwkJCWJyZWFrOworCisJCWNhc2UgSEFXS0VZRV9PTUFQMzZYWDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM2WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM0WFg6CisJCWRlZmF1bHQ6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCQkJYnJlYWs7CisKKwkJfQorCX0KKworCXJldHVybiAoY3B1X2ZhbWlseSk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorY3B1X2lzXzM0MTAodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCWlmKGdldF9jcHVfcmV2KCkgPCBDUFVfMzQzMF9FUzIpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogcmVhZCBzY2FsYWJpbGl0eSBzdGF0dXMgYW5kIHJldHVybiAxIGZvciAzNDEwKi8KKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX1NUQVRVUyk7CisJCS8qIENoZWNrIHdoZXRoZXIgTVBVIGZyZXF1ZW5jeSBpcyBzZXQgdG8gMjY2IE1IeiB3aGljaAorCQkgKiBpcyBub21pbmFsIGZvciAzNDEwLiBJZiB5ZXMgcmV0dXJuIHRydWUgZWxzZSBmYWxzZQorCQkgKi8KKwkJaWYgKCgoc3RhdHVzID4+IDgpICYgMHgzKSA9PSAweDIpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogIHZvaWQgc3IzMigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGNsZWFycyBhbmQgc2V0cyBhIHZhbHVlIGluIGEgYml0IGV4dGVudCBmb3IgYQorICogICAgMzItYml0IHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyBhdCB3aGljaCB0byBjbGVhciBhbmQgc2V0IHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICAgICAgICAgIHNwZWNpZmllZCAzMi1iaXQgdmFsdWUuCisgKiAgICBzdGFydF9iaXQgLSBUaGUgZmlyc3QgYml0IG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgbnVtX2JpdHMgIC0gVGhlIHJhbmdlIG9mIGJpdHMgb2YgdGhlIDMyLWJpdCBkYXRhIHRvIGNsZWFyIGFuZCBzZXQuCisgKiAgICB2YWx1ZSAgICAgLSBUaGUgdmFsdWUgdG8gc2V0LgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyB3aXRoIHRoZSBzcGVjaWZpZWQgYml0IGV4dGVudCBjbGVhcmVkIGFuZAorICogICAgICAgICAgICAgICAgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisKKwltc2sgPSAoMSA8PCBudW1fYml0cyk7CisJLS1tc2s7CisJdG1wID0gX19yYXdfcmVhZGwoYWRkcikgJiB+KG1zayA8PCBzdGFydF9iaXQpOworCXRtcCB8PSAgdmFsdWUgPDwgc3RhcnRfYml0OworCV9fcmF3X3dyaXRlbCh0bXAsIGFkZHIpOworfQorCisvKgorICogIHUzMiB3YWl0X29uX3ZhbHVlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmVhZHMgdGhlIHJlZ2lzdGVyIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBhbmQKKyAqICAgIGJ1c3kgd2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCBtYXRjaCB2YWx1ZSBpcyByZWFkIG9yIHVudGlsIHRoZQorICogICAgYm91bmRlZCBudW1iZXIgb2YgbG9vcHMgaGF2ZSBiZWVuIHJlYWNoZWQuCisgKgorICogIElucHV0KHMpOgorICogICAgcmVhZF9iaXRfbWFzayAtIFRoZSBiaXQgbWFzayB0byBhcHBseSBhZnRlciByZWFkaW5nIHRoZSByZWdpc3Rlci4KKyAqICAgIG1hdGNoX3ZhbHVlICAgLSBUaGUgdmFsdWUgdG8gbWF0Y2ggb24gYWZ0ZXIgcmVhZGluZyBhbmQgbWFza2luZy4KKyAqICAgIHJlYWRfYWRkciAgICAgLSBUaGUgcmVnaXN0ZXIgYWRkcmVzcyB0byByZWFkLgorICogICAgYm91bmQgICAgICAgICAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0byByZWFkIGJlZm9yZSBnaXZpbmcKKyAqICAgICAgICAgICAgICAgICAgICB1cC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUcnVlICgxKSBpZiB0aGUgbWF0Y2hfdmFsdWUgd2FzIHJlYWNoZWQ7IG90aGVyd2lzZSwgZmFsc2UgKDApLgorICoKKyAqLwordTMyCit3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit0cnlfdW5sb2NrX21lbW9yeSh2b2lkKQoreworCWNvbnN0IGludCB0eXBlID0gZ2V0X2RldmljZV90eXBlKCk7CisKKwkvKgorCSAqIElmIHRoZSBwcm9jZXNzb3IgaXMgYSBHUCBkZXZpY2UsIHVubG9jayB0aGUgZGV2aWNlIFNSQU0gZm9yCisJICogZ2VuZXJhbCB1c2UuCisJICovCisKKwlpZiAodHlwZSA9PSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0dQKSB7CisJCXNlY3VyZV91bmxvY2soKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKyNpZiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBTRFJDIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChTRFJDX1JFVklTSU9OKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNDT05GSUcpOworCURVTVBfUkVHTChTRFJDX1NZU1NUQVRVUyk7CisJRFVNUF9SRUdMKFNEUkNfQ1NfQ0ZHKTsKKwlEVU1QX1JFR0woU0RSQ19TSEFSSU5HKTsKKwlEVU1QX1JFR0woU0RSQ19FUlJfQUREUik7CisJRFVNUF9SRUdMKFNEUkNfRVJSX1RZUEUpOworCURVTVBfUkVHTChTRFJDX0RMTEFfQ1RSTCk7CisJRFVNUF9SRUdMKFNEUkNfRExMQV9TVEFUVVMpOworCURVTVBfUkVHTChTRFJDX1BPV0VSX1JFRyk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18wKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8wKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzApOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzApOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQ0ZHXzEpOworCURVTVBfUkVHTChTRFJDX01SXzEpOworCURVTVBfUkVHTChTRFJDX0VNUjJfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEFfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEJfMSk7CisJRFVNUF9SRUdMKFNEUkNfUkZSX0NUUkxfMSk7CisJRFVNUF9SRUdMKFNEUkNfTUFOVUFMXzEpOworfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykgKi8KKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgR1BNQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woR1BNQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKEdQTUNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUVNUQVRVUyk7CisJRFVNUF9SRUdMKEdQTUNfSVJRRU5BQkxFKTsKKwlEVU1QX1JFR0woR1BNQ19USU1FT1VUX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX0VSUl9BRERSRVNTKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfVFlQRSApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRyApOworCURVTVBfUkVHTChHUE1DX1NUQVRVUyApOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18wKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMSk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzIpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18zKTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNCk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM181KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzUpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN182KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNyk7CisKKyNpZiAwCisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF83KTsKKworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU182KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV81KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzcpOworCisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMSk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMik7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfU1RBVFVTKTsKKworCURVTVBfUkVHTChHUE1DX0VDQ19DT05GSUcpOworCURVTVBfUkVHTChHUE1DX0VDQ19DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfU0laRV9DT05GSUcpOworCisJRFVNUF9SRUdMKEdQTUNfRUNDMV9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzJfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MzX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNF9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzVfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M2X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDN19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzhfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M5X1JFU1VMVCk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM180KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM181KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM182KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM183KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9TV0RBVEEpOworI2VuZGlmCit9CisjZWxzZQorIyBkZWZpbmUgb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19QUkNNX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIFBSQ00gUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKFBSQ01fUFJNX0NDUl9DTEtTRUwpOworCURVTVBfUkVHTChQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwzX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0NBTSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DT1JFKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0RTUyk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfRU1VKTsKK30KKyNlbHNlCisjZGVmaW5lIG9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDRkdfUFJDTV9ERUJVRyAqLworCisvKgorICogIHZvaWQgY29uZmlnX2RpYW1vbmRfc2RyYW0oKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgcHJvY2Vzc29yJ3MgU0RSQU0gQ29udHJvbGxlciAoU0RSQykKKyAqICAgIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgMzIgTWIgeCAxNiBiICg2NAorICogICAgTWlCKSBERFIgU0RSQU0gb24gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2NvbmZpZ19kaWFtb25kX3NkcmFtKHZvaWQpCit7CisJdTMyIHZhbHVlLCBhY3RpbV9jdHJsYSwgYWN0aW1fY3RybGI7CisKKwkvKgorCSAqIFN0ZXAgMTogUmVzZXQgdGhlIFNEUkMgY29udHJvbGxlciBhbmQgdGhlbiB3YWl0IGZvciB0aGUgcmVzZXQKKwkgKiBldmVudCB0byBjbGVhci4KKwkgKi8KKworICAgIF9fcmF3X3dyaXRlbChTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfU0VULCBTRFJDX1NZU0NPTkZJRyk7CisgICAgd2FpdF9vbl92YWx1ZShTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NUQVRVUywKKwkJCQkgIDEyMDAwMDAwKTsKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX0NMRUFSLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKgorCSAqIFN0ZXAgMjogU2V0dXAgdGhlIHBvc2l0aW9uIGFuZCBnZW9tZXRyeSBvZiB0aGUgU0RSQU0gZGV2aWNlIG9uCisJICogdGhlIGNvbnRyb2xsZXIncyBidXMuCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1NIQVJJTkdfTE9DS19PRkYgCQkJCQkJCQkJCQkJfAorCQkgU0RSQ19TSEFSSU5HX0NTMU1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTMU1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX0NTME1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTME1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX1NEUkNUUklTVEFURV9PRkYpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19TSEFSSU5HKTsKKworCS8qCisJICogU3RlcCAzOiBTZXR1cCB0aGUgbWVtb3J5IGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBSQVMgd2lkdGgsCisJICogQ0FTIHdpZHRoLCBhZGRyZXNzIG11bHRpcGxleGluZywgc2l6ZSwgYmFuayBtYXBwaW5nLCBidXMgd2lkdGgsCisJICogcG93ZXIgbW9kZSwgRERSIHR5cGUgYW5kIG1lbW9yeSB0eXBlLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19NQ0ZHX0xPQ0tTVEFUVVNfUlcJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfUkFTV0lEVEhfMTRfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQ0FTV0lEVEhfRU5DT0RFKFNEUkNfTUNGR19DQVNXSURUSF8xMF9CSVRTKQkJCXwKKwkJIFNEUkNfTUNGR19BRERSTVVYTEVHQUNZX0ZMRVhJQkxFCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfUkFNU0laRV9FTkNPREUoQ0ZHX1NEUkFNX1NJWkVfTUIpCQkJCQl8CisJCSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fRU5DT0RFKFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9SX0JfQyl8CisJCSBTRFJDX01DRkdfQjMyTk9UMTZfT0ZGCQkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfREVFUFBEX1NVUFBPUlRFRAkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfRERSVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX0REUlRZUEVfTU9CSUxFX0REUikJCQl8CisJCSBTRFJDX01DRkdfUkFNVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX1JBTVRZUEVfRERSKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01DRkdfMCk7CisKKwkvKgorCSAqIFN0ZXAgNDogRXN0YWJsaXNoIHRoZSBBQyBmaW5lIHR1bmluZyB0aW1pbmcgY2hhcmFjdGVyaXN0aWNzLgorCSAqLworCisJYWN0aW1fY3RybGEKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQV9UUkZDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkFTX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkFTKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkNEX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkNEKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJSRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1REUExfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1REUEwpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UREFMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UREFMKSk7CisKKwlhY3RpbV9jdHJsYgorCQk9IChTRFJDX0FDVElNX0NUUkxCX1RXVFJfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RXVFIpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UWFNSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFNSKSk7CisKKwlfX3Jhd193cml0ZWwoYWN0aW1fY3RybGEsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxiLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJLyoKKwkgKiBTdGVwIDU6IEVzdGFibGlzaCB0aGUgbWVtb3J5IGF1dG9yZWZyZXNoIGNvbnRyb2wKKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfUkZSX0NUUkxfQVJDVl9FTkNPREUoMTI0NCkJCQkJCQl8CisJCSBTRFJDX1JGUl9DVFJMX0FSRV9FTkNPREUoU0RSQ19SRlJfQ1RSTF9BUkVfMV9BUkNWKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1JGUl9DVFJMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19QT1dFUl9SRUdfV0FLRVVQX0RFTEFZRUQJCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQVVUT0NPVU5UX0VOQ09ERSgwKQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fUlNUX0VOQUJMRQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fSURMRV9ESVNBQkxFCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX0VOQ09ERShTRFJDX1BPV0VSX1JFR19DTEtDVFJMX05PTkUpCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfUEFHRVBPTElDWV9IUEhCKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfUE9XRVJfUkVHKTsKKworCS8qCisJICogU3RlcCA2OiBFc3RhYmxpc2ggdGhlIEpFREVDLWRlZmluZWQgbW9kZSBhbmQgRExMIHBhcmFtZXRlcnMuCisJICovCisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJZGVsYXkoNTAwMCk7CSAgICAgICAgICAgICAgICAgCisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9QUkVDSEFSR0VfQUxMKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19NUl9aRVJPXzEJCQkJCQkJfAorCQkgU0RSQ19NUl9XQlNUX0VOQUJMRQkJCQkJfAorCQkgU0RSQ19NUl9aRVJPXzAJCQkJCQkJfAorCQkgU0RSQ19NUl9DQVNMX0VOQ09ERShTRFJDX01SX0NBU0xfMykJfAorCQkgU0RSQ19NUl9TSUxfU0VSSUFMCQkJCQkJfAorCQkgU0RSQ19NUl9CTF9FTkNPREUoU0RSQ19NUl9CTF80KSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01SXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19ETExBX0NUUkxfRklYRURfREVMQVlfRU5DT0RFKDApCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfSU5JVF9MQVRfRU5DT0RFKDApCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9FTkNPREUoU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX1BXRCkgfCAKKwkJIFNEUkNfRExMQV9DVFJMX0RMTF9FTkFCTEUJCQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9MT0NLX1RSQUNLSU5HREVMQVkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19ETExBX0NUUkwpOworCisJLyoKKwkgKiBEZWxheSBmb3IgYSAicmVhc29uYWJseSBsb25nIiBwZXJpb2Qgb2YgdGltZSB0byBhbGxvdyB0aGUKKwkgKiByZXF1ZXN0ZWQgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4KKwkgKi8KKworIAlkZWxheSgweDIwMDAwKTsKK30KKworLyoKKyAqICB2b2lkIHNfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIHZlcnkgZWFybHkgc3lzdGVtIGluaXRpYWxpemF0aW9uIG9mIGNoaXAKKyAqICAgIHBpbiBtdWx0aXBsZXhpbmcgYW5kIGNsb2NrcyBhbmQgaXMgY2FsbGVkIHdoZW4gT05MWSBhbgorICogICAgU1JBTS1iYXNlZCBzdGFjayBpcyBhdmFpbGFibGUgKGkuZS4gbm8gU0RSQU0pLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworCXRyeV91bmxvY2tfbWVtb3J5KCk7CisJc2V0X211eGNvbmZfcmVncygpOworCisJZGVsYXkoMTAwKTsKKworCXByY21faW5pdCgpOworCXBlcl9jbG9ja3NfZW5hYmxlKCk7CisJY29uZmlnX2RpYW1vbmRfc2RyYW0oKTsKK30KKworLyoKKyAqICBpbnQgYm9hcmRfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBlYXJseSwgYm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKyAqICAgIGZvbGxvd2luZyBjb3JlIENQVSBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgICBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIGJvYXJkLXNwZWNpZmljIHRvIGRvLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgT0s7IG90aGVyd2lzZSwgbm9uLXplcm8gb24gZXJyb3IuCisgKgorICovCitpbnQKK2JvYXJkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIHUzMiBnZXRfZGV2aWNlX3R5cGUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBERVZJQ0VUWVBFIGZpZWxkLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgKiAgICBkZXZpY2UgaXMgb2YgVFNULCBFTVUsIEhTIG9yIEdQIHR5cGUuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X2RldmljZV90eXBlKHZvaWQpCit7CisJY29uc3QgaW50IHZhbHVlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpOworCisJcmV0dXJuIChDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0RFQ09ERSh2YWx1ZSkpOworfQorCisvKgorICogIHUzMiBnZXRfc3lzYm9vdF92YWx1ZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGRlY29kZWQgdmFsdWUgZnJvbSB0aGUgQ1BVJ3MKKyAqICAgIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIFNZU0JPT1Qgb3JkZXIgc3ViZmllbGQsIGluZGljYXRpbmcgdGhlCisgKiAgICBvcmRlciBvZiBtZW1vcnkgaW50ZXJmYWNlcyBmcm9tIHdoaWNoIHRoZSBwcm9jZXNzb3Igd2lsbCBhdHRlbXB0CisgKiAgICB0byBib290IGl0c2VsZi4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgZGVjb2RlZCBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLgorICoKKyAqLwordTMyCitnZXRfc3lzYm9vdF92YWx1ZSh2b2lkKQoreworCWNvbnN0IHUzMiB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKwljb25zdCB1MzIgcGVyaXBoZXJhbF90eXBlID0gQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX1BFUklQSEVSQUw7CisKKwkvKgorCSAqIFRoaXMgcm91dGluZSBhbmQgY2FsbGVycyBvZiBpdCBhcmUgaW1wbGljaXRseSBleHBlY3RpbmcgdGhlCisJICogTUVNT1JZIGludGVyZmFjZSAoU1lTQk9PVFs1XSA9PSAwKSBub3QgdGhlIFBFUkhJUEhFUkFMCisJICogaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDEpIGJvb3Qgb3JkZXIsIHNvIGNoZWNrIHRoYXQgaXMKKwkgKiBhY3R1YWxseSB0aGUgY2FzZS4KKwkgKi8KKworCWlmIChDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfREVDT0RFKHZhbHVlKSA9PSBwZXJpcGhlcmFsX3R5cGUpIHsKKwkJaGFuZygpOworCX0KKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9PUkRFUl9ERUNPREUodmFsdWUpKTsKK30KKworLyoKKyAqICBpbnQgZ2V0X2Jvb3RfZGV2aWNlX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlX2xpc3QpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgYSBjb25zdGFudCBsaXN0IGluZGljYXRpbmcgdGhlIHByZWZlcnJlZAorICogICAgZGV2aWNlIGJvb3QgbGlzdC4KKyAqICAgIEl0IGdldHMgY2FsbGVkIGZyb20gc3RhcnRfYXJtYm9vdCBpbiBib2FyZC5jCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHByZWZlcnJlZCBmaXJzdCBwcm9jZXNzb3IgbWVtb3J5IGJvb3QgaW50ZXJmYWNlLgorICoKKyAqLworCitpbnQKK2dldF9ib290X2RldmljZXNfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VzX2xpc3QpCit7CisJc3RhdGljIHUzMiBsaXN0W01BWF9ESUFNT05EX0JPT1RfREVWSUNFU107CisJY29uc3QgdTMyIG1lbV9vcmRlciA9IGdldF9zeXNib290X3ZhbHVlKCk7CisKKwkvLyBzZXQgZGVmYXVsdHMKKwlpbnQgbnVtYmVyX29mX2RldmljZXMgPSAwOworCSpkZXZpY2VzX2xpc3QgPSAmbGlzdFswXTsKKworCXN3aXRjaCAobWVtX29yZGVyKSB7CisKKwljYXNlIDA6CisJY2FzZSAyOgorCWNhc2UgNDoKKwljYXNlIDE2OgorCWNhc2UgMjI6CisgICAgICAgIGxpc3RbMF0gPSBHUE1DX09ORU5BTkQ7CisgICAgICAgIG51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworICAgICAgICBicmVhazsKKwljYXNlIDE6CisJY2FzZSAxMjoKKwljYXNlIDE1OgorCWNhc2UgMjE6CisJY2FzZSAyNzoKKyAgICAgICAgbGlzdFswXSA9IEdQTUNfTkFORDsKKyAgICAgICAgbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisgICAgICAgIGJyZWFrOworCWNhc2UgMzoKKwljYXNlIDY6CisgICAgICAgIGxpc3RbMF0gPSBNTUNfT05FTkFORDsKKyAgICAgICAgbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisgICAgICAgIGJyZWFrOworCWNhc2UgODoKKwljYXNlIDExOgorCWNhc2UgMTQ6CisJY2FzZSAyMDoKKwljYXNlIDI2OgorICAgICAgICBsaXN0WzBdID0gR1BNQ19NRE9DOworICAgICAgICBudW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUzsKKyAgICAgICAgYnJlYWs7CisJY2FzZSAxNzoKKwljYXNlIDE4OgorCWNhc2UgMjQ6CisgICAgICAgIGxpc3RbMF0gPSBNTUNfTkFORDsKKyAgICAgICAgbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisgICAgICAgIGJyZWFrOworCWNhc2UgNzoKKwljYXNlIDEwOgorCWNhc2UgMTM6CisJY2FzZSAxOToKKwljYXNlIDI1OgorCisJZGVmYXVsdDoKKyAgICAgICAgbGlzdFswXSA9IEdQTUNfTk9SOworICAgICAgICBudW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUzsKKyAgICAgICAgYnJlYWs7CisJfQorICAgIHJldHVybiBudW1iZXJfb2ZfZGV2aWNlczsKK30KKworLyoKKyAqICBpbnQgbWlzY19pbml0X3IoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgbWlzY2VsbGFuZW91cywgYm9hcmQtc3BlY2lmaWMKKyAqICAgIGluaXRpYWxpemF0aW9uIGZvbGxvd2luZyBDUFUsIGVhcmx5IGJvYXJkLCBzZXJpYWwgYW5kIE5BTkQKKyAqICAgIGluaXRpYWxpemF0aW9uIGJ1dCBwcmlvciB0byBsb2FkaW5nIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIKKyAqICAgIHRvIFJBTS4KKyAqCisgKiAgICBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIGJvYXJkLXNwZWNpZmljIHRvIGRvLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgT0s7IG90aGVyd2lzZSwgbm9uLXplcm8gb24gZXJyb3IuCisgKgorICovCitpbnQKK21pc2NfaW5pdF9yKHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3dhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCit3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogcGVyaXBoZXJhbF9lbmFibGUKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUgdGhlIGNsa3MgJiBwb3dlciBmb3IgcGVyaWZzIChHUFQyLCBVQVJUMSwuLi4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICB2b2lkIGZvb2JhcigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lLi4uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitwZXJfY2xvY2tzX2VuYWJsZSh2b2lkKQoreworCS8qIEVuYWJsZSBHUDIgdGltZXIuICovCisJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCAxLCAweDEpOyAvKiBHUFQyID0gc3lzIGNsayAqLworCXNyMzIoQ01fSUNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogSUNLZW4gR1BUMiAqLworCXNyMzIoQ01fRkNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogRkNLZW4gR1BUMiAqLworCisjaWZkZWYgQ0ZHX05TMTY1NTAKKwkvKiBFbmFibGUgVUFSVDEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01NQworCS8qIEVuYWJsZSBNTUMxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisjZW5kaWYKKwlkZWxheSgxMDAwKTsKK30KKworc3RhdGljIGludAorZ3BtY19jb25maWdfMCh2b2lkKQoreworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfQ09ORklHMV8wKQorCS8qCisJICogRmlyc3QsIGRpc2FibGUgdGhlIGludGVyZmFjZSBhbmQgd2FpdC4KKwkgKi8KKwlfX3Jhd193cml0ZWwoR1BNQ19DT05GSUc3X0NTVkFMSURfRElTQUJMRUQsIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDEwMDApOworCisJLyoKKwkgKiBOZXh0LCBwcm9ncmFtIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisJICovCisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzFfMCwgR1BNQ19DT05GSUcxXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcyXzAsIEdQTUNfQ09ORklHMl8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHM18wLCBHUE1DX0NPTkZJRzNfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzRfMCwgR1BNQ19DT05GSUc0XzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc1XzAsIEdQTUNfQ09ORklHNV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNl8wLCBHUE1DX0NPTkZJRzZfMCk7CisKKwkvKgorCSAqIEZpbmFsbHksIGVuYWJsZSB0aGUgR1BNQyBtYXBwaW5nIGFuZCBzcGluIGZvciB0aGUgcGFyYW1ldGVycyB0bworCSAqIGJlY29tZSBhY3RpdmUuCisJICovCisJX19yYXdfd3JpdGVsKChDRkdfR1BNQ19DT05GSUc3XzAgfCBHUE1DX0NPTkZJRzdfQ1NWQUxJRF9FTkFCTEVEKSwKKwkJCQkgR1BNQ19DT05GSUc3XzApOworCisJZGVsYXkoMjAwMCk7CisKKwlpZiAobmFuZF9jaGlwKCkpeworCQlyZXR1cm4gKDEpOworCX0KKyNlbmRpZiAvKiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkgKi8KKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiAgaW50IG5hbmRfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIKKyAqICAgIChHUE1DKSBzdWNoIHRoYXQgb24tYm9hcmQgTkFORCBkZXZpY2VzIG1heSBiZSBhY2Nlc3NlZCBmb3IKKyAqICAgIHNlY29uZC1zdGFnZSBib290LgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgTkFORCB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkOyBvdGhlcndpc2UsIDEuCisgKgorICovCitpbnQKK25hbmRfaW5pdCh2b2lkKQoreworCWludCBzdGF0dXMgPSAxOworCisJLyoKKwkgKiBFc3RhYmxpc2ggR1BNQyBnbG9iYWwgc2V0dGluZ3MuCisJICovCisKKwlfX3Jhd193cml0ZWwoR1BNQ19TWVNDT05GSUdfSURMRU1PREVfU01BUlQsIEdQTUNfU1lTQ09ORklHKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX0lSUUVOQUJMRV9BTExfRElTQUJMRSwgR1BNQ19JUlFFTkFCTEUpOworCisJX19yYXdfd3JpdGVsKEdQTUNfVElNRU9VVEVOQUJMRV9PRkYsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsKKworCWlmIChncG1jX2NvbmZpZ18wKCkpIHsKKwkJcHV0cygiVW5zdXBwb3J0ZWQgTkFORCBkZXZpY2UgQCBHUE1DMCFcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJc3RhdHVzID0gMDsKKworIGRvbmU6CisJLyogRHVtcCBHUE1DIGFuZCBTRFJDIHJlZ2lzdGVycyBpZiBzbyBjb25maWd1cmVkLiAqLworCisJb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKCk7CisJb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKCk7CisJb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKCk7CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiAgdm9pZCBib2FyZF9oYW5nKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IGJvYXJkLXNwZWNpZmljIGFjdGlvbnMgd2hlbiB0aGUgc3lzdGVtCisgKiAgICBoYW5ncyBieSBleGVjdXRpbmcgaGFuZygpLiBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvOworICogICAgaG93ZXZlciwgd2UgbWlnaHQgbGF0ZXIgZHJpdmUgdGhlIHBpZXpvIG9yIGEgTEVELgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorYm9hcmRfaGFuZyAodm9pZCkKK3sKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvbXV4LmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmOTJmOQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9tdXguYwpAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0NVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IEkvTyBwYWQgbXVsdGlwbGV4ZXIgY29uZmlndXJhdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgaXMgb3JpZ2luYWxseSBpbmhlcml0ZWQgYW5kIHNwbGl0IGZyb20gdGhlIE9NQVAzIEVWTQorICogICAgICBib2FyZCBmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qCisgKiAgdm9pZCBzZXRfbXV4Y29uZl9yZWdzKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmVzIHNldHMgdGhlIEkvTyBwYWQgbXVsdGlwbGV4ZXJzIGZvciBVQVJULCBHUE1DLCBTRFJDLAorICogICAgR1BJTy4KKyAqCisgKiBUaGUgY29tbWVudGVkIHN0cmluZyBnaXZlcyB0aGUgZmluYWwgbXV4IGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcGluCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKi8KK3ZvaWQKK3NldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwkvKgorCSAqIFRoZSBiaXQgZmllbGRzIGZvciB0aGVzZSBzZXR0aW5ncyBhcmUgYXMgZm9sbG93czoKKwkgKgorCSAqICAgSXtFTixESVN9CSAJLSBJbnB1dCBFbmFibGUvRGlzYWJsZQorCSAqICAgUFRbRFVdCQkgCS0gUHVsbC1kb3duLCAtdXAKKwkgKiAgIERJUyxFTgkJICAJLSBQdWxsLWRvd24sIC11cCBkaXNhYmxlZC9lbmFibGVkCisJICogICBNWzAxMjM0NTY3XQktIENvbmZpZ3VyYXRpb24gbW9kZSAwLTcKKwkgKi8KKworCS8qCisJICogU0RSQU0gQ29udHJvbGxlciAoU0RSQykKKwkgKgorCSAqIE1vc3Qgb2YgdGhlIFNEUkMgc2lnbmFscyBhcmUgdXNlZCB0byBkcml2ZSB0aGUgU2Ftc3VuZworCSAqIEs0WDUxMTYzUEktRkNHNiA1MTIgTWIgeCAxNi1iaXQgKDY0IE1pQikgRERSIFNEUkFNLiBCZWNhdXNlIHdlCisJICogaW50ZXJmYWNlIGluIDE2LWJpdCByYXRoZXIgdGhhbiAzMi1iaXQgbW9kZSwgd2UgcGxhY2UgdGhlCisJICogdW51c2VkIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCSAqLworCisJTVVYX1ZBTChDUChTRFJDX0QwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMAorCU1VWF9WQUwoQ1AoU0RSQ19EMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEKKwlNVVhfVkFMKENQKFNEUkNfRDIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QyCisJTVVYX1ZBTChDUChTRFJDX0QzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMworCU1VWF9WQUwoQ1AoU0RSQ19ENCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDQKKwlNVVhfVkFMKENQKFNEUkNfRDUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q1CisJTVVYX1ZBTChDUChTRFJDX0Q2KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENgorCU1VWF9WQUwoQ1AoU0RSQ19ENyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDcKKwlNVVhfVkFMKENQKFNEUkNfRDgpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q4CisJTVVYX1ZBTChDUChTRFJDX0Q5KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOQorCU1VWF9WQUwoQ1AoU0RSQ19EMTApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMAorCU1VWF9WQUwoQ1AoU0RSQ19EMTEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMQorCU1VWF9WQUwoQ1AoU0RSQ19EMTIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMgorCU1VWF9WQUwoQ1AoU0RSQ19EMTMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMworCU1VWF9WQUwoQ1AoU0RSQ19EMTQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxNAorCU1VWF9WQUwoQ1AoU0RSQ19EMTUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxNQorCisJLy8gQmVjYXVzZSB3ZSBpbnRlcmZhY2UgU0RSQU0gaW4gMTYtYml0IG1vZGUsIHBsYWNlCisJLy8gU0RSQ19EQVRBWzMxOjE2XSBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMzApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19DTEsKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EUVMxCisKKwkvLyBQbGFjZSB1bnVzZWQgRFEgcGlucyBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKFNEUkNfRFFTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvKgorCSAqIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlciAoR1BNQykKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChHUE1DX0ExKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMQorCU1VWF9WQUwoQ1AoR1BNQ19BMiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTIKKwlNVVhfVkFMKENQKEdQTUNfQTMpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EzCisJTVVYX1ZBTChDUChHUE1DX0E0KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNAorCU1VWF9WQUwoQ1AoR1BNQ19BNSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTUKKwlNVVhfVkFMKENQKEdQTUNfQTYpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E2CisJTVVYX1ZBTChDUChHUE1DX0E3KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNworCisJLy8gUGxhY2UgdGhlIHVudXNlZCBHUE1DX0E4IHBpbiBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKEdQTUNfQTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBHUE1DX0E5IHRvIEdQSU9fNDIgdXNlZCBhcyBhIHB1c2gtcHVsbCwgYWN0aXZlIGxvdyBpbnB1dAorCS8vIGZyb20gdGhlIFVTQiBQSFkgZm9yIFVTQiBzdXNwZW5kIG5vdGlmaWNhdGlvbi4KKworCU1VWF9WQUwoQ1AoR1BNQ19BOSksCQkoSUVOICB8IFBUVSB8IERJUyB8IE00KSk7CS8vIEdQSU9fNDIKKworI2lmIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpCisJLy8gQXNzaWduIEdQTUNfQTEwIHRvIEdQSU9fNDMgdXNlZCBhcyBwdXNoLXB1bGwsIGFjdGl2ZSBsb3cgb3V0cHV0CisJLy8gTENEX25FTkJVRkZFUiBmb3IgdGhlIDEuOFYgdG8gMy4zViBMQ0QgYnVmZmVyIGVuYWJsZS4KKworCU1VWF9WQUwoQ1AoR1BNQ19BMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzQzCisjZWxzZQorCU1VWF9WQUwoQ1AoR1BNQ19BMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKSAqLworCisJTVVYX1ZBTChDUChHUE1DX0QwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMAorCU1VWF9WQUwoQ1AoR1BNQ19EMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEKKwlNVVhfVkFMKENQKEdQTUNfRDIpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QyCisJTVVYX1ZBTChDUChHUE1DX0QzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMworCU1VWF9WQUwoQ1AoR1BNQ19ENCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDQKKwlNVVhfVkFMKENQKEdQTUNfRDUpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q1CisJTVVYX1ZBTChDUChHUE1DX0Q2KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENgorCU1VWF9WQUwoQ1AoR1BNQ19ENyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDcKKwlNVVhfVkFMKENQKEdQTUNfRDgpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q4CisJTVVYX1ZBTChDUChHUE1DX0Q5KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOQorCU1VWF9WQUwoQ1AoR1BNQ19EMTApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMAorCU1VWF9WQUwoQ1AoR1BNQ19EMTEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMQorCU1VWF9WQUwoQ1AoR1BNQ19EMTIpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMgorCU1VWF9WQUwoQ1AoR1BNQ19EMTMpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMworCU1VWF9WQUwoQ1AoR1BNQ19EMTQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxNAorCU1VWF9WQUwoQ1AoR1BNQ19EMTUpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxNQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MwKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MwCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzEKKwlNVVhfVkFMKENQKEdQTUNfTkNTMiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMgorI2lmIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpCisJLy8gQXNzaWduIHRvIEdQTUNfTkNTMyBmb3IgU2Ftc3VuZyBLOUY0RzA4VTBDIDUxMiBNaUIgU0xDIE5BTkQKKwkvLyBGbGFzaAorCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzMKKyNlbHNlCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKSAqLworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjaWYgZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkKKwkvLyBBc3NpZ24gdG8gR1BNQ19OQ1M1IGZvciBTTVNDIExBTjkyMjAgMTAvMTAwIE1iaXQgRXRoZXJuZXQgTUFDCisJLy8gYW5kIFBIWQorCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzUKKyNlbHNlCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKSAqLworCisJLy8gQXNzaWduIEdQTUNfTkNTNiB0byBHUFQxMV9QV01fRVZUIHVzZWQgYXMgYSBwdXNoLXB1bGwgcHVsc2Ugd2lkdGgKKwkvLyBtb2R1bGF0ZWQgKFBXTSkgc2lnbmFsIGZvciB0aGUgcGllem8uCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0zKSk7CS8vIEdQVDExX1BXTV9FVlQKKworCS8vIEFzc2lnbiBHUE1DX05DUzcgdG8gR1BJT181OCB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dAorCS8vIFBJRVpPX05FTkFCTEUgdG8gdGhlIFRJIFNONzRMVkMyRzI0MCBEdWFsIEJ1ZmZlci9Ecml2ZXIgV2l0aAorCS8vIDMtU3RhdGUgT3V0cHV0cyBpbnB1dHMuCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNTgKKworCU1VWF9WQUwoQ1AoR1BNQ19DTEspLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0NMSworCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uQURWX0FMRQorCU1VWF9WQUwoQ1AoR1BNQ19OT0UpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25PRQorCU1VWF9WQUwoQ1AoR1BNQ19OV0UpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25XRQorCU1VWF9WQUwoQ1AoR1BNQ19OQkUwX0NMRSksCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQkUwX0NMRQorCisJLy8gQXNzaWduIEdQTUNfTkJFMSB0byBHUElPXzYxIHVzZWQgYXMgYSBwdXNoLXB1bGwgb3V0cHV0IHRvIHRoZQorCS8vIFppZ0JlZSBhY3RpdmUtbG93IHJlc2V0LgorCisJTVVYX1ZBTChDUChHUE1DX05CRTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzYxCisKKwlNVVhfVkFMKENQKEdQTUNfTldQKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV1AKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX1dBSVQwCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMQorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVuYXZhaWxhYmxlCisKKwkvLyBBc3NpZ24gR1BNQ19XQUlUMyB0byBHUElPXzY1IHVzZWQgYXMgYW4gYWN0aXZlLWhpZ2gsIHB1c2gtcHVsbAorCS8vIGJhY2twbGF0ZSBkZXRlY3QgaW5wdXQuCisKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzY1CisKKwkvKgorCSAqIERpc3BsYXkgU3Vic3lzdGVtIChEU1MpCisJICoKKwkgKiBBbGwgRFNTIHNpZ25hbHMgYXJlIHVzZWQgaW4gdGhlaXIgbm9ybWFsLCBkZWZhdWx0IG1vZGUgKE1vZGUgMCkKKwkgKiB0byBkcml2ZSB0aGUgU2Ftc3VuZyBMTVMzNTBERjBbMTNdIExDRCBkaXNwbGF5IHBhbmVsLgorCSAqLworCisJTVVYX1ZBTChDUChEU1NfUENMSyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19QQ0xLCisJTVVYX1ZBTChDUChEU1NfSFNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfSFNZTkMKKwlNVVhfVkFMKENQKERTU19WU1lOQyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19WU1lOQworCU1VWF9WQUwoQ1AoRFNTX0FDQklBUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19BQ0JJQVMKKwlNVVhfVkFMKENQKERTU19EQVRBMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExCisJTVVYX1ZBTChDUChEU1NfREFUQTIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIKKwlNVVhfVkFMKENQKERTU19EQVRBMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMworCU1VWF9WQUwoQ1AoRFNTX0RBVEE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE0CisJTVVYX1ZBTChDUChEU1NfREFUQTUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTUKKwlNVVhfVkFMKENQKERTU19EQVRBNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNgorCU1VWF9WQUwoQ1AoRFNTX0RBVEE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE3CisJTVVYX1ZBTChDUChEU1NfREFUQTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTgKKwlNVVhfVkFMKENQKERTU19EQVRBOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBOQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTAKKwlNVVhfVkFMKENQKERTU19EQVRBMTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTExCisJTVVYX1ZBTChDUChEU1NfREFUQTEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTMKKwlNVVhfVkFMKENQKERTU19EQVRBMTQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE0CisJTVVYX1ZBTChDUChEU1NfREFUQTE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTYKKwlNVVhfVkFMKENQKERTU19EQVRBMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE3CisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExOAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTkKKwlNVVhfVkFMKENQKERTU19EQVRBMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIwCisJTVVYX1ZBTChDUChEU1NfREFUQTIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjIKKwlNVVhfVkFMKENQKERTU19EQVRBMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIzCisKKwlNVVhfVkFMKENQKENBTV9XRU4pLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8qCisJICogVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlciAvIFRyYW5zbWl0dGVyIChVQVJUKQorCSAqCisJICovCisKKwlNVVhfVkFMKENQKFVBUlQxX1RYKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfVFgKKwlNVVhfVkFMKENQKFVBUlQxX1JUUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1JUUworCU1VWF9WQUwoQ1AoVUFSVDFfQ1RTKSwJCShJRU4gIHwgUFRVIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfQ1RTCisJTVVYX1ZBTChDUChVQVJUMV9SWCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1JYCisJLyoKKwkgKiBDb250cm9sIGFuZCBEZWJ1ZworCSAqCisJICovCisKKwlNVVhfVkFMKENQKFNZU18zMkspLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfMzJLCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDAKKwlNVVhfVkFMKENQKFNZU19CT09UMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMQorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QyCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDMKKwlNVVhfVkFMKENQKFNZU19CT09UNCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q1CisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDYKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQxKSwgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBTWVNfQ0xLT1VUMQorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfblRSU1QKKwlNVVhfVkFMKENQKEpUQUdfVENLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UQ0sKKwlNVVhfVkFMKENQKEpUQUdfVE1TKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UTVMKKwlNVVhfVkFMKENQKEpUQUdfVERJKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UREkKKwlNVVhfVkFMKENQKEpUQUdfRU1VMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19FTVUxCisJTVVYX1ZBTChDUChFVEtfQ0xLX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfQ1RMX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDBfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDFfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDJfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDNfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDRfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDVfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDZfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDdfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDhfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDlfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEwX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDExX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEyX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEzX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gRVRLX0QxWzQ1XSBhcyBNTTJfUlhSQ1YgYW5kIE1NMl9UWFNFMCBVU0IgRlMvTFMgSG9zdAorCS8vIChNb2RlIDUpCisKKwlNVVhfVkFMKENQKEVUS19EMTRfRVMyKSwJKElFTiAgfCBQVEQgfCBESVMgfCBNNSkpOwkvLyBNTTJfUlhSQ1YKKwlNVVhfVkFMKENQKEVUS19EMTVfRVMyKSwJKElFTiAgfCBQVEQgfCBESVMgfCBNNSkpOwkvLyBNTTJfVFhTRTAKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0OWQyNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqICAgIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXR1cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgICAgIEl0IGluaGVyaXRzIGVudGlyZWx5IGZyb20gdGhlIGVxdWl2YWxlbnQgVEkgT01BUDMgRVZNCisgKglmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8KKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IDM0MzAgWC1sb2FkZXIgY3VycmVudGx5IGRvZXMgbm90IHVzZSB0aGlzIGNvZGUuCisqICAgSXQgY291bGQgYmUgcmVtb3ZlZCBpdHMgaXMga2VwdCBmb3IgY29tcGF0YWJpbHkgd2l0aCB1LWJvb3QuCisgKgorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gQ01fQ0xLRU5fUExMLWJ5cGFzcyB2YWx1ZQorICogIFIxID0gQ01fQ0xLU0VMMV9QTEwtbSwgbiwgYW5kIGRpdmlkZXIgdmFsdWVzCisgKiAgUjIgPSBDTV9DTEtTRUxfQ09SRS1kaXZpZGVyIHZhbHVlcworICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoKKyAqICBOb3RlOiBJZiBjb3JlIHVubG9ja3MvcmVsb2NrcyBhbmQgU0RSQU0gaXMgcnVubmluZyBmYXN0IGFscmVhZHkgaXQgZ2V0cworICogICAgICAgIGNvbmZ1c2VkLiAgQSByZXNldCBvZiB0aGUgY29udHJvbGxlciBnZXRzIGl0IGJhY2suICBUYWtpbmcgYXdheSBpdHMKKyAqICAgICAgICBMMyB3aGVuIGl0cyBub3QgaW4gc2VsZiByZWZyZXNoIHNlZW1zIGJhZCBmb3IgaXQuICBOb3JtYWxseSwgdGhpcyBjb2RlCisgKiAgICAgICAgcnVucyBmcm9tIGZsYXNoIGJlZm9yZSBTRFIgaXMgaW5pdCBzbyB0aGF0IHNob3VsZCBiZSBvay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN0bWZkIHNwISwge3I0LXI2fQorCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByNCwgcGxsX2N0bF9hZGQKKyAgICAgICAgc3RyICAgICByMCwgW3I0XQord2FpdDE6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJlcSAgICAgd2FpdDEgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNSwgcGxsX2Rpdl9hZGQxCisgICAgICAgIHN0ciAgICAgcjEsIFtyNV0gICAgICAgICAgLyogc2V0IG0sIG4sIG0yICovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMgorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIC8qIHNldCBsMy9sNC8uLiBkaXZpZGVycyovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMyAgLyogd2t1cCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDMgIC8qIHJzbSB2YWwgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDUgIC8qIGVtdSAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDUKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzVfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIFtyNV0KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbG9jayBEUExMMyBhbmQgd2FpdCBhIGJpdCAqLworICAgICAgICBvcnIgICAgIHIwLCByMCwgIzB4NyAgIC8qIHNldCB1cCBmb3IgbG9jayBtb2RlICovCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8KKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKy8qIFRoZSBOb3IgaGFzIHRvIGJlIGluIHRoZSBGbGFzaCBCYXNlIENTMCBmb3IgdGhpcyBjb25kaXRpb24gdG8gaGFwcGVuICovCitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHMV8wKQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkICAoR1BNQ19DT05GSUczXzApCitmbGFzaF9jZmczX3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHNF8wKQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzVfMCkKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX2Rpdl9hZGQxOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMCitwbGxfZGl2X2FkZDI6CisgICAgLndvcmQgQ01fQ0xLU0VMX0NPUkUKK3BsbF9kaXZfYWRkMzoKKyAgICAud29yZCBDTV9DTEtTRUxfV0tVUAorcGxsX2Rpdl92YWwzOgorICAgIC53b3JkIChXS1VQX1JTTSA8PCAxKQorcGxsX2Rpdl9hZGQ0OgorICAgIC53b3JkIENNX0NMS1NFTF9HRlgKK3BsbF9kaXZfdmFsNDoKKyAgICAud29yZCAoR0ZYX0RJViA8PCAwKQorcGxsX2Rpdl9hZGQ1OgorICAgIC53b3JkIENNX0NMS1NFTDFfRU1VCitwbGxfZGl2X3ZhbDU6CisgICAgLndvcmQgQ0xTRUwxX0VNVV9WQUwKKyNlbmRpZiAvKiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAqLworCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4KKyAqIFRoZSB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBzeXNjbGsgYW5kIGZvciBFUzEgYW5kIEVTMi4KKyAqLworCittcHVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZFCisud29yZCAweDA3Cisud29yZCAweDA1Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MUY0Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxNzkKKy53b3JkIDB4MTIKKy53b3JkIDB4MDQKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MTkKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQQorLndvcmQgMHgzMgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfbXB1X2RwbGxfcGFyYW0KK2dldF9tcHVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIG1wdV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitpdmFfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTY4Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MEIKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDEzRgorLndvcmQgMHgzMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgxNworLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitjb3JlX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgwRQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgxMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE0QworLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDIxCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxCisud29yZCAweDEzCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKgorICogVGFibGVzIGZvciAzNngvMzd4IGRldmljZXMKKyAqCisgKiAoUG9wdWxhdGVkIGZvciAxM01IeiBvbmx5KQorICovCittcHVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF8zMDBNSFopCisud29yZCAxNTAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgMzAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDcsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAxNTAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAxNSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWikKKy53b3JkIDMwMCwgIDUsIDAsIDEgCS8vIDEyICAgTUh6Cisud29yZCA2MDAsIDEyLCAwLCAxIAkvLyAxMyAgIE1IegorLndvcmQgMTI1LCAgMywgMCwgMSAJLy8gMTkuMiBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDI2ICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2Vsc2UKKyMgZXJyb3IgIk1QVSBEUExMIHNldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEiCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWikgKi8KKworaXZhXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgIE0gICBOICAgRlMgTTIKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHoKKworY29yZV8zNnhfZHBsbF9wYXJhbToKKy8vICAgIE0gICAgTiAgIEZTIE0yCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8yMDBNSFopCisud29yZCAxMDAsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAyMDAsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAzNzUsIDM1LCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxMDAsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAzNzUsIDcxLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzMzMk1IWikKKy53b3JkIDE2NiwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDMzMiwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDQxNSwgMjMsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDE2NiwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDQxNSwgNDcsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaKQorLndvcmQgMjAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgNDAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAxNywgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2Vsc2UKKyMgZXJyb3IgIkNvcmUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaKSAqLworCisvKgorICogRm9yIHRoZSBwZXJpcGhlcmFsIChQRVIpIChha2EgRFBMTDQpIGNsb2NrIHNldHRpbmdzLCB0aGVyZSBhcmUgb25seQorICogZWZmZWN0aXZlbHkgdHdvIGNsb2NrIGNob2ljZXMsIDk2IE1IeiBvciAxOTIgTUh6LiBIb3dldmVyLCB0aGUgb25seQorICogdGltZSAxOTIgTUh6IGlzIGFwdCB0byBiZSB1c2VkIGluIGFuIGFwcGxpY2F0aW9uIGlzIGlmIGJvdGggU0dYIGFuZAorICogVFYgb3V0cHV0IGFyZSB1c2VkLgorICoKKyAqICAgRm9yIGFueSBnaXZlbiBzeXN0ZW0gY2xvY2ssIHRoZSBkaXZpZGVycyBhcmUgY29uZmlndXJlZCB0aHVzIChwZXIKKyAqICAgU2VjdGlvbiAzLjUuMy4zLjMuMiAiVHlwZSBCIERQTEwgKExvdy1KaXR0ZXIpIiBvZiB0aGUgT01BUDMgVFJNKToKKyAqCisgKiAgICAgUEVSW2Nsa291dF0gPSAoU1lTW2Nsa291dF0gKiBNKSAvIChOICsgMSkKKyAqCisgKiAgICAgICBNMltjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE0yICAgICAgICAgICB1c2VkIGJ5IFVBUlQsIE1NQywgSTJDLCBldGMuCisgKiAgICAgICBNM1tjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE0zICAgICAgICAgICB1c2VkIGJ5IFRWIG91dC4KKyAqICAgICAgIE00W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTQgICAgICAgICAgIHVzZWQgYnkgRFNTLgorICogICAgICAgTTVbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNSAgICAgICAgICAgdXNlZCBieSBjYW1lcmEuCisgKiAgICAgICBNNltjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE02ICAgICAgICAgICB1c2VkIGJ5IGVtdWxhdGlvbi4KKyAqCisgKiAgU28sIGZvciBhIDE5LjIgTUh6IHN5c3RlbSBjbG9jayBhbmQgdGhlIHNjYWxhciBlbnRyaWVzIGJlbG93OgorICoKKyAqICAgICAgIFBFUltjbGtvdXRdID0gKDE5LjIgKiA1NDApIC8gKDExICsgMSkgPSA4NjQKKyAqCisgKiAgICAgICBNMltjbGtvdXRdOiA4NjQgLyAgOSA9ICA5NiAgIE1IegorICogICAgICAgTTNbY2xrb3V0XTogODY0IC8gMTYgPSAgNTQgICBNSHoKKyAqICAgICAgIE00W2Nsa291dF06IDg2NCAvICA1ID0gMTcyLjggTUh6CisgKiAgICAgICBNNVtjbGtvdXRdOiA4NjQgLyAgNCA9IDIxNiAgIE1IegorICogICAgICAgTTZbY2xrb3V0XTogODY0IC8gIDMgPSAyODggICBNSHoKKyAqLworcGVyXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgU1lTX0NMSyAgICBNICAgICAgTiAgICAgIE0yICAgICAgTTMgICAgICBNNCAgICAgTTUgICAgICBNNiAgICAgIG0yRElWCisud29yZCAxMjAwMCwgICAgNDMyLCAgICA1LCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTIgICBNSHoKKy53b3JkIDEzMDAwLCAgICA4NjQsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxMyAgIE1IegorLndvcmQgMTkyMDAsICAgIDU0MCwgICAxMSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDE5LjIgTUh6Cisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMjYgICBNSHoKKy53b3JkIDM4NDAwLCAgICAyNzAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAzOC40IE1IegorLndvcmQgMTY4MDAsICAgIDM2MCwgICAgNiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDE2LjggTUh6CisKKy5nbG9ibCBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtCitnZXRfMzZ4X21wdV9kcGxsX3BhcmFtOgorCWFkcglyMCwgbXB1XzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbQorZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGl2YV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtCitnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGNvcmVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtCitnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtOgorCWFkcglyMCwgcGVyXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3BsYXRmb3JtLmggYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODM2ZTVhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3BsYXRmb3JtLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yCisgKiAgICAgIGFjY2Vzc2luZyBEaWdpdGFsIFBoYXNlZCBMb2NrIExvb3AgKERQTEwpIHBhcmFtZXRlcnMgYW5kCisgKiAgICAgIHNldHRpbmdzLgorICoKKyAqLworCisjaWZuZGVmIF9ORVNUX0RJQU1PTkRfUExBVEZPUk1fSF8KKyNkZWZpbmUgX05FU1RfRElBTU9ORF9QTEFURk9STV9IXworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoKKyAqIFR5cGUgRGVmaW5pdGlvbnMKKyAqLworCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCisKK3N0cnVjdCBkcGxsX3BhcmFtIHsKKwl1MzIgbTsKKwl1MzIgbjsKKwl1MzIgZnNlbDsKKwl1MzIgbTI7Cit9OworCitzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtIHsKKwl1MzIgc3lzX2NsazsKKwl1MzIgbTsKKwl1MzIgbjsKKwl1MzIgbTI7CisJdTMyIG0zOworCXUzMiBtNDsKKwl1MzIgbTU7CisJdTMyIG02OworCXUzMiBtMmRpdjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworLyoKKyAqIElubGluZSBGdW5jdGlvbnMKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIiAic3VicyAlMCwgJTEsICMxXG4iCisJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIobG9vcHMpKTsKK30KKworCisvKgorICogRnVuY3Rpb24gUHJvdG90eXBlcworICoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIHBsYXRmb3JtLlMuCisgKi8KKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX05FU1RfRElBTU9ORF9QTEFURk9STV9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3ByY20uYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wcmNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyNWFkNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wcmNtLmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBjbG9jayBzZXQtdXAgZm9yIHRoZSBwcm9jZXNzb3IncyBQb3dlciwgUmVzZXQgYW5kCisgKiAgICAgIENsb2NrIE1hbmFnZXIgKFBSQ00pCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHUzMiBnZXRfb3NjX2Nsa19zcGVlZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGRldGVybWluZXMgdGhlIHJlZmVyZW5jZSBvc2NpbGxhdG9yIHNwZWVkIGJhc2VkIG9uCisgKiAgICBhIGtub3duIDMyIGtIeiBjbG9jayBhbmQgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBjbG9jayBzcGVlZC4KKyAqCisgKi8KK3N0YXRpYyB1MzIKK2dldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCBjZGl2LCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCisJaWYgKHZhbCAmIEJJVDcpCisJCWNkaXYgPSAyOworCWVsc2UgaWYgKHZhbCAmIEJJVDYpCisJCWNkaXYgPSAxOworCWVsc2UKKwkJLyoKKwkJICogU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUhCisJCSAqIFRCRDogQWRkIGEgV0FSTigpL0JVRygpCisJCSAqICAgICAgRm9yIG5vdywgYXNzdW1lIGRpdmlkZXIgYXMgMS4KKwkJICovCisJCWNkaXYgPSAxOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCWlmIChjZGl2ID09IDIpCisJeworCQljZGlmZiAqPSAyOworCX0KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKgorICogIHZvaWQgZ2V0X3N5c19jbGtpbl9zZWwoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIFBSQ00gUFJNIHN5c3RlbSBjbG9jaworICogICAgZnJlcXVlbmN5IHNlbGVjdG9yLCB3aGljaCBzaG91bGQgYmUgd3JpdHRlbiB0byBQUk1fQ0xLU0VMLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGhlcnR6ICAtIFRoZSBzcGVlZCwgaW4gTUh6LCB0aGF0IHRoZSBzeXN0ZW0gY2xvY2sgaXMgYmVsaWV2ZWQKKyAqICAgICAgICAgICAgICAgdG8gYmUgcnVubmluZyBhdC4KKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIGluZGV4IHVzZWQgdG8gYWNjZXNzIHRoZQorICogICAgICAgICAgICAgICBkaWdpdGFsIFBMTCBzZXR0aW5ncy4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgc3lzX2Nsa2luX3NlbCAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggZm9yIHRoZSBkaWdpdGFsIFBMTCBzZXR0aW5ncworICogICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBmb3IgdGhlIHNwZWNpZmllZCBzeXN0ZW0gY2xvY2sgcmF0ZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLworc3RhdGljIHZvaWQKK2dldF9zeXNfY2xraW5fc2VsKHUzMiBoZXJ0eiwgdTMyICpzeXNfY2xraW5fc2VsKQoreworCXN3aXRjaCAoaGVydHopIHsKKworCWNhc2UgUzM4XzRNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8zOF80X01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMyNk06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzI2XzBfTUhaOworCQlicmVhazsKKworCWNhc2UgUzE5XzJNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xOV8yX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxNl84TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTZfOF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTNNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xM18wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxMk06CisJZGVmYXVsdDoKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTJfMF9NSFo7CisJCWJyZWFrOworCisJfQorfQorCisvKgorICogT01BUDM0eC8zNXggc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkCitkcGxsM19pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM0WCk7CS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2RwbGw0X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyID0gcHRyICsgY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA1LCBQRVJfTTZYMik7CQkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJCS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkJLyogc2V0IE00ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA1LCBQRVJfTTNYMik7CQkvKiBzZXQgTTMgKi8KKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKFBFUklQSF9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbMjA6MjNdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCkgOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHVfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChNUFVfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9NUFVbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgNCwgNCwgcHRyLT5mc2VsKTsKK30KKworc3RhdGljIHZvaWQKK2l2YV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKElWQTJfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCA0LCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisvKgorICogT01BUDM2MzAgc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkCitkcGxsM19pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM2WCk7CQkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICpwdHI7CisKKwlwdHIgPSAoc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqKWdldF8zNnhfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIE02IChESVZfRFBMTDQpOiBDTV9DTEtTRUwxX0VNVVsyNDoyOV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNiwgcHRyLT5tNik7CisKKwkvKiBNNSAoQ0xLU0VMX0NBTSk6IENNX0NMS1NFTDFfRU1VWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDYsIHB0ci0+bTUpOworCisJLyogTTQgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1swOjVdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA2LCBwdHItPm00KTsKKworCS8qIE0zIChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbODoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDYsIHB0ci0+bTMpOworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOV0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMiwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogTTJESVYgKENMS1NFTF85Nk0pOiBDTV9DTEtTRUxfQ09SRVsxMjoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAxMiwgMiwgcHRyLT5tMmRpdik7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKTogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9NUFVfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2l2YV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqICB2b2lkIHByY21faW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGNsb2NrcyBpbiBhIGJvYXJkLXNwZWNpZmljIG1hbm5lciBmb3IKKyAqICAgIHRoZSBwcm9jZXNzb3IncyBQb3dlciwgUmVzZXQgYW5kIENsb2NrIE1hbmFnZXIgKFBSQ00pIGFuZCBpcworICogICAgY2FsbGVkIG9ubHkgd2hlbiBhbiBTUkFNLWJhc2VkIHN0YWNrIGlzIGF2YWlsYWJsZSAoaS5lLiBubworICogICAgU0RSQU0pLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcHJjbV9pbml0KHZvaWQpCit7CisJdTMyIHN5c19jbGtfcmF0ZSA9IDAsIHN5c19jbGtpbl9zZWwsIHN5c19jbGtfZGl2OworCXUzMiBjbGtfaW5kZXgsIHNpbF9pbmRleDsKKworCS8qIEdhdWdlIHRoZSBpbnB1dCBjbG9jayBzcGVlZCBhbmQgZmluZCBvdXQgdGhlIHN5c19jbGtpbl9zZWwKKwkgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBjbG9jay4KKwkgKi8KKwlzeXNfY2xrX3JhdGUgPSBnZXRfb3NjX2Nsa19zcGVlZCgpOworCWdldF9zeXNfY2xraW5fc2VsKHN5c19jbGtfcmF0ZSwgJnN5c19jbGtpbl9zZWwpOworCisJLyogU2V0IHRoZSBQUk1fQ0xLU0VMX1NZU19DTEtJTl9TRUwgdmFsdWUgaW4gdGhlIHByb2Nlc3Nvci4gKi8KKworCXNyMzIoUFJDTV9QUk1fQ0NSX0NMS1NFTCwKKwkJIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9TVEFSVCwKKwkJIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9CSVRTLAorCQkgc3lzX2Nsa2luX3NlbCk7CisKKwkvKiBJZiB0aGUgaW5wdXQgY2xvY2sgaXMgZ3JlYXRlciB0aGFuIDE5LjJNIGFsd2F5cyBkaXZpZGUgYnkgdHdvLgorCSAqCisJICogT24gT01BUDM2MzAsIEREUiBkYXRhIGNvcnJ1cHRpb24gaGFzIGJlZW4gb2JzZXJ2ZWQgb24gT0ZGIG1vZGUKKwkgKiBleGl0IGlmIHRoZSBzeXMgY2xvY2sgd2FzIGxvd2VyIHRoYW4gMjZNLiBBcyBhIHdvcmsgYXJvdW5kLAorCSAqIE9NQVAzNjMwIGlzIG9wZXJhdGVkIGF0IDI2TSBzeXMgY2xvY2sgYW5kIHRoaXMgaW50ZXJuYWwgZGl2aXNpb24KKwkgKiBpcyBub3QgcGVyZm9ybWVkLgorCSAqLworCisJaWYoKGlzX2NwdV9mYW1pbHkoKSAhPSBDUFVfT01BUDM2WFgpICYmCisJICAgKHN5c19jbGtpbl9zZWwgPiBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFopKSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzI7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAyOworCisJfSBlbHNlIHsKKwkJc3lzX2Nsa19kaXYgPSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMTsKKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbCAvIDE7CisKKwl9CisKKwlzcjMyKFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMLAorCQkgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX1NUQVJULAorCQkgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JJVFMsCisJCSBzeXNfY2xrX2Rpdik7CisKKwlpZiAoaXNfY3B1X2ZhbWlseSgpID09IENQVV9PTUFQMzZYWCkgeworCQlkcGxsM19pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCisJfSBlbHNlIHsKKwkJc2lsX2luZGV4ID0gZ2V0X2NwdV9yZXYoKSAtIDE7CisKKwkJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJCSAqIHNpbGljb24gcmV2aXNpb24uIFRoZSBjbGtfaW5kZXggdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGdldAorCQkgKiB0aGUgdmFsdWVzIGZvciB0aGF0IGlucHV0IHN5c2NsayBmcm9tIHRoZSBEUExMIHBhcmFtIHRhYmxlCisJCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZQorCQkgKiBhcHByb3ByaWF0ZSBzaWxpY29uIHJldi4KKwkJICovCisKKwkJLyogVW5sb2NrIE1QVSBEUExMIChzbG93cyB0aGluZ3MgZG93biwgYW5kIG5lZWRlZCBsYXRlcikgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9XX1BPV0VSX0JZUEFTUyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkJZHBsbDNfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCisJCS8qIExvY2sgTVBVIERQTEwgdG8gc2V0IGZyZXF1ZW5jeSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKwl9CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNjAzYTIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQveC1sb2FkLmxkcwpAQCAtMCwwICsxLDY1IEBACisvKgorICoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICogICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBYLUxvYWRlciBsaW5rZXIgc2NhdHRlciBmaWxlIGZvciB0aGUgTmVzdAorICogICAgICBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqLworCisvKgorICogTm92ZW1iZXIgMjAwNiAtIENoYW5nZWQgdG8gc3VwcG9ydCAzNDMwc2RwIGRldmljZQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlNGE5MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvTWFrZWZpbGUKQEAgLTAsMCArMSw2MiBAQAorIworIyAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlIGZpbGUgZm9yIHBvcnRpb25zIG9mIFgtTG9hZGVyIHNwZWNpZmljCisjICAgICAgdG8gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyMKKworIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gajQ5Lm8gbXV4Lm8gcHJjbS5vCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKK0NQUEZMQUdTICs9IC1JJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpCisKK1NSQ1MgICAgOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMgICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKFNPQkpTKSAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKFNPQkpTKSAkKE9CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOiAgY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZDk2MGMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL2NvbmZpZy5tawpAQCAtMCwwICsxLDIxIEBACisKKworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBPTUFQM0VWTSBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzIworIworIyBPTUFQM0VWTSBoYXMgMSBiYW5rIG9mIDEyOE1CIG1QT1AtU0RSQU0gb24gQ1MwCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworCitURVhUX0JBU0UgPSAweDQwMjAwMDAwCitTVEFDS19CQVNFID0gMHg0MDIwRkNCMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9qNDkuYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvajQ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwOWJiYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvajQ5LmMKQEAgLTAsMCArMSwxMDQ2IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogICAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0FDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBvbiBHUElPLCBSQU0gYW5kIGZsYXNoIGluaXRpYWxpemF0aW9uLgorICoKKyAqICAgICAgVGhpcyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgT01BUDMgRVZNIGVxdWl2YWxlbnQgZmlsZS4KKyAqCisgKiAgICAgIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG9yZGVyIGlzIHJvdWdobHk6CisgKgorICogICAgICAgIDEpIHNfaW5pdAorICogICAgICAgIDIpIGJvYXJkX2luaXQKKyAqICAgICAgICAzKSBtaXNjX2luaXRfcgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjZGVmaW5lIE1BWF9KNDlfQk9PVF9ERVZJQ0VTICgzKQorCit2b2lkCit1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykgeworCWRlbGF5KHVzZWNzKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2dldF9jcHVfaWQodm9pZCkKK3sKKwl1MzIgY3B1aWQgPSAwOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisKKwlyZXR1cm4gKGNwdWlkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlpZiAoKGNwdWlkICAmIDB4ZikgPT0gMHgwKSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMxKTsKKworCX0gZWxzZSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMyKTsKKworCX0KKworfQorCit1MzIKK2lzX2NwdV9mYW1pbHkodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisJdTMyIGNwdV9mYW1pbHkgPSAwLCBvbWFwMzR4eF9pZCA9IDA7CisJdTE2IGhhd2tleWU7CisKKwlpZiAoKGNwdWlkICYgMHhmKSA9PSAweDApIHsKKwkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKworCX0gZWxzZSB7CisJCW9tYXAzNHh4X2lkID0gX19yYXdfcmVhZGwoT01BUDM0WFhfQ09OVFJPTF9JRCk7CisJCWhhd2tleWUgID0gKG9tYXAzNHh4X2lkID4+IEhBV0tFWUVfU0hJRlQpICYgMHhmZmZmOworCisJCXN3aXRjaCAoaGF3a2V5ZSkgeworCisJCWNhc2UgSEFXS0VZRV9BTTM1WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX0FNMzVYWDsKKwkJCWJyZWFrOworCisJCWNhc2UgSEFXS0VZRV9PTUFQMzZYWDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM2WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM0WFg6CisJCWRlZmF1bHQ6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCQkJYnJlYWs7CisKKwkJfQorCX0KKworCXJldHVybiAoY3B1X2ZhbWlseSk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorY3B1X2lzXzM0MTAodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCWlmKGdldF9jcHVfcmV2KCkgPCBDUFVfMzQzMF9FUzIpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogcmVhZCBzY2FsYWJpbGl0eSBzdGF0dXMgYW5kIHJldHVybiAxIGZvciAzNDEwKi8KKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX1NUQVRVUyk7CisJCS8qIENoZWNrIHdoZXRoZXIgTVBVIGZyZXF1ZW5jeSBpcyBzZXQgdG8gMjY2IE1IeiB3aGljaAorCQkgKiBpcyBub21pbmFsIGZvciAzNDEwLiBJZiB5ZXMgcmV0dXJuIHRydWUgZWxzZSBmYWxzZQorCQkgKi8KKwkJaWYgKCgoc3RhdHVzID4+IDgpICYgMHgzKSA9PSAweDIpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogIHZvaWQgc3IzMigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGNsZWFycyBhbmQgc2V0cyBhIHZhbHVlIGluIGEgYml0IGV4dGVudCBmb3IgYQorICogICAgMzItYml0IHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyBhdCB3aGljaCB0byBjbGVhciBhbmQgc2V0IHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICAgICAgICAgIHNwZWNpZmllZCAzMi1iaXQgdmFsdWUuCisgKiAgICBzdGFydF9iaXQgLSBUaGUgZmlyc3QgYml0IG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgbnVtX2JpdHMgIC0gVGhlIHJhbmdlIG9mIGJpdHMgb2YgdGhlIDMyLWJpdCBkYXRhIHRvIGNsZWFyIGFuZCBzZXQuCisgKiAgICB2YWx1ZSAgICAgLSBUaGUgdmFsdWUgdG8gc2V0LgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyB3aXRoIHRoZSBzcGVjaWZpZWQgYml0IGV4dGVudCBjbGVhcmVkIGFuZAorICogICAgICAgICAgICAgICAgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisKKwltc2sgPSAoMSA8PCBudW1fYml0cyk7CisJLS1tc2s7CisJdG1wID0gX19yYXdfcmVhZGwoYWRkcikgJiB+KG1zayA8PCBzdGFydF9iaXQpOworCXRtcCB8PSAgdmFsdWUgPDwgc3RhcnRfYml0OworCV9fcmF3X3dyaXRlbCh0bXAsIGFkZHIpOworfQorCisvKgorICogIHUzMiB3YWl0X29uX3ZhbHVlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmVhZHMgdGhlIHJlZ2lzdGVyIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBhbmQKKyAqICAgIGJ1c3kgd2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCBtYXRjaCB2YWx1ZSBpcyByZWFkIG9yIHVudGlsIHRoZQorICogICAgYm91bmRlZCBudW1iZXIgb2YgbG9vcHMgaGF2ZSBiZWVuIHJlYWNoZWQuCisgKgorICogIElucHV0KHMpOgorICogICAgcmVhZF9iaXRfbWFzayAtIFRoZSBiaXQgbWFzayB0byBhcHBseSBhZnRlciByZWFkaW5nIHRoZSByZWdpc3Rlci4KKyAqICAgIG1hdGNoX3ZhbHVlICAgLSBUaGUgdmFsdWUgdG8gbWF0Y2ggb24gYWZ0ZXIgcmVhZGluZyBhbmQgbWFza2luZy4KKyAqICAgIHJlYWRfYWRkciAgICAgLSBUaGUgcmVnaXN0ZXIgYWRkcmVzcyB0byByZWFkLgorICogICAgYm91bmQgICAgICAgICAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0byByZWFkIGJlZm9yZSBnaXZpbmcKKyAqICAgICAgICAgICAgICAgICAgICB1cC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUcnVlICgxKSBpZiB0aGUgbWF0Y2hfdmFsdWUgd2FzIHJlYWNoZWQ7IG90aGVyd2lzZSwgZmFsc2UgKDApLgorICoKKyAqLwordTMyCit3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit0cnlfdW5sb2NrX21lbW9yeSh2b2lkKQoreworCWNvbnN0IGludCB0eXBlID0gZ2V0X2RldmljZV90eXBlKCk7CisKKwkvKgorCSAqIElmIHRoZSBwcm9jZXNzb3IgaXMgYSBHUCBkZXZpY2UsIHVubG9jayB0aGUgZGV2aWNlIFNSQU0gZm9yCisJICogZ2VuZXJhbCB1c2UuCisJICovCisKKwlpZiAodHlwZSA9PSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0dQKSB7CisJCXNlY3VyZV91bmxvY2soKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKyNpZiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBTRFJDIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChTRFJDX1JFVklTSU9OKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNDT05GSUcpOworCURVTVBfUkVHTChTRFJDX1NZU1NUQVRVUyk7CisJRFVNUF9SRUdMKFNEUkNfQ1NfQ0ZHKTsKKwlEVU1QX1JFR0woU0RSQ19TSEFSSU5HKTsKKwlEVU1QX1JFR0woU0RSQ19FUlJfQUREUik7CisJRFVNUF9SRUdMKFNEUkNfRVJSX1RZUEUpOworCURVTVBfUkVHTChTRFJDX0RMTEFfQ1RSTCk7CisJRFVNUF9SRUdMKFNEUkNfRExMQV9TVEFUVVMpOworCURVTVBfUkVHTChTRFJDX1BPV0VSX1JFRyk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18wKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8wKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzApOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzApOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQ0ZHXzEpOworCURVTVBfUkVHTChTRFJDX01SXzEpOworCURVTVBfUkVHTChTRFJDX0VNUjJfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEFfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEJfMSk7CisJRFVNUF9SRUdMKFNEUkNfUkZSX0NUUkxfMSk7CisJRFVNUF9SRUdMKFNEUkNfTUFOVUFMXzEpOworfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykgKi8KKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgR1BNQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woR1BNQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKEdQTUNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUVNUQVRVUyk7CisJRFVNUF9SRUdMKEdQTUNfSVJRRU5BQkxFKTsKKwlEVU1QX1JFR0woR1BNQ19USU1FT1VUX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX0VSUl9BRERSRVNTKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfVFlQRSApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRyApOworCURVTVBfUkVHTChHUE1DX1NUQVRVUyApOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18wKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMSk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzIpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18zKTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNCk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM181KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzUpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN182KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNyk7CisKKyNpZiAwCisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF83KTsKKworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU182KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV81KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzcpOworCisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMSk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMik7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfU1RBVFVTKTsKKworCURVTVBfUkVHTChHUE1DX0VDQ19DT05GSUcpOworCURVTVBfUkVHTChHUE1DX0VDQ19DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfU0laRV9DT05GSUcpOworCisJRFVNUF9SRUdMKEdQTUNfRUNDMV9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzJfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MzX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNF9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzVfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M2X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDN19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzhfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M5X1JFU1VMVCk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM180KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM181KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM182KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM183KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9TV0RBVEEpOworI2VuZGlmCit9CisjZWxzZQorIyBkZWZpbmUgb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19QUkNNX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIFBSQ00gUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKFBSQ01fUFJNX0NDUl9DTEtTRUwpOworCURVTVBfUkVHTChQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwzX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0NBTSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DT1JFKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0RTUyk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfRU1VKTsKK30KKyNlbHNlCisjZGVmaW5lIG9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDRkdfUFJDTV9ERUJVRyAqLworCisvKgorICogIHZvaWQgY29uZmlnX2RpYW1vbmRfc2RyYW0oKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgcHJvY2Vzc29yJ3MgU0RSQU0gQ29udHJvbGxlciAoU0RSQykKKyAqICAgIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgMzIgTWIgeCAxNiBiICg2NAorICogICAgTWlCKSBERFIgU0RSQU0gb24gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2NvbmZpZ19kaWFtb25kX3NkcmFtKHZvaWQpCit7CisJdTMyIHZhbHVlLCBhY3RpbV9jdHJsYSwgYWN0aW1fY3RybGI7CisKKwkvKgorCSAqIFN0ZXAgMTogUmVzZXQgdGhlIFNEUkMgY29udHJvbGxlciBhbmQgdGhlbiB3YWl0IGZvciB0aGUgcmVzZXQKKwkgKiBldmVudCB0byBjbGVhci4KKwkgKi8KKworICAgIF9fcmF3X3dyaXRlbChTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfU0VULCBTRFJDX1NZU0NPTkZJRyk7CisgICAgd2FpdF9vbl92YWx1ZShTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NUQVRVUywKKwkJCQkgIDEyMDAwMDAwKTsKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX0NMRUFSLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKgorCSAqIFN0ZXAgMjogU2V0dXAgdGhlIHBvc2l0aW9uIGFuZCBnZW9tZXRyeSBvZiB0aGUgU0RSQU0gZGV2aWNlIG9uCisJICogdGhlIGNvbnRyb2xsZXIncyBidXMuCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1NIQVJJTkdfTE9DS19PRkYgCQkJCQkJCQkJCQkJfAorCQkgU0RSQ19TSEFSSU5HX0NTMU1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTMU1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX0NTME1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTME1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX1NEUkNUUklTVEFURV9PRkYpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19TSEFSSU5HKTsKKworCS8qCisJICogU3RlcCAzOiBTZXR1cCB0aGUgbWVtb3J5IGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBSQVMgd2lkdGgsCisJICogQ0FTIHdpZHRoLCBhZGRyZXNzIG11bHRpcGxleGluZywgc2l6ZSwgYmFuayBtYXBwaW5nLCBidXMgd2lkdGgsCisJICogcG93ZXIgbW9kZSwgRERSIHR5cGUgYW5kIG1lbW9yeSB0eXBlLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19NQ0ZHX0xPQ0tTVEFUVVNfUlcJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfUkFTV0lEVEhfMTRfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQ0FTV0lEVEhfRU5DT0RFKFNEUkNfTUNGR19DQVNXSURUSF8xMF9CSVRTKQkJCXwKKwkJIFNEUkNfTUNGR19BRERSTVVYTEVHQUNZX0ZMRVhJQkxFCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfUkFNU0laRV9FTkNPREUoQ0ZHX1NEUkFNX1NJWkVfTUIpCQkJCQl8CisJCSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fRU5DT0RFKFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9SX0JfQyl8CisJCSBTRFJDX01DRkdfQjMyTk9UMTZfT0ZGCQkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfREVFUFBEX1NVUFBPUlRFRAkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfRERSVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX0REUlRZUEVfTU9CSUxFX0REUikJCQl8CisJCSBTRFJDX01DRkdfUkFNVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX1JBTVRZUEVfRERSKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01DRkdfMCk7CisKKwkvKgorCSAqIFN0ZXAgNDogRXN0YWJsaXNoIHRoZSBBQyBmaW5lIHR1bmluZyB0aW1pbmcgY2hhcmFjdGVyaXN0aWNzLgorCSAqLworCisJYWN0aW1fY3RybGEKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQV9UUkZDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkFTX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkFTKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkNEX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkNEKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJSRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1REUExfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1REUEwpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UREFMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UREFMKSk7CisKKwlhY3RpbV9jdHJsYgorCQk9IChTRFJDX0FDVElNX0NUUkxCX1RXVFJfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RXVFIpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UWFNSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFNSKSk7CisKKwlfX3Jhd193cml0ZWwoYWN0aW1fY3RybGEsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxiLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJLyoKKwkgKiBTdGVwIDU6IEVzdGFibGlzaCB0aGUgbWVtb3J5IGF1dG9yZWZyZXNoIGNvbnRyb2wKKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfUkZSX0NUUkxfQVJDVl9FTkNPREUoMTI0NCkJCQkJCQl8CisJCSBTRFJDX1JGUl9DVFJMX0FSRV9FTkNPREUoU0RSQ19SRlJfQ1RSTF9BUkVfMV9BUkNWKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1JGUl9DVFJMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19QT1dFUl9SRUdfV0FLRVVQX0RFTEFZRUQJCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQVVUT0NPVU5UX0VOQ09ERSgwKQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fUlNUX0VOQUJMRQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fSURMRV9ESVNBQkxFCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX0VOQ09ERShTRFJDX1BPV0VSX1JFR19DTEtDVFJMX05PTkUpCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfUEFHRVBPTElDWV9IUEhCKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfUE9XRVJfUkVHKTsKKworCS8qCisJICogU3RlcCA2OiBFc3RhYmxpc2ggdGhlIEpFREVDLWRlZmluZWQgbW9kZSBhbmQgRExMIHBhcmFtZXRlcnMuCisJICovCisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJZGVsYXkoNTAwMCk7CSAgICAgICAgICAgICAgICAgCisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9QUkVDSEFSR0VfQUxMKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19NUl9aRVJPXzEJCQkJCQkJfAorCQkgU0RSQ19NUl9XQlNUX0VOQUJMRQkJCQkJfAorCQkgU0RSQ19NUl9aRVJPXzAJCQkJCQkJfAorCQkgU0RSQ19NUl9DQVNMX0VOQ09ERShTRFJDX01SX0NBU0xfMykJfAorCQkgU0RSQ19NUl9TSUxfU0VSSUFMCQkJCQkJfAorCQkgU0RSQ19NUl9CTF9FTkNPREUoU0RSQ19NUl9CTF80KSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01SXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19ETExBX0NUUkxfRklYRURfREVMQVlfRU5DT0RFKDApCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfSU5JVF9MQVRfRU5DT0RFKDApCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9FTkNPREUoU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX1BXRCkgfCAKKwkJIFNEUkNfRExMQV9DVFJMX0RMTF9FTkFCTEUJCQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9MT0NLX1RSQUNLSU5HREVMQVkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19ETExBX0NUUkwpOworCisJLyoKKwkgKiBEZWxheSBmb3IgYSAicmVhc29uYWJseSBsb25nIiBwZXJpb2Qgb2YgdGltZSB0byBhbGxvdyB0aGUKKwkgKiByZXF1ZXN0ZWQgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4KKwkgKi8KKworIAlkZWxheSgweDIwMDAwKTsKK30KKworLyoKKyAqICB2b2lkIHNfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIHZlcnkgZWFybHkgc3lzdGVtIGluaXRpYWxpemF0aW9uIG9mIGNoaXAKKyAqICAgIHBpbiBtdWx0aXBsZXhpbmcgYW5kIGNsb2NrcyBhbmQgaXMgY2FsbGVkIHdoZW4gT05MWSBhbgorICogICAgU1JBTS1iYXNlZCBzdGFjayBpcyBhdmFpbGFibGUgKGkuZS4gbm8gU0RSQU0pLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworCXRyeV91bmxvY2tfbWVtb3J5KCk7CisJc2V0X211eGNvbmZfcmVncygpOworCisJZGVsYXkoMTAwKTsKKworCXByY21faW5pdCgpOworCXBlcl9jbG9ja3NfZW5hYmxlKCk7CisJY29uZmlnX2RpYW1vbmRfc2RyYW0oKTsKK30KKworLyoKKyAqICBpbnQgYm9hcmRfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBlYXJseSwgYm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKyAqICAgIGZvbGxvd2luZyBjb3JlIENQVSBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgICBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIGJvYXJkLXNwZWNpZmljIHRvIGRvLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgT0s7IG90aGVyd2lzZSwgbm9uLXplcm8gb24gZXJyb3IuCisgKgorICovCitpbnQKK2JvYXJkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIHUzMiBnZXRfZGV2aWNlX3R5cGUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBERVZJQ0VUWVBFIGZpZWxkLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgKiAgICBkZXZpY2UgaXMgb2YgVFNULCBFTVUsIEhTIG9yIEdQIHR5cGUuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X2RldmljZV90eXBlKHZvaWQpCit7CisJY29uc3QgaW50IHZhbHVlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpOworCisJcmV0dXJuIChDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0RFQ09ERSh2YWx1ZSkpOworfQorCisvKgorICogIHUzMiBnZXRfc3lzYm9vdF92YWx1ZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGRlY29kZWQgdmFsdWUgZnJvbSB0aGUgQ1BVJ3MKKyAqICAgIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIFNZU0JPT1Qgb3JkZXIgc3ViZmllbGQsIGluZGljYXRpbmcgdGhlCisgKiAgICBvcmRlciBvZiBtZW1vcnkgaW50ZXJmYWNlcyBmcm9tIHdoaWNoIHRoZSBwcm9jZXNzb3Igd2lsbCBhdHRlbXB0CisgKiAgICB0byBib290IGl0c2VsZi4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgZGVjb2RlZCBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLgorICoKKyAqLwordTMyCitnZXRfc3lzYm9vdF92YWx1ZSh2b2lkKQoreworI2lmIDAKKwljb25zdCB1MzIgdmFsdWUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUyk7CisJY29uc3QgdTMyIHBlcmlwaGVyYWxfdHlwZSA9IENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9QRVJJUEhFUkFMOworCisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgYW5kIGNhbGxlcnMgb2YgaXQgYXJlIGltcGxpY2l0bHkgZXhwZWN0aW5nIHRoZQorCSAqIE1FTU9SWSBpbnRlcmZhY2UgKFNZU0JPT1RbNV0gPT0gMCkgbm90IHRoZSBQRVJISVBIRVJBTAorCSAqIGludGVyZmFjZSAoU1lTQk9PVFs1XSA9PSAxKSBib290IG9yZGVyLCBzbyBjaGVjayB0aGF0IGlzCisJICogYWN0dWFsbHkgdGhlIGNhc2UuCisJICovCisKKwlpZiAoQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX0RFQ09ERSh2YWx1ZSkgPT0gcGVyaXBoZXJhbF90eXBlKSB7CisJCWhhbmcoKTsKKwl9CisKKwlyZXR1cm4gKENPTlRST0xfU1RBVFVTX1NZU0JPT1RfT1JERVJfREVDT0RFKHZhbHVlKSk7CisjZWxzZQorICAgICAgICByZXR1cm4gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpICYgMHgzZjsKKyNlbmRpZgorfQorCisvKgorICogIGludCBnZXRfYm9vdF9kZXZpY2VfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VfbGlzdCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyBhIGNvbnN0YW50IGxpc3QgaW5kaWNhdGluZyB0aGUgcHJlZmVycmVkCisgKiAgICBkZXZpY2UgYm9vdCBsaXN0LgorICogICAgSXQgZ2V0cyBjYWxsZWQgZnJvbSBzdGFydF9hcm1ib290IGluIGJvYXJkLmMKKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgcHJlZmVycmVkIGZpcnN0IHByb2Nlc3NvciBtZW1vcnkgYm9vdCBpbnRlcmZhY2UuCisgKgorICovCisKK2ludAorZ2V0X2Jvb3RfZGV2aWNlc19saXN0KGNvbnN0IHUzMioqIGRldmljZXNfbGlzdCkKK3sKKwlzdGF0aWMgdTMyIGxpc3RbTUFYX0o0OV9CT09UX0RFVklDRVNdOworCWNvbnN0IHUzMiBtZW1fb3JkZXIgPSBnZXRfc3lzYm9vdF92YWx1ZSgpOworCisJLy8gc2V0IGRlZmF1bHRzCisJaW50IG51bWJlcl9vZl9kZXZpY2VzID0gMDsKKwkqZGV2aWNlc19saXN0ID0gJmxpc3RbMF07CisKKwlzd2l0Y2ggKG1lbV9vcmRlcikgeworCWNhc2UgMTU6CisJCWxpc3RbMF0gPSBHUE1DX05BTkQ7CisJCWxpc3RbMV0gPSBVU0JfUEVSSVBIRVJBTDsKKwkJbGlzdFsyXSA9IE1NQ19OQU5EOworCQludW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9KNDlfQk9PVF9ERVZJQ0VTOworCQlicmVhazsKKwljYXNlIDQ3OgorCQlsaXN0WzBdID0gVVNCX1BFUklQSEVSQUw7CisJCWxpc3RbMV0gPSBNTUNfTkFORDsKKwkJbGlzdFsyXSA9IEdQTUNfTkFORDsKKwkJbnVtYmVyX29mX2RldmljZXMgPSBNQVhfSjQ5X0JPT1RfREVWSUNFUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBudW1iZXJfb2ZfZGV2aWNlczsKK30KKworLyoKKyAqICBpbnQgbWlzY19pbml0X3IoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgbWlzY2VsbGFuZW91cywgYm9hcmQtc3BlY2lmaWMKKyAqICAgIGluaXRpYWxpemF0aW9uIGZvbGxvd2luZyBDUFUsIGVhcmx5IGJvYXJkLCBzZXJpYWwgYW5kIE5BTkQKKyAqICAgIGluaXRpYWxpemF0aW9uIGJ1dCBwcmlvciB0byBsb2FkaW5nIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIKKyAqICAgIHRvIFJBTS4KKyAqCisgKiAgICBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIGJvYXJkLXNwZWNpZmljIHRvIGRvLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgT0s7IG90aGVyd2lzZSwgbm9uLXplcm8gb24gZXJyb3IuCisgKgorICovCitpbnQKK21pc2NfaW5pdF9yKHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3dhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCit3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogcGVyaXBoZXJhbF9lbmFibGUKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUgdGhlIGNsa3MgJiBwb3dlciBmb3IgcGVyaWZzIChHUFQyLCBVQVJUMSwuLi4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICB2b2lkIGZvb2JhcigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lLi4uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitwZXJfY2xvY2tzX2VuYWJsZSh2b2lkKQoreworCS8qIEVuYWJsZSBHUDIgdGltZXIuICovCisJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCAxLCAweDEpOyAvKiBHUFQyID0gc3lzIGNsayAqLworCXNyMzIoQ01fSUNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogSUNLZW4gR1BUMiAqLworCXNyMzIoQ01fRkNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogRkNLZW4gR1BUMiAqLworCisjaWZkZWYgQ0ZHX05TMTY1NTAKKwkvKiBFbmFibGUgVUFSVDEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01NQworCS8qIEVuYWJsZSBNTUMxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisjZW5kaWYKKwlkZWxheSgxMDAwKTsKK30KKworc3RhdGljIGludAorZ3BtY19jb25maWdfMCh2b2lkKQoreworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfQ09ORklHMV8wKQorCS8qCisJICogRmlyc3QsIGRpc2FibGUgdGhlIGludGVyZmFjZSBhbmQgd2FpdC4KKwkgKi8KKwlfX3Jhd193cml0ZWwoR1BNQ19DT05GSUc3X0NTVkFMSURfRElTQUJMRUQsIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDEwMDApOworCisJLyoKKwkgKiBOZXh0LCBwcm9ncmFtIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisJICovCisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzFfMCwgR1BNQ19DT05GSUcxXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcyXzAsIEdQTUNfQ09ORklHMl8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHM18wLCBHUE1DX0NPTkZJRzNfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzRfMCwgR1BNQ19DT05GSUc0XzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc1XzAsIEdQTUNfQ09ORklHNV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNl8wLCBHUE1DX0NPTkZJRzZfMCk7CisKKwkvKgorCSAqIEZpbmFsbHksIGVuYWJsZSB0aGUgR1BNQyBtYXBwaW5nIGFuZCBzcGluIGZvciB0aGUgcGFyYW1ldGVycyB0bworCSAqIGJlY29tZSBhY3RpdmUuCisJICovCisJX19yYXdfd3JpdGVsKChDRkdfR1BNQ19DT05GSUc3XzAgfCBHUE1DX0NPTkZJRzdfQ1NWQUxJRF9FTkFCTEVEKSwKKwkJCQkgR1BNQ19DT05GSUc3XzApOworCisJZGVsYXkoMjAwMCk7CisKKwlpZiAobmFuZF9jaGlwKCkpeworCQlyZXR1cm4gKDEpOworCX0KKyNlbmRpZiAvKiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkgKi8KKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiAgaW50IG5hbmRfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIKKyAqICAgIChHUE1DKSBzdWNoIHRoYXQgb24tYm9hcmQgTkFORCBkZXZpY2VzIG1heSBiZSBhY2Nlc3NlZCBmb3IKKyAqICAgIHNlY29uZC1zdGFnZSBib290LgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgTkFORCB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkOyBvdGhlcndpc2UsIDEuCisgKgorICovCitpbnQKK25hbmRfaW5pdCh2b2lkKQoreworCWludCBzdGF0dXMgPSAxOworCisJLyoKKwkgKiBFc3RhYmxpc2ggR1BNQyBnbG9iYWwgc2V0dGluZ3MuCisJICovCisKKwlfX3Jhd193cml0ZWwoR1BNQ19TWVNDT05GSUdfSURMRU1PREVfU01BUlQsIEdQTUNfU1lTQ09ORklHKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX0lSUUVOQUJMRV9BTExfRElTQUJMRSwgR1BNQ19JUlFFTkFCTEUpOworCisJX19yYXdfd3JpdGVsKEdQTUNfVElNRU9VVEVOQUJMRV9PRkYsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsKKworCWlmIChncG1jX2NvbmZpZ18wKCkpIHsKKwkJcHV0cygiVW5zdXBwb3J0ZWQgTkFORCBkZXZpY2UgQCBHUE1DMCFcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJc3RhdHVzID0gMDsKKworIGRvbmU6CisJLyogRHVtcCBHUE1DIGFuZCBTRFJDIHJlZ2lzdGVycyBpZiBzbyBjb25maWd1cmVkLiAqLworCisJb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKCk7CisJb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKCk7CisJb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKCk7CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiAgdm9pZCBib2FyZF9oYW5nKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IGJvYXJkLXNwZWNpZmljIGFjdGlvbnMgd2hlbiB0aGUgc3lzdGVtCisgKiAgICBoYW5ncyBieSBleGVjdXRpbmcgaGFuZygpLiBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvOworICogICAgaG93ZXZlciwgd2UgbWlnaHQgbGF0ZXIgZHJpdmUgdGhlIHBpZXpvIG9yIGEgTEVELgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorYm9hcmRfaGFuZyAodm9pZCkKK3sKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL211eC5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGM3ZGYwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9tdXguYwpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0NVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IEkvTyBwYWQgbXVsdGlwbGV4ZXIgY29uZmlndXJhdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgaXMgb3JpZ2luYWxseSBpbmhlcml0ZWQgYW5kIHNwbGl0IGZyb20gdGhlIE9NQVAzIEVWTQorICogICAgICBib2FyZCBmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qCisgKiAgdm9pZCBzZXRfbXV4Y29uZl9yZWdzKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmVzIHNldHMgdGhlIEkvTyBwYWQgbXVsdGlwbGV4ZXJzIGZvciBVQVJULCBHUE1DLCBTRFJDLAorICogICAgR1BJTy4KKyAqCisgKiBUaGUgY29tbWVudGVkIHN0cmluZyBnaXZlcyB0aGUgZmluYWwgbXV4IGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcGluCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKi8KK3ZvaWQKK3NldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwkvKgorCSAqIFRoZSBiaXQgZmllbGRzIGZvciB0aGVzZSBzZXR0aW5ncyBhcmUgYXMgZm9sbG93czoKKwkgKgorCSAqICAgSXtFTixESVN9CSAJLSBJbnB1dCBFbmFibGUvRGlzYWJsZQorCSAqICAgUFRbRFVdCQkgCS0gUHVsbC1kb3duLCAtdXAKKwkgKiAgIERJUyxFTgkJICAJLSBQdWxsLWRvd24sIC11cCBkaXNhYmxlZC9lbmFibGVkCisJICogICBNWzAxMjM0NTY3XQktIENvbmZpZ3VyYXRpb24gbW9kZSAwLTcKKwkgKi8KKworCS8qCisJICogU0RSQU0gQ29udHJvbGxlciAoU0RSQykKKwkgKgorCSAqIE1vc3Qgb2YgdGhlIFNEUkMgc2lnbmFscyBhcmUgdXNlZCB0byBkcml2ZSB0aGUgU2Ftc3VuZworCSAqIEs0WDUxMTYzUEktRkNHNiA1MTIgTWIgeCAxNi1iaXQgKDY0IE1pQikgRERSIFNEUkFNLiBCZWNhdXNlIHdlCisJICogaW50ZXJmYWNlIGluIDE2LWJpdCByYXRoZXIgdGhhbiAzMi1iaXQgbW9kZSwgd2UgcGxhY2UgdGhlCisJICogdW51c2VkIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCSAqLworCisJTVVYX1ZBTChDUChTRFJDX0QwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMAorCU1VWF9WQUwoQ1AoU0RSQ19EMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEKKwlNVVhfVkFMKENQKFNEUkNfRDIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QyCisJTVVYX1ZBTChDUChTRFJDX0QzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMworCU1VWF9WQUwoQ1AoU0RSQ19ENCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDQKKwlNVVhfVkFMKENQKFNEUkNfRDUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q1CisJTVVYX1ZBTChDUChTRFJDX0Q2KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENgorCU1VWF9WQUwoQ1AoU0RSQ19ENyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDcKKwlNVVhfVkFMKENQKFNEUkNfRDgpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q4CisJTVVYX1ZBTChDUChTRFJDX0Q5KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOQorCU1VWF9WQUwoQ1AoU0RSQ19EMTApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMAorCU1VWF9WQUwoQ1AoU0RSQ19EMTEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMQorCU1VWF9WQUwoQ1AoU0RSQ19EMTIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMgorCU1VWF9WQUwoQ1AoU0RSQ19EMTMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMworCU1VWF9WQUwoQ1AoU0RSQ19EMTQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxNAorCU1VWF9WQUwoQ1AoU0RSQ19EMTUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxNQorCisJLy8gQmVjYXVzZSB3ZSBpbnRlcmZhY2UgU0RSQU0gaW4gMTYtYml0IG1vZGUsIHBsYWNlCisJLy8gU0RSQ19EQVRBWzMxOjE2XSBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMzApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19DTEsKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EUVMxCisKKwkvLyBQbGFjZSB1bnVzZWQgRFEgcGlucyBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKFNEUkNfRFFTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvKgorCSAqIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlciAoR1BNQykKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChHUE1DX0ExKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMQorCU1VWF9WQUwoQ1AoR1BNQ19BMiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTIKKwlNVVhfVkFMKENQKEdQTUNfQTMpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EzCisJTVVYX1ZBTChDUChHUE1DX0E0KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNAorCU1VWF9WQUwoQ1AoR1BNQ19BNSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTUKKwlNVVhfVkFMKENQKEdQTUNfQTYpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E2CisJTVVYX1ZBTChDUChHUE1DX0E3KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNworCisJLy8gUGxhY2UgdGhlIHVudXNlZCBHUE1DX0E4IHBpbiBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKEdQTUNfQTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBHUE1DX0E5IHRvIEdQSU9fNDIgdXNlZCBhcyBhIHB1c2gtcHVsbCwgYWN0aXZlIGxvdyBpbnB1dAorCS8vIGZyb20gdGhlIFVTQiBQSFkgZm9yIFVTQiBzdXNwZW5kIG5vdGlmaWNhdGlvbi4KKworCU1VWF9WQUwoQ1AoR1BNQ19BOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIEdQSU9fNDIKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwlNVVhfVkFMKENQKEdQTUNfRDApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QwCisJTVVYX1ZBTChDUChHUE1DX0QxKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMQorCU1VWF9WQUwoQ1AoR1BNQ19EMiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDIKKwlNVVhfVkFMKENQKEdQTUNfRDMpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QzCisJTVVYX1ZBTChDUChHUE1DX0Q0KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDUKKwlNVVhfVkFMKENQKEdQTUNfRDYpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q2CisJTVVYX1ZBTChDUChHUE1DX0Q3KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENworCU1VWF9WQUwoQ1AoR1BNQ19EOCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDgKKwlNVVhfVkFMKENQKEdQTUNfRDkpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q5CisJTVVYX1ZBTChDUChHUE1DX0QxMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEwCisJTVVYX1ZBTChDUChHUE1DX0QxMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDExCisJTVVYX1ZBTChDUChHUE1DX0QxMiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEyCisJTVVYX1ZBTChDUChHUE1DX0QxMyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEzCisJTVVYX1ZBTChDUChHUE1DX0QxNCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDE0CisJTVVYX1ZBTChDUChHUE1DX0QxNSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDE1CisJTVVYX1ZBTChDUChHUE1DX05DUzApLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzAKKwlNVVhfVkFMKENQKEdQTUNfTkNTMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MyCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gR1BNQ19OQ1M2IHRvIEdQVDExX1BXTV9FVlQgdXNlZCBhcyBhIHB1c2gtcHVsbCBwdWxzZSB3aWR0aAorCS8vIG1vZHVsYXRlZCAoUFdNKSBzaWduYWwgZm9yIHRoZSBwaWV6by4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTMpKTsJLy8gR1BUMTFfUFdNX0VWVAorCisJLy8gQXNzaWduIEdQTUNfTkNTNyB0byBHUElPXzU4IHVzZWQgYXMgYSBwdXNoLXB1bGwgb3V0cHV0CisJLy8gUElFWk9fTkVOQUJMRSB0byB0aGUgVEkgU043NExWQzJHMjQwIER1YWwgQnVmZmVyL0RyaXZlciBXaXRoCisJLy8gMy1TdGF0ZSBPdXRwdXRzIGlucHV0cy4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT181OAorCisJTVVYX1ZBTChDUChHUE1DX0NMSyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQ0xLCisJTVVYX1ZBTChDUChHUE1DX05BRFZfQUxFKSwJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25BRFZfQUxFCisJTVVYX1ZBTChDUChHUE1DX05PRSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbk9FCisJTVVYX1ZBTChDUChHUE1DX05XRSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbldFCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25CRTBfQ0xFCisKKwkvLyBBc3NpZ24gR1BNQ19OQkUxIHRvIEdQSU9fNjEgdXNlZCBhcyBhIHB1c2gtcHVsbCBvdXRwdXQgdG8gdGhlCisJLy8gWmlnQmVlIGFjdGl2ZS1sb3cgcmVzZXQuCisKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNjEKKworCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25XUAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfV0FJVDAKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX1dBSVQxCisJTVVYX1ZBTChDUChHUE1DX1dBSVQyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW5hdmFpbGFibGUKKworCS8vIEFzc2lnbiBHUE1DX1dBSVQzIHRvIEdQSU9fNjUgdXNlZCBhcyBhbiBhY3RpdmUtaGlnaCwgcHVzaC1wdWxsCisJLy8gYmFja3BsYXRlIGRldGVjdCBpbnB1dC4KKworCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNjUKKworCS8qCisJICogRGlzcGxheSBTdWJzeXN0ZW0gKERTUykKKwkgKgorCSAqIEFsbCBEU1Mgc2lnbmFscyBhcmUgdXNlZCBpbiB0aGVpciBub3JtYWwsIGRlZmF1bHQgbW9kZSAoTW9kZSAwKQorCSAqIHRvIGRyaXZlIHRoZSBTYW1zdW5nIExNUzM1MERGMFsxM10gTENEIGRpc3BsYXkgcGFuZWwuCisJICovCisKKwlNVVhfVkFMKENQKERTU19QQ0xLKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX1BDTEsKKwlNVVhfVkFMKENQKERTU19IU1lOQyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19IU1lOQworCU1VWF9WQUwoQ1AoRFNTX1ZTWU5DKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX1ZTWU5DCisJTVVYX1ZBTChDUChEU1NfQUNCSUFTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0FDQklBUworCU1VWF9WQUwoQ1AoRFNTX0RBVEEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEwCisJTVVYX1ZBTChDUChEU1NfREFUQTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEKKwlNVVhfVkFMKENQKERTU19EQVRBMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEEzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEzCisJTVVYX1ZBTChDUChEU1NfREFUQTQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTQKKwlNVVhfVkFMKENQKERTU19EQVRBNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNQorCU1VWF9WQUwoQ1AoRFNTX0RBVEE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE2CisJTVVYX1ZBTChDUChEU1NfREFUQTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTcKKwlNVVhfVkFMKENQKERTU19EQVRBOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBOAorCU1VWF9WQUwoQ1AoRFNTX0RBVEE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE5CisJTVVYX1ZBTChDUChEU1NfREFUQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTEKKwlNVVhfVkFMKENQKERTU19EQVRBMTIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEyCisJTVVYX1ZBTChDUChEU1NfREFUQTEzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMworCU1VWF9WQUwoQ1AoRFNTX0RBVEExNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTQKKwlNVVhfVkFMKENQKERTU19EQVRBMTUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE1CisJTVVYX1ZBTChDUChEU1NfREFUQTE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNgorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTcKKwlNVVhfVkFMKENQKERTU19EQVRBMTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE4CisJTVVYX1ZBTChDUChEU1NfREFUQTE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExOQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjAKKwlNVVhfVkFMKENQKERTU19EQVRBMjEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIxCisJTVVYX1ZBTChDUChEU1NfREFUQTIyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjMKKworCU1VWF9WQUwoQ1AoQ0FNX1dFTiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBVbml2ZXJzYWwgQXN5bmNocm9ub3VzIFJlY2VpdmVyIC8gVHJhbnNtaXR0ZXIgKFVBUlQpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoVUFSVDFfVFgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9UWAorCU1VWF9WQUwoQ1AoVUFSVDFfUlRTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVUFSVDFfUlRTCisJTVVYX1ZBTChDUChVQVJUMV9DVFMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVQVJUMV9DVFMKKwlNVVhfVkFMKENQKFVBUlQxX1JYKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfUlgKKwkvKgorCSAqIENvbnRyb2wgYW5kIERlYnVnCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoU1lTXzMySyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU18zMksKKwlNVVhfVkFMKENQKFNZU19CT09UMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QxCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDIKKwlNVVhfVkFMKENQKFNZU19CT09UMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMworCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q0CisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDUKKwlNVVhfVkFMKENQKFNZU19CT09UNiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNgorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDEpLCAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIFNZU19DTEtPVVQxCisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMiksICAgIChJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChKVEFHX25UUlNUKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19uVFJTVAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RDSworCU1VWF9WQUwoQ1AoSlRBR19UTVMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RNUworCU1VWF9WQUwoQ1AoSlRBR19UREkpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RESQorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19FTVUwCisJTVVYX1ZBTChDUChKVEFHX0VNVTEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX0VNVTEKKwlNVVhfVkFMKENQKEVUS19DTEtfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19DVExfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMl9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EM19FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENl9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EN19FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EOF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EOV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTBfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTFfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTJfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTNfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBFVEtfRDFbNDVdIGFzIE1NMl9SWFJDViBhbmQgTU0yX1RYU0UwIFVTQiBGUy9MUyBIb3N0CisJLy8gKE1vZGUgNSkKKworCU1VWF9WQUwoQ1AoRVRLX0QxNF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIE1NMl9SWFJDVgorCU1VWF9WQUwoQ1AoRVRLX0QxNV9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIE1NMl9UWFNFMAorfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDlkMjcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3BsYXRmb3JtLlMKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorICogICAgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogICAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldHVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqICAgICAgSXQgaW5oZXJpdHMgZW50aXJlbHkgZnJvbSB0aGUgZXF1aXZhbGVudCBUSSBPTUFQMyBFVk0KKyAqCWZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworI2lmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLworICAgICAgICBhZHIgICAgIHIwLCBnb190b19zcGVlZCAgICAgICAgIC8qIGdldCBhZGRyIG9mIGNsb2NrIHNldHRpbmcgY29kZSAqLworICAgICAgICBtb3YgICAgIHIyLCAjMzg0ICAgICAgICAgICAgICAgIC8qIHIyIHNpemUgdG8gY29weSAoZGl2IGJ5IDMyIGJ5dGVzKSAqLworICAgICAgICBtb3YgICAgIHIxLCByMSAgICAgICAgICAgICAgICAgIC8qIHIxIDwtIGRlc3QgYWRkcmVzcyAocGFzc2VkIGluKSAqLworICAgICAgICBhZGQgICAgIHIyLCByMiwgcjAgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworbmV4dDI6CisgICAgICAgIGxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKyAgICAgICAgc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworICAgICAgICBjbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisgICAgICAgIGJuZSAgICAgbmV4dDIKKwltb3YJcGMsIGxyICAgICAgICAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTk9URTogMzQzMCBYLWxvYWRlciBjdXJyZW50bHkgZG9lcyBub3QgdXNlIHRoaXMgY29kZS4KKyogICBJdCBjb3VsZCBiZSByZW1vdmVkIGl0cyBpcyBrZXB0IGZvciBjb21wYXRhYmlseSB3aXRoIHUtYm9vdC4KKyAqCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBDTV9DTEtFTl9QTEwtYnlwYXNzIHZhbHVlCisgKiAgUjEgPSBDTV9DTEtTRUwxX1BMTC1tLCBuLCBhbmQgZGl2aWRlciB2YWx1ZXMKKyAqICBSMiA9IENNX0NMS1NFTF9DT1JFLWRpdmlkZXIgdmFsdWVzCisgKiAgUjMgPSBDTV9JRExFU1RfQ0tHRU4gLSBhZGRyIGRwbGwgbG9jayB3YWl0CisgKgorICogIE5vdGU6IElmIGNvcmUgdW5sb2Nrcy9yZWxvY2tzIGFuZCBTRFJBTSBpcyBydW5uaW5nIGZhc3QgYWxyZWFkeSBpdCBnZXRzCisgKiAgICAgICAgY29uZnVzZWQuICBBIHJlc2V0IG9mIHRoZSBjb250cm9sbGVyIGdldHMgaXQgYmFjay4gIFRha2luZyBhd2F5IGl0cworICogICAgICAgIEwzIHdoZW4gaXRzIG5vdCBpbiBzZWxmIHJlZnJlc2ggc2VlbXMgYmFkIGZvciBpdC4gIE5vcm1hbGx5LCB0aGlzIGNvZGUKKyAqICAgICAgICBydW5zIGZyb20gZmxhc2ggYmVmb3JlIFNEUiBpcyBpbml0IHNvIHRoYXQgc2hvdWxkIGJlIG9rLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3RtZmQgc3AhLCB7cjQtcjZ9CisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI0LCBwbGxfY3RsX2FkZAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdCit3YWl0MToKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYmVxICAgICB3YWl0MSAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDEKKyAgICAgICAgc3RyICAgICByMSwgW3I1XSAgICAgICAgICAvKiBzZXQgbSwgbiwgbTIgKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQyCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgLyogc2V0IGwzL2w0Ly4uIGRpdmlkZXJzKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQzICAvKiB3a3VwICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsMyAgLyogcnNtIHZhbCAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNCAgLyogZ2Z4ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNSAgLyogZW11ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNQorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmczX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnM192YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc0X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNF92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc1X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNV92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmcxX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgW3I1XQorICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBsb2NrIERQTEwzIGFuZCB3YWl0IGEgYml0ICovCisgICAgICAgIG9yciAgICAgcjAsIHIwLCAjMHg3ICAgLyogc2V0IHVwIGZvciBsb2NrIG1vZGUgKi8KKyAgICAgICAgc3RyICAgICByMCwgW3I0XSAgICAgICAvKiBsb2NrICovCisgICAgICAgIG5vcCAgICAgICAgICAgICAgICAgICAgLyogQVJNIHNsb3cgYXQgdGhpcyBwb2ludCB3b3JraW5nIGF0IHN5c19jbGsgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKK3dhaXQyOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBibmUgICAgIHdhaXQyICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIGxkbWZkIHNwISwge3I0LXI2fQorICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLworCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworLyogVGhlIE5vciBoYXMgdG8gYmUgaW4gdGhlIEZsYXNoIEJhc2UgQ1MwIGZvciB0aGlzIGNvbmRpdGlvbiB0byBoYXBwZW4gKi8KK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUcxXzApCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJRzNfMCkKK2ZsYXNoX2NmZzNfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUc0XzApCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc0CitmbGFzaF9jZmc1X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc1CitmbGFzaF9jZmc1X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHNV8wKQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorI2VuZGlmIC8qICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICovCisKKy5nbG9ibCBsb3dsZXZlbF9pbml0Citsb3dsZXZlbF9pbml0OgorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisgICAgICAgIGJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCisKKy8qIERQTEwoMS00KSBQQVJBTSBUQUJMRVMgKi8KKy8qIEVhY2ggb2YgdGhlIHRhYmxlcyBoYXMgTSwgTiwgRlJFUVNFTCwgTTIgdmFsdWVzIGRlZmluZWQgZm9yIG5vbWluYWwKKyAqIE9QUCAoMS4yVikuIFRoZSBmaWVsZHMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIGRwbGxfcGFyYW0gc3RydWN0KGNsb2NrLmMpLgorICogVGhlIHZhbHVlcyBhcmUgZGVmaW5lZCBmb3IgYWxsIHBvc3NpYmxlIHN5c2NsayBhbmQgZm9yIEVTMSBhbmQgRVMyLgorICovCisKK21wdV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDUKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxRjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3OQorLndvcmQgMHgxMgorLndvcmQgMHgwNAorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgxOQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUZBCisud29yZCAweDMyCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9tcHVfZHBsbF9wYXJhbQorZ2V0X21wdV9kcGxsX3BhcmFtOgorCWFkciByMCwgbXB1X2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2l2YV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNjgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA4MgorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgwQgorLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTNGCisud29yZCAweDMwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDE3Cisud29yZCAweDA2Cisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9pdmFfZHBsbF9wYXJhbQorZ2V0X2l2YV9kcGxsX3BhcmFtOgorCWFkciByMCwgaXZhX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2NvcmVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDBFCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDEwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTRDCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MjEKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisuZ2xvYmwgZ2V0X2NvcmVfZHBsbF9wYXJhbQorZ2V0X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGNvcmVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogUEVSIERQTEwgdmFsdWVzIGFyZSBzYW1lIGZvciBib3RoIEVTMSBhbmQgRVMyICovCitwZXJfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDEzTUh6ICovCisud29yZCAweDFCMAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwOQorCisvKiAxOS4yTUh6ICovCisud29yZCAweEUxCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDI2TUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDM4LjRNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MTMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLmdsb2JsIGdldF9wZXJfZHBsbF9wYXJhbQorZ2V0X3Blcl9kcGxsX3BhcmFtOgorCWFkciByMCwgcGVyX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qCisgKiBUYWJsZXMgZm9yIDM2eC8zN3ggZGV2aWNlcworICoKKyAqIChQb3B1bGF0ZWQgZm9yIDEzTUh6IG9ubHkpCisgKi8KK21wdV8zNnhfZHBsbF9wYXJhbToKKy8vICAgIE0gICAgTiAgIEZTIE0yCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzMwME1IWikKKy53b3JkIDE1MCwgIDUsIDAsIDEgCS8vIDEyICAgTUh6Cisud29yZCAzMDAsIDEyLCAwLCAxIAkvLyAxMyAgIE1IegorLndvcmQgMTI1LCAgNywgMCwgMSAJLy8gMTkuMiBNSHoKKy53b3JkIDE1MCwgMTIsIDAsIDEgCS8vIDI2ICAgTUh6Cisud29yZCAxMjUsIDE1LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfNjAwTUhaKQorLndvcmQgMzAwLCAgNSwgMCwgMSAJLy8gMTIgICBNSHoKKy53b3JkIDYwMCwgMTIsIDAsIDEgCS8vIDEzICAgTUh6Cisud29yZCAxMjUsICAzLCAwLCAxIAkvLyAxOS4yIE1IegorLndvcmQgMzAwLCAxMiwgMCwgMSAJLy8gMjYgICBNSHoKKy53b3JkIDEyNSwgIDcsIDAsIDEgCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxzZQorIyBlcnJvciAiTVBVIERQTEwgc2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkISIKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfNjAwTUhaKSAqLworCitpdmFfMzZ4X2RwbGxfcGFyYW06CisvLyAgICAgTSAgIE4gICBGUyBNMgorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxNi44IE1IegorCitjb3JlXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgTSAgICBOICAgRlMgTTIKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzIwME1IWikKKy53b3JkIDEwMCwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDIwMCwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDM3NSwgMzUsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDEwMCwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDM3NSwgNzEsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfMzMyTUhaKQorLndvcmQgMTY2LCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgMzMyLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgNDE1LCAyMywgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMTY2LCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgNDE1LCA0NywgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF80MDBNSFopCisud29yZCAyMDAsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCA0MDAsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAzNzUsIDE3LCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAyMDAsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAzNzUsIDM1LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxzZQorIyBlcnJvciAiQ29yZSBEUExMIHNldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEiCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF80MDBNSFopICovCisKKy8qCisgKiBGb3IgdGhlIHBlcmlwaGVyYWwgKFBFUikgKGFrYSBEUExMNCkgY2xvY2sgc2V0dGluZ3MsIHRoZXJlIGFyZSBvbmx5CisgKiBlZmZlY3RpdmVseSB0d28gY2xvY2sgY2hvaWNlcywgOTYgTUh6IG9yIDE5MiBNSHouIEhvd2V2ZXIsIHRoZSBvbmx5CisgKiB0aW1lIDE5MiBNSHogaXMgYXB0IHRvIGJlIHVzZWQgaW4gYW4gYXBwbGljYXRpb24gaXMgaWYgYm90aCBTR1ggYW5kCisgKiBUViBvdXRwdXQgYXJlIHVzZWQuCisgKgorICogICBGb3IgYW55IGdpdmVuIHN5c3RlbSBjbG9jaywgdGhlIGRpdmlkZXJzIGFyZSBjb25maWd1cmVkIHRodXMgKHBlcgorICogICBTZWN0aW9uIDMuNS4zLjMuMy4yICJUeXBlIEIgRFBMTCAoTG93LUppdHRlcikiIG9mIHRoZSBPTUFQMyBUUk0pOgorICoKKyAqICAgICBQRVJbY2xrb3V0XSA9IChTWVNbY2xrb3V0XSAqIE0pIC8gKE4gKyAxKQorICoKKyAqICAgICAgIE0yW2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTIgICAgICAgICAgIHVzZWQgYnkgVUFSVCwgTU1DLCBJMkMsIGV0Yy4KKyAqICAgICAgIE0zW2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTMgICAgICAgICAgIHVzZWQgYnkgVFYgb3V0LgorICogICAgICAgTTRbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNCAgICAgICAgICAgdXNlZCBieSBEU1MuCisgKiAgICAgICBNNVtjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE01ICAgICAgICAgICB1c2VkIGJ5IGNhbWVyYS4KKyAqICAgICAgIE02W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTYgICAgICAgICAgIHVzZWQgYnkgZW11bGF0aW9uLgorICoKKyAqICBTbywgZm9yIGEgMTkuMiBNSHogc3lzdGVtIGNsb2NrIGFuZCB0aGUgc2NhbGFyIGVudHJpZXMgYmVsb3c6CisgKgorICogICAgICAgUEVSW2Nsa291dF0gPSAoMTkuMiAqIDU0MCkgLyAoMTEgKyAxKSA9IDg2NAorICoKKyAqICAgICAgIE0yW2Nsa291dF06IDg2NCAvICA5ID0gIDk2ICAgTUh6CisgKiAgICAgICBNM1tjbGtvdXRdOiA4NjQgLyAxNiA9ICA1NCAgIE1IegorICogICAgICAgTTRbY2xrb3V0XTogODY0IC8gIDUgPSAxNzIuOCBNSHoKKyAqICAgICAgIE01W2Nsa291dF06IDg2NCAvICA0ID0gMjE2ICAgTUh6CisgKiAgICAgICBNNltjbGtvdXRdOiA4NjQgLyAgMyA9IDI4OCAgIE1IegorICovCitwZXJfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBTWVNfQ0xLICAgIE0gICAgICBOICAgICAgTTIgICAgICBNMyAgICAgIE00ICAgICBNNSAgICAgIE02ICAgICAgbTJESVYKKy53b3JkIDEyMDAwLCAgICA0MzIsICAgIDUsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxMiAgIE1IegorLndvcmQgMTMwMDAsICAgIDg2NCwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDEzICAgTUh6Cisud29yZCAxOTIwMCwgICAgNTQwLCAgIDExLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTkuMiBNSHoKKy53b3JkIDI2MDAwLCAgICA0MzIsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAyNiAgIE1IegorLndvcmQgMzg0MDAsICAgIDI3MCwgICAxMSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDM4LjQgTUh6Cisud29yZCAxNjgwMCwgICAgMzYwLCAgICA2LCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTYuOCBNSHoKKworLmdsb2JsIGdldF8zNnhfbXB1X2RwbGxfcGFyYW0KK2dldF8zNnhfbXB1X2RwbGxfcGFyYW06CisJYWRyCXIwLCBtcHVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtCitnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtOgorCWFkcglyMCwgaXZhXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0KK2dldF8zNnhfY29yZV9kcGxsX3BhcmFtOgorCWFkcglyMCwgY29yZV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfcGVyX2RwbGxfcGFyYW0KK2dldF8zNnhfcGVyX2RwbGxfcGFyYW06CisJYWRyCXIwLCBwZXJfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3BsYXRmb3JtLmggYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4YzEyZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcGxhdGZvcm0uaApAQCAtMCwwICsxLDk2IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGRhdGEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IKKyAqICAgICAgYWNjZXNzaW5nIERpZ2l0YWwgUGhhc2VkIExvY2sgTG9vcCAoRFBMTCkgcGFyYW1ldGVycyBhbmQKKyAqICAgICAgc2V0dGluZ3MuCisgKgorICovCisKKyNpZm5kZWYgX05FU1RfSjQ5X1BMQVRGT1JNX0hfCisjZGVmaW5lIF9ORVNUX0o0OV9QTEFURk9STV9IXworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoKKyAqIFR5cGUgRGVmaW5pdGlvbnMKKyAqLworCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCisKK3N0cnVjdCBkcGxsX3BhcmFtIHsKKwl1MzIgbTsKKwl1MzIgbjsKKwl1MzIgZnNlbDsKKwl1MzIgbTI7Cit9OworCitzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtIHsKKwl1MzIgc3lzX2NsazsKKwl1MzIgbTsKKwl1MzIgbjsKKwl1MzIgbTI7CisJdTMyIG0zOworCXUzMiBtNDsKKwl1MzIgbTU7CisJdTMyIG02OworCXUzMiBtMmRpdjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworLyoKKyAqIElubGluZSBGdW5jdGlvbnMKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIiAic3VicyAlMCwgJTEsICMxXG4iCisJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIobG9vcHMpKTsKK30KKworCisvKgorICogRnVuY3Rpb24gUHJvdG90eXBlcworICoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIHBsYXRmb3JtLlMuCisgKi8KKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX05FU1RfSjQ5X1BMQVRGT1JNX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3ByY20uYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcHJjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjVhZDcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3ByY20uYwpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0NVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IGNsb2NrIHNldC11cCBmb3IgdGhlIHByb2Nlc3NvcidzIFBvd2VyLCBSZXNldCBhbmQKKyAqICAgICAgQ2xvY2sgTWFuYWdlciAoUFJDTSkKKyAqCisgKiAgICAgIFRoaXMgaXMgb3JpZ2luYWxseSBpbmhlcml0ZWQgYW5kIHNwbGl0IGZyb20gdGhlIE9NQVAzIEVWTQorICogICAgICBib2FyZCBmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qCisgKiAgdTMyIGdldF9vc2NfY2xrX3NwZWVkKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgZGV0ZXJtaW5lcyB0aGUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQgYmFzZWQgb24KKyAqICAgIGEga25vd24gMzIga0h6IGNsb2NrIGFuZCBnZW5lcmFsIHB1cnBvc2UgdGltZXIuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHJlZmVyZW5jZSBvc2NpbGxhdG9yIGNsb2NrIHNwZWVkLgorICoKKyAqLworc3RhdGljIHUzMgorZ2V0X29zY19jbGtfc3BlZWQodm9pZCkKK3sKKwl1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIGNkaXYsIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSTV9DTEtTUkNfQ1RSTCk7CisKKwlpZiAodmFsICYgQklUNykKKwkJY2RpdiA9IDI7CisJZWxzZSBpZiAodmFsICYgQklUNikKKwkJY2RpdiA9IDE7CisJZWxzZQorCQkvKgorCQkgKiBTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSEKKwkJICogVEJEOiBBZGQgYSBXQVJOKCkvQlVHKCkKKwkJICogICAgICBGb3Igbm93LCBhc3N1bWUgZGl2aWRlciBhcyAxLgorCQkgKi8KKwkJY2RpdiA9IDE7CisKKwkvKiBlbmFibGUgdGltZXIyICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUxfV0tVUCk7CS8qIHNlbGVjdCBzeXNfY2xrIGZvciBHUFQxICovCisKKwkvKiBFbmFibGUgSSBhbmQgRiBDbG9ja3MgZm9yIEdQVDEgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU5fV0tVUCkgfCBCSVQwIHwgQklUMjsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9JQ0xLRU5fV0tVUCk7CisJdmFsID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9GQ0xLRU5fV0tVUCk7CisKKwlfX3Jhd193cml0ZWwoMCwgT01BUDM0WFhfR1BUMSArIFRMRFIpOwkvKiBzdGFydCBjb3VudGluZyBhdCAwICovCisJX19yYXdfd3JpdGVsKEdQVF9FTiwgT01BUDM0WFhfR1BUMSArIFRDTFIpOyAgICAgLyogZW5hYmxlIGNsb2NrICovCisJLyogZW5hYmxlIDMya0h6IHNvdXJjZSAqLy8qIGVuYWJsZWQgb3V0IG9mIHJlc2V0ICovCisJLyogZGV0ZXJtaW5lIHN5c19jbGsgdmlhIGdhdWdpbmcgKi8KKworCXN0YXJ0ID0gMjAgKyBfX3Jhd19yZWFkbChTMzJLX0NSKTsJLyogc3RhcnQgdGltZSBpbiAyMCBjeWNsZXMgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCBzdGFydCk7CS8qIGRlYWQgbG9vcCB0aWxsIHN0YXJ0IHRpbWUgKi8KKwljc3RhcnQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBzdGFydCBzeXNfY2xrIGNvdW50ICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgKHN0YXJ0ICsgMjApKTsJLyogd2FpdCBmb3IgNDAgY3ljbGVzICovCisJY2VuZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IGVuZCBzeXNfY2xrIGNvdW50ICovCisJY2RpZmYgPSBjZW5kIC0gY3N0YXJ0OwkJCQkvKiBnZXQgZWxhcHNlZCB0aWNrcyAqLworCisJaWYgKGNkaXYgPT0gMikKKwl7CisJCWNkaWZmICo9IDI7CisJfQorCisJLyogYmFzZWQgb24gbnVtYmVyIG9mIHRpY2tzIGFzc2lnbiBzcGVlZCAqLworCWlmIChjZGlmZiA+IDE5MDAwKQorCQlyZXR1cm4gKFMzOF80TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxNTIwMCkKKwkJcmV0dXJuIChTMjZNKTsKKwllbHNlIGlmIChjZGlmZiA+IDEzMDAwKQorCQlyZXR1cm4gKFMyNE0pOworCWVsc2UgaWYgKGNkaWZmID4gOTAwMCkKKwkJcmV0dXJuIChTMTlfMk0pOworCWVsc2UgaWYgKGNkaWZmID4gNzYwMCkKKwkJcmV0dXJuIChTMTNNKTsKKwllbHNlCisJCXJldHVybiAoUzEyTSk7Cit9CisKKy8qCisgKiAgdm9pZCBnZXRfc3lzX2Nsa2luX3NlbCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhbHVlIGZvciB0aGUgUFJDTSBQUk0gc3lzdGVtIGNsb2NrCisgKiAgICBmcmVxdWVuY3kgc2VsZWN0b3IsIHdoaWNoIHNob3VsZCBiZSB3cml0dGVuIHRvIFBSTV9DTEtTRUwuCisgKgorICogIElucHV0KHMpOgorICogICAgaGVydHogIC0gVGhlIHNwZWVkLCBpbiBNSHosIHRoYXQgdGhlIHN5c3RlbSBjbG9jayBpcyBiZWxpZXZlZAorICogICAgICAgICAgICAgICB0byBiZSBydW5uaW5nIGF0LgorICogICAgc3lzX2Nsa2luX3NlbCAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgaW5kZXggdXNlZCB0byBhY2Nlc3MgdGhlCisgKiAgICAgICAgICAgICAgIGRpZ2l0YWwgUExMIHNldHRpbmdzLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBzeXNfY2xraW5fc2VsIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBmb3IgdGhlIGRpZ2l0YWwgUExMIHNldHRpbmdzCisgKiAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGZvciB0aGUgc3BlY2lmaWVkIHN5c3RlbSBjbG9jayByYXRlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCitzdGF0aWMgdm9pZAorZ2V0X3N5c19jbGtpbl9zZWwodTMyIGhlcnR6LCB1MzIgKnN5c19jbGtpbl9zZWwpCit7CisJc3dpdGNoIChoZXJ0eikgeworCisJY2FzZSBTMzhfNE06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzM4XzRfTUhaOworCQlicmVhazsKKworCWNhc2UgUzI2TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMjZfMF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTlfMk06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaOworCQlicmVhazsKKworCWNhc2UgUzE2XzhNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xNl84X01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxM006CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEzXzBfTUhaOworCQlicmVhazsKKworCWNhc2UgUzEyTToKKwlkZWZhdWx0OgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xMl8wX01IWjsKKwkJYnJlYWs7CisKKwl9Cit9CisKKy8qCisgKiBPTUFQMzR4LzM1eCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2RwbGwzX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzRYKTsJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorZHBsbDRfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgPSBwdHIgKyBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJCS8qIHNldCBNNiAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNSwgUEVSX001WDIpOwkJLyogc2V0IE01ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA1LCBQRVJfTTRYMik7CQkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJCS8qIHNldCBNMyAqLworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoUEVSSVBIX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFsyMDoyM10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMjAsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKSA6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK21wdV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKE1QVV9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX01QVVs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBwdHItPmZzZWwpOworfQorCitzdGF0aWMgdm9pZAoraXZhX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoSVZBMl9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX0lWQTJbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDQsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiBPTUFQMzYzMCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2RwbGwzX2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzZYKTsJCS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2RwbGw0X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCXN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKnB0cjsKKworCXB0ciA9IChzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICopZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogTTYgKERJVl9EUExMNCk6IENNX0NMS1NFTDFfRU1VWzI0OjI5XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA2LCBwdHItPm02KTsKKworCS8qIE01IChDTEtTRUxfQ0FNKTogQ01fQ0xLU0VMMV9FTVVbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNiwgcHRyLT5tNSk7CisKKwkvKiBNNCAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDYsIHB0ci0+bTQpOworCisJLyogTTMgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1s4OjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNiwgcHRyLT5tMyk7CisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE5XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDEyLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBNMkRJViAoQ0xLU0VMXzk2TSk6IENNX0NMS1NFTF9DT1JFWzEyOjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDEyLCAyLCBwdHItPm0yZGl2KTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHVfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX01QVV9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAoraXZhX2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisvKgorICogIHZvaWQgcHJjbV9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgY2xvY2tzIGluIGEgYm9hcmQtc3BlY2lmaWMgbWFubmVyIGZvcgorICogICAgdGhlIHByb2Nlc3NvcidzIFBvd2VyLCBSZXNldCBhbmQgQ2xvY2sgTWFuYWdlciAoUFJDTSkgYW5kIGlzCisgKiAgICBjYWxsZWQgb25seSB3aGVuIGFuIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vCisgKiAgICBTRFJBTSkuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgc3lzX2Nsa19yYXRlID0gMCwgc3lzX2Nsa2luX3NlbCwgc3lzX2Nsa19kaXY7CisJdTMyIGNsa19pbmRleCwgc2lsX2luZGV4OworCisJLyogR2F1Z2UgdGhlIGlucHV0IGNsb2NrIHNwZWVkIGFuZCBmaW5kIG91dCB0aGUgc3lzX2Nsa2luX3NlbAorCSAqIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGNsb2NrLgorCSAqLworCXN5c19jbGtfcmF0ZSA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwoc3lzX2Nsa19yYXRlLCAmc3lzX2Nsa2luX3NlbCk7CisKKwkvKiBTZXQgdGhlIFBSTV9DTEtTRUxfU1lTX0NMS0lOX1NFTCB2YWx1ZSBpbiB0aGUgcHJvY2Vzc29yLiAqLworCisJc3IzMihQUkNNX1BSTV9DQ1JfQ0xLU0VMLAorCQkgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX1NUQVJULAorCQkgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX0JJVFMsCisJCSBzeXNfY2xraW5fc2VsKTsKKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZSBieSB0d28uCisJICoKKwkgKiBPbiBPTUFQMzYzMCwgRERSIGRhdGEgY29ycnVwdGlvbiBoYXMgYmVlbiBvYnNlcnZlZCBvbiBPRkYgbW9kZQorCSAqIGV4aXQgaWYgdGhlIHN5cyBjbG9jayB3YXMgbG93ZXIgdGhhbiAyNk0uIEFzIGEgd29yayBhcm91bmQsCisJICogT01BUDM2MzAgaXMgb3BlcmF0ZWQgYXQgMjZNIHN5cyBjbG9jayBhbmQgdGhpcyBpbnRlcm5hbCBkaXZpc2lvbgorCSAqIGlzIG5vdCBwZXJmb3JtZWQuCisJICovCisKKwlpZigoaXNfY3B1X2ZhbWlseSgpICE9IENQVV9PTUFQMzZYWCkgJiYKKwkgICAoc3lzX2Nsa2luX3NlbCA+IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xOV8yX01IWikpIHsKKwkJc3lzX2Nsa19kaXYgPSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMjsKKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbCAvIDI7CisKKwl9IGVsc2UgeworCQlzeXNfY2xrX2RpdiA9IFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8xOworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsIC8gMTsKKworCX0KKworCXNyMzIoUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwsCisJCSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfU1RBUlQsCisJCSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQklUUywKKwkJIHN5c19jbGtfZGl2KTsKKworCWlmIChpc19jcHVfZmFtaWx5KCkgPT0gQ1BVX09NQVAzNlhYKSB7CisJCWRwbGwzX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisKKwl9IGVsc2UgeworCQlzaWxfaW5kZXggPSBnZXRfY3B1X3JldigpIC0gMTsKKworCQkvKiBUaGUgRFBMTCB0YWJsZXMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHN5c2NsayB2YWx1ZSBhbmQKKwkJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJCSAqIHRoZSB2YWx1ZXMgZm9yIHRoYXQgaW5wdXQgc3lzY2xrIGZyb20gdGhlIERQTEwgcGFyYW0gdGFibGUKKwkJICogYW5kIHNpbF9pbmRleCB3aWxsIGdldCB0aGUgdmFsdWVzIGZvciB0aGF0IFN5c0NsayBmb3IgdGhlCisJCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LgorCQkgKi8KKworCQkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT1dfUE9XRVJfQllQQVNTKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCQlkcGxsM19pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisKKwkJLyogTG9jayBNUFUgRFBMTCB0byBzZXQgZnJlcXVlbmN5ICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCX0KKworCS8qIFNldCB1cCBHUFRpbWVycyB0byBzeXNfY2xrIHNvdXJjZSBvbmx5ICovCisgCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgOCwgMHhmZik7CisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMCwgMSwgMSk7CisKKwlkZWxheSg1MDAwKTsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDYwM2EyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci94LWxvYWQubGRzCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKiAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIFgtTG9hZGVyIGxpbmtlciBzY2F0dGVyIGZpbGUgZm9yIHRoZSBOZXN0CisgKiAgICAgIExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICovCisKKy8qCisgKiBOb3ZlbWJlciAyMDA2IC0gQ2hhbmdlZCB0byBzdXBwb3J0IDM0MzBzZHAgZGV2aWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZTRhOTAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9NYWtlZmlsZQpAQCAtMCwwICsxLDYyIEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorIyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyAgICBEZXNjcmlwdGlvbjoKKyMgICAgICBUaGlzIGZpbGUgaXMgdGhlIG1ha2UgZmlsZSBmb3IgcG9ydGlvbnMgb2YgWC1Mb2FkZXIgc3BlY2lmaWMKKyMgICAgICB0byB0aGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorIworCisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk6PSBqNDkubyBtdXgubyBwcmNtLm8KK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworQ1BQRkxBR1MgKz0gLUkkKFRPUERJUikvYm9hcmQvJChCT0FSRERJUikKKworU1JDUyAgICA6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUyAgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTT0JKUyAgIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOiAkKG9iaikuZGVwZW5kICQoU09CSlMpICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoU09CSlMpICQoT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46ICBjbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODEzODBjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjEgQEAKKworCisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIE9NQVAzRVZNIGJvYXJkIHVzZXMgT01BUDM0MzAgKEFSTS1Db3J0ZXhBOCkgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMjCisjCisjIE9NQVAzRVZNIGhhcyAxIGJhbmsgb2YgMTI4TUIgbVBPUC1TRFJBTSBvbiBDUzAKKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIChiYW5rMCkKKworIyBGb3IgdXNlIGlmIHlvdSB3YW50IFgtTG9hZGVyIHRvIHJlbG9jYXRlIGZyb20gU1JBTSB0byBERFIKKyNURVhUX0JBU0UgPSAweDgwZTgwMDAwCisKKyMgRm9yIFhJUCBpbiA2NEsgb2YgU1JBTSBvciBkZWJ1ZyAoR1AgZGV2aWNlIGhhcyBpdCBhbGwgYXZhaWxhYmUpCisjIFNSQU0gNDAyMDAwMDAtNDAyMEZGRkYgYmFzZQorIyBpbml0aWFsIHN0YWNrIGF0IDB4NDAyMGZmZmMgdXNlZCBpbiBzX2luaXQgKGJlbG93IHhsb2FkZXIpLgorIyBUaGUgcnVuIHRpbWUgc3RhY2sgaXMgKGFib3ZlIHhsb2FkZXIsIDJrIGJlbG93KQorIyBJZiBhbnkgZ2xvYmFscyBleGlzdCB0aGVyZSBuZWVkcyB0byBiZSByb29tIGZvciB0aGVtIGFsc28KK1RFWFRfQkFTRSA9IDB4NDAyMDA4MDAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L2o0OS5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvajQ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzNGM1MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L2o0OS5jCkBAIC0wLDAgKzEsMTA0NiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNgorICogICAgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogICAgSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNBQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgb24gR1BJTywgUkFNIGFuZCBmbGFzaCBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgaXMgaW5oZXJpdGVkIGZyb20gdGhlIE9NQVAzIEVWTSBlcXVpdmFsZW50IGZpbGUuCisgKgorICogICAgICBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBvcmRlciBpcyByb3VnaGx5OgorICoKKyAqICAgICAgICAxKSBzX2luaXQKKyAqICAgICAgICAyKSBib2FyZF9pbml0CisgKiAgICAgICAgMykgbWlzY19pbml0X3IKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2RlZmluZSBNQVhfSjQ5X0JPT1RfREVWSUNFUyAoMykKKwordm9pZAordWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpIHsKKwlkZWxheSh1c2Vjcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitnZXRfY3B1X2lkKHZvaWQpCit7CisJdTMyIGNwdWlkID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChjcHVpZCkpOworCisJcmV0dXJuIChjcHVpZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2dldF9jcHVfcmV2KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJaWYgKChjcHVpZCAgJiAweGYpID09IDB4MCkgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMSk7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMik7CisKKwl9CisKK30KKwordTMyCitpc19jcHVfZmFtaWx5KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCXUzMiBjcHVfZmFtaWx5ID0gMCwgb21hcDM0eHhfaWQgPSAwOworCXUxNiBoYXdrZXllOworCisJaWYgKChjcHVpZCAmIDB4ZikgPT0gMHgwKSB7CisJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisKKwl9IGVsc2UgeworCQlvbWFwMzR4eF9pZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0NPTlRST0xfSUQpOworCQloYXdrZXllICA9IChvbWFwMzR4eF9pZCA+PiBIQVdLRVlFX1NISUZUKSAmIDB4ZmZmZjsKKworCQlzd2l0Y2ggKGhhd2tleWUpIHsKKworCQljYXNlIEhBV0tFWUVfQU0zNVhYOgorCQkJY3B1X2ZhbWlseSA9IENQVV9BTTM1WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM2WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNlhYOworCQkJYnJlYWs7CisKKwkJY2FzZSBIQVdLRVlFX09NQVAzNFhYOgorCQlkZWZhdWx0OgorCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKwkJCWJyZWFrOworCisJCX0KKwl9CisKKwlyZXR1cm4gKGNwdV9mYW1pbHkpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B1X2lzXzM0MTAodm9pZCkgLSByZXR1cm5zIHRydWUgZm9yIDM0MTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2NwdV9pc18zNDEwKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpZihnZXRfY3B1X3JldigpIDwgQ1BVXzM0MzBfRVMyKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHJlYWQgc2NhbGFiaWxpdHkgc3RhdHVzIGFuZCByZXR1cm4gMSBmb3IgMzQxMCovCisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMpOworCQkvKiBDaGVjayB3aGV0aGVyIE1QVSBmcmVxdWVuY3kgaXMgc2V0IHRvIDI2NiBNSHogd2hpY2gKKwkJICogaXMgbm9taW5hbCBmb3IgMzQxMC4gSWYgeWVzIHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkJICovCisJCWlmICgoKHN0YXR1cyA+PiA4KSAmIDB4MykgPT0gMHgyKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqICB2b2lkIHNyMzIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBjbGVhcnMgYW5kIHNldHMgYSB2YWx1ZSBpbiBhIGJpdCBleHRlbnQgZm9yIGEKKyAqICAgIDMyLWJpdCB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgKgorICogIElucHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3MgYXQgd2hpY2ggdG8gY2xlYXIgYW5kIHNldCB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgICAgICAgICBzcGVjaWZpZWQgMzItYml0IHZhbHVlLgorICogICAgc3RhcnRfYml0IC0gVGhlIGZpcnN0IGJpdCBvZiB0aGUgMzItYml0IGRhdGEgdG8gY2xlYXIgYW5kIHNldC4KKyAqICAgIG51bV9iaXRzICAtIFRoZSByYW5nZSBvZiBiaXRzIG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgdmFsdWUgICAgIC0gVGhlIHZhbHVlIHRvIHNldC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdCBleHRlbnQgY2xlYXJlZCBhbmQKKyAqICAgICAgICAgICAgICAgIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgdG1wLCBtc2sgPSAwOworCisJbXNrID0gKDEgPDwgbnVtX2JpdHMpOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoKKyAqICB1MzIgd2FpdF9vbl92YWx1ZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJlYWRzIHRoZSByZWdpc3RlciBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYW5kCisgKiAgICBidXN5IHdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgbWF0Y2ggdmFsdWUgaXMgcmVhZCBvciB1bnRpbCB0aGUKKyAqICAgIGJvdW5kZWQgbnVtYmVyIG9mIGxvb3BzIGhhdmUgYmVlbiByZWFjaGVkLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIHJlYWRfYml0X21hc2sgLSBUaGUgYml0IG1hc2sgdG8gYXBwbHkgYWZ0ZXIgcmVhZGluZyB0aGUgcmVnaXN0ZXIuCisgKiAgICBtYXRjaF92YWx1ZSAgIC0gVGhlIHZhbHVlIHRvIG1hdGNoIG9uIGFmdGVyIHJlYWRpbmcgYW5kIG1hc2tpbmcuCisgKiAgICByZWFkX2FkZHIgICAgIC0gVGhlIHJlZ2lzdGVyIGFkZHJlc3MgdG8gcmVhZC4KKyAqICAgIGJvdW5kICAgICAgICAgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdG8gcmVhZCBiZWZvcmUgZ2l2aW5nCisgKiAgICAgICAgICAgICAgICAgICAgdXAuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVHJ1ZSAoMSkgaWYgdGhlIG1hdGNoX3ZhbHVlIHdhcyByZWFjaGVkOyBvdGhlcndpc2UsIGZhbHNlICgwKS4KKyAqCisgKi8KK3UzMgord2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNlY3VyZV91bmxvY2sKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCBzZWN1cml0eSByZWdpc3RlcnMgZm9yIGFjY2VzcworICogKEdQIERldmljZSBvbmx5KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3NlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAordHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwljb25zdCBpbnQgdHlwZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCisJLyoKKwkgKiBJZiB0aGUgcHJvY2Vzc29yIGlzIGEgR1AgZGV2aWNlLCB1bmxvY2sgdGhlIGRldmljZSBTUkFNIGZvcgorCSAqIGdlbmVyYWwgdXNlLgorCSAqLworCisJaWYgKHR5cGUgPT0gQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9HUCkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCisJcmV0dXJuOworfQorCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgU0RSQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woU0RSQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKFNEUkNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChTRFJDX0NTX0NGRyk7CisJRFVNUF9SRUdMKFNEUkNfU0hBUklORyk7CisJRFVNUF9SRUdMKFNEUkNfRVJSX0FERFIpOworCURVTVBfUkVHTChTRFJDX0VSUl9UWVBFKTsKKwlEVU1QX1JFR0woU0RSQ19ETExBX0NUUkwpOworCURVTVBfUkVHTChTRFJDX0RMTEFfU1RBVFVTKTsKKwlEVU1QX1JFR0woU0RSQ19QT1dFUl9SRUcpOworCURVTVBfUkVHTChTRFJDX01DRkdfMCk7CisJRFVNUF9SRUdMKFNEUkNfTVJfMCk7CisJRFVNUF9SRUdMKFNEUkNfRU1SMl8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlEVU1QX1JFR0woU0RSQ19SRlJfQ1RSTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQU5VQUxfMCk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18xKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8xKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzEpOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzEpOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8xKTsKK30KKyNlbHNlCisjIGRlZmluZSBvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIEdQTUMgUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKEdQTUNfUkVWSVNJT04pOworCURVTVBfUkVHTChHUE1DX1NZU0NPTkZJRyk7CisJRFVNUF9SRUdMKEdQTUNfU1lTU1RBVFVTKTsKKwlEVU1QX1JFR0woR1BNQ19JUlFTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUUVOQUJMRSk7CisJRFVNUF9SRUdMKEdQTUNfVElNRU9VVF9DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfQUREUkVTUyk7CisJRFVNUF9SRUdMKEdQTUNfRVJSX1RZUEUgKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcgKTsKKwlEVU1QX1JFR0woR1BNQ19TVEFUVVMgKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMCk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzEpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18yKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMyk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM180KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzQpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN181KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNik7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM183KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzcpOworCisjaWYgMAorCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF82KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU181KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzcpOworCisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV83KTsKKworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzEpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzIpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX1NUQVRVUyk7CisKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDX1NJWkVfQ09ORklHKTsKKworCURVTVBfUkVHTChHUE1DX0VDQzFfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MyX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDM19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzRfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M1X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNl9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzdfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M4X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDOV9SRVNVTFQpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfU1dEQVRBKTsKKyNlbmRpZgorfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX0RFQlVHKSAqLworCisjaWYgZGVmaW5lZChDRkdfUFJDTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBQUkNNIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChQUkNNX1BSTV9DQ1JfQ0xLU0VMKTsKKwlEVU1QX1JFR0woUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMM19QTEwpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DQU0pOworCURVTVBfUkVHTChDTV9DTEtTRUxfQ09SRSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9EU1MpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX0VNVSk7Cit9CisjZWxzZQorI2RlZmluZSBvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ0ZHX1BSQ01fREVCVUcgKi8KKworLyoKKyAqICB2b2lkIGNvbmZpZ19kaWFtb25kX3NkcmFtKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIHByb2Nlc3NvcidzIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisgKiAgICBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDMyIE1iIHggMTYgYiAoNjQKKyAqICAgIE1pQikgRERSIFNEUkFNIG9uIHRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitjb25maWdfZGlhbW9uZF9zZHJhbSh2b2lkKQoreworCXUzMiB2YWx1ZSwgYWN0aW1fY3RybGEsIGFjdGltX2N0cmxiOworCisJLyoKKwkgKiBTdGVwIDE6IFJlc2V0IHRoZSBTRFJDIGNvbnRyb2xsZXIgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIHJlc2V0CisJICogZXZlbnQgdG8gY2xlYXIuCisJICovCisKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX1NFVCwgU0RSQ19TWVNDT05GSUcpOworICAgIHdhaXRfb25fdmFsdWUoU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TVEFUVVMsCisJCQkJICAxMjAwMDAwMCk7CisgICAgX19yYXdfd3JpdGVsKFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9DTEVBUiwgU0RSQ19TWVNDT05GSUcpOworCisJLyoKKwkgKiBTdGVwIDI6IFNldHVwIHRoZSBwb3NpdGlvbiBhbmQgZ2VvbWV0cnkgb2YgdGhlIFNEUkFNIGRldmljZSBvbgorCSAqIHRoZSBjb250cm9sbGVyJ3MgYnVzLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19TSEFSSU5HX0xPQ0tfT0ZGIAkJCQkJCQkJCQkJCXwKKwkJIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzFNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzBNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19TRFJDVFJJU1RBVEVfT0ZGKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfU0hBUklORyk7CisKKwkvKgorCSAqIFN0ZXAgMzogU2V0dXAgdGhlIG1lbW9yeSBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgUkFTIHdpZHRoLAorCSAqIENBUyB3aWR0aCwgYWRkcmVzcyBtdWx0aXBsZXhpbmcsIHNpemUsIGJhbmsgbWFwcGluZywgYnVzIHdpZHRoLAorCSAqIHBvd2VyIG1vZGUsIEREUiB0eXBlIGFuZCBtZW1vcnkgdHlwZS4KKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfTUNGR19MT0NLU1RBVFVTX1JXCQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19SQVNXSURUSF9FTkNPREUoU0RSQ19NQ0ZHX1JBU1dJRFRIXzE0X0JJVFMpCQkJfAorCQkgU0RSQ19NQ0ZHX0NBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfQ0FTV0lEVEhfMTBfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQUREUk1VWExFR0FDWV9GTEVYSUJMRQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVNJWkVfRU5DT0RFKENGR19TRFJBTV9TSVpFX01CKQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX0VOQ09ERShTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fUl9CX0MpfAorCQkgU0RSQ19NQ0ZHX0IzMk5PVDE2X09GRgkJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0RFRVBQRF9TVVBQT1JURUQJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0REUlRZUEVfRU5DT0RFKFNEUkNfTUNGR19ERFJUWVBFX01PQklMRV9ERFIpCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVRZUEVfRU5DT0RFKFNEUkNfTUNGR19SQU1UWVBFX0REUikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NQ0ZHXzApOworCisJLyoKKwkgKiBTdGVwIDQ6IEVzdGFibGlzaCB0aGUgQUMgZmluZSB0dW5pbmcgdGltaW5nIGNoYXJhY3RlcmlzdGljcy4KKwkgKi8KKworCWFjdGltX2N0cmxhCisJCT0gKFNEUkNfQUNUSU1fQ1RSTEFfVFJGQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJGQykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJBU19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJBUykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUkRfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSUkQpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9URFBMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9URFBMKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVERBTF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTCkpOworCisJYWN0aW1fY3RybGIKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQl9UV1RSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UV1RSKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVENLRV9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVENLRSkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RYUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhTUl9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhTUikpOworCisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxhLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChhY3RpbV9jdHJsYiwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCS8qCisJICogU3RlcCA1OiBFc3RhYmxpc2ggdGhlIG1lbW9yeSBhdXRvcmVmcmVzaCBjb250cm9sCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1JGUl9DVFJMX0FSQ1ZfRU5DT0RFKDEyNDQpCQkJCQkJfAorCQkgU0RSQ19SRlJfQ1RSTF9BUkVfRU5DT0RFKFNEUkNfUkZSX0NUUkxfQVJFXzFfQVJDVikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19SRlJfQ1RSTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfUE9XRVJfUkVHX1dBS0VVUF9ERUxBWUVECQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX0FVVE9DT1VOVF9FTkNPREUoMCkJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX1JTVF9FTkFCTEUJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX0lETEVfRElTQUJMRQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9FTkNPREUoU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9OT05FKQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1BBR0VQT0xJQ1lfSFBIQik7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1BPV0VSX1JFRyk7CisKKwkvKgorCSAqIFN0ZXAgNjogRXN0YWJsaXNoIHRoZSBKRURFQy1kZWZpbmVkIG1vZGUgYW5kIERMTCBwYXJhbWV0ZXJzLgorCSAqLworCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCWRlbGF5KDUwMDApOwkgICAgICAgICAgICAgICAgIAorCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfUFJFQ0hBUkdFX0FMTCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfTVJfWkVST18xCQkJCQkJCXwKKwkJIFNEUkNfTVJfV0JTVF9FTkFCTEUJCQkJCXwKKwkJIFNEUkNfTVJfWkVST18wCQkJCQkJCXwKKwkJIFNEUkNfTVJfQ0FTTF9FTkNPREUoU0RSQ19NUl9DQVNMXzMpCXwKKwkJIFNEUkNfTVJfU0lMX1NFUklBTAkJCQkJCXwKKwkJIFNEUkNfTVJfQkxfRU5DT0RFKFNEUkNfTVJfQkxfNCkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NUl8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfRExMQV9DVFJMX0ZJWEVEX0RFTEFZX0VOQ09ERSgwKQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0lOSVRfTEFUX0VOQ09ERSgwKQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfRU5DT0RFKFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9QV0QpIHwgCisJCSBTRFJDX0RMTEFfQ1RSTF9ETExfRU5BQkxFCQkJCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfTE9DS19UUkFDS0lOR0RFTEFZKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfRExMQV9DVFJMKTsKKworCS8qCisJICogRGVsYXkgZm9yIGEgInJlYXNvbmFibHkgbG9uZyIgcGVyaW9kIG9mIHRpbWUgdG8gYWxsb3cgdGhlCisJICogcmVxdWVzdGVkIGNoYW5nZXMgdG8gdGFrZSBlZmZlY3QuCisJICovCisKKyAJZGVsYXkoMHgyMDAwMCk7Cit9CisKKy8qCisgKiAgdm9pZCBzX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyB2ZXJ5IGVhcmx5IHN5c3RlbSBpbml0aWFsaXphdGlvbiBvZiBjaGlwCisgKiAgICBwaW4gbXVsdGlwbGV4aW5nIGFuZCBjbG9ja3MgYW5kIGlzIGNhbGxlZCB3aGVuIE9OTFkgYW4KKyAqICAgIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKworCWRlbGF5KDEwMCk7CisKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ19kaWFtb25kX3NkcmFtKCk7Cit9CisKKy8qCisgKiAgaW50IGJvYXJkX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgZWFybHksIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisgKiAgICBmb2xsb3dpbmcgY29yZSBDUFUgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50Citib2FyZF9pbml0KHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X2RldmljZV90eXBlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZCwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICogICAgZGV2aWNlIGlzIG9mIFRTVCwgRU1VLCBIUyBvciBHUCB0eXBlLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQuCisgKgorICovCit1MzIKK2dldF9kZXZpY2VfdHlwZSh2b2lkKQoreworCWNvbnN0IGludCB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9ERUNPREUodmFsdWUpKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLCBpbmRpY2F0aW5nIHRoZQorICogICAgb3JkZXIgb2YgbWVtb3J5IGludGVyZmFjZXMgZnJvbSB3aGljaCB0aGUgcHJvY2Vzc29yIHdpbGwgYXR0ZW1wdAorICogICAgdG8gYm9vdCBpdHNlbGYuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKyNpZiAwCisJY29uc3QgdTMyIHZhbHVlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpOworCWNvbnN0IHUzMiBwZXJpcGhlcmFsX3R5cGUgPSBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfUEVSSVBIRVJBTDsKKworCS8qCisJICogVGhpcyByb3V0aW5lIGFuZCBjYWxsZXJzIG9mIGl0IGFyZSBpbXBsaWNpdGx5IGV4cGVjdGluZyB0aGUKKwkgKiBNRU1PUlkgaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDApIG5vdCB0aGUgUEVSSElQSEVSQUwKKwkgKiBpbnRlcmZhY2UgKFNZU0JPT1RbNV0gPT0gMSkgYm9vdCBvcmRlciwgc28gY2hlY2sgdGhhdCBpcworCSAqIGFjdHVhbGx5IHRoZSBjYXNlLgorCSAqLworCisJaWYgKENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9ERUNPREUodmFsdWUpID09IHBlcmlwaGVyYWxfdHlwZSkgeworCQloYW5nKCk7CisJfQorCisJcmV0dXJuIChDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX0RFQ09ERSh2YWx1ZSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIDB4M2Y7CisjZW5kaWYKK30KKworLyoKKyAqICBpbnQgZ2V0X2Jvb3RfZGV2aWNlX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlX2xpc3QpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgYSBjb25zdGFudCBsaXN0IGluZGljYXRpbmcgdGhlIHByZWZlcnJlZAorICogICAgZGV2aWNlIGJvb3QgbGlzdC4KKyAqICAgIEl0IGdldHMgY2FsbGVkIGZyb20gc3RhcnRfYXJtYm9vdCBpbiBib2FyZC5jCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHByZWZlcnJlZCBmaXJzdCBwcm9jZXNzb3IgbWVtb3J5IGJvb3QgaW50ZXJmYWNlLgorICoKKyAqLworCitpbnQKK2dldF9ib290X2RldmljZXNfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VzX2xpc3QpCit7CisJc3RhdGljIHUzMiBsaXN0W01BWF9KNDlfQk9PVF9ERVZJQ0VTXTsKKwljb25zdCB1MzIgbWVtX29yZGVyID0gZ2V0X3N5c2Jvb3RfdmFsdWUoKTsKKworCS8vIHNldCBkZWZhdWx0cworCWludCBudW1iZXJfb2ZfZGV2aWNlcyA9IDA7CisJKmRldmljZXNfbGlzdCA9ICZsaXN0WzBdOworCisJc3dpdGNoIChtZW1fb3JkZXIpIHsKKwljYXNlIDE1OgorCQlsaXN0WzBdID0gR1BNQ19OQU5EOworCQlsaXN0WzFdID0gVVNCX1BFUklQSEVSQUw7CisJCWxpc3RbMl0gPSBNTUNfTkFORDsKKwkJbnVtYmVyX29mX2RldmljZXMgPSBNQVhfSjQ5X0JPT1RfREVWSUNFUzsKKwkJYnJlYWs7CisJY2FzZSA0NzoKKwkJbGlzdFswXSA9IE1NQ19OQU5EOworCQlsaXN0WzFdID0gR1BNQ19OQU5EOworCQlsaXN0WzJdID0gVVNCX1BFUklQSEVSQUw7CisJCW51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0o0OV9CT09UX0RFVklDRVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbnVtYmVyX29mX2RldmljZXM7Cit9CisKKy8qCisgKiAgaW50IG1pc2NfaW5pdF9yKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IG1pc2NlbGxhbmVvdXMsIGJvYXJkLXNwZWNpZmljCisgKiAgICBpbml0aWFsaXphdGlvbiBmb2xsb3dpbmcgQ1BVLCBlYXJseSBib2FyZCwgc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gbG9hZGluZyB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyCisgKiAgICB0byBSQU0uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50CittaXNjX2luaXRfcih2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAord2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCS8qIFRoZXJlIGFyZSAzIHdhdGNoIGRvZ3MgV0QxPVNlY3VyZSwgV0QyPU1QVSwgV0QzPUlWQS4gV0QxIGlzCisJICogZWl0aGVyIHRha2VuIGNhcmUgb2YgYnkgUk9NIChIUy9FTVUpIG9yIG5vdCBhY2Nlc3NpYmxlIChHUCkuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgV0QyLU1QVSBvciB0YWtlIGEgUFJDTSByZXNldC4gIFdEMworCSAqIHNob3VsZCBub3QgYmUgcnVubmluZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBQUkNNIHJlc2V0LgorCSAqLworCXNyMzIoQ01fRkNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXNyMzIoQ01fSUNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXdhaXRfb25fdmFsdWUoQklUNSwgMHgyMCwgQ01fSURMRVNUX1dLVVAsIDUpOyAvKiBzb21lIGlzc3VlIGhlcmUgKi8KKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxLCBXRDJfQkFTRSArIFdTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syLCBXRDJfQkFTRSArIFdTUFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgdm9pZCBmb29iYXIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZS4uLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTUMKKwkvKiBFbmFibGUgTU1DMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dwbWNfY29uZmlnXzAodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkKKwkvKgorCSAqIEZpcnN0LCBkaXNhYmxlIHRoZSBpbnRlcmZhY2UgYW5kIHdhaXQuCisJICovCisJX19yYXdfd3JpdGVsKEdQTUNfQ09ORklHN19DU1ZBTElEX0RJU0FCTEVELCBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgxMDAwKTsKKworCS8qCisJICogTmV4dCwgcHJvZ3JhbSB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCSAqLworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcxXzAsIEdQTUNfQ09ORklHMV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMl8wLCBHUE1DX0NPTkZJRzJfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzNfMCwgR1BNQ19DT05GSUczXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc0XzAsIEdQTUNfQ09ORklHNF8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNV8wLCBHUE1DX0NPTkZJRzVfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzZfMCwgR1BNQ19DT05GSUc2XzApOworCisJLyoKKwkgKiBGaW5hbGx5LCBlbmFibGUgdGhlIEdQTUMgbWFwcGluZyBhbmQgc3BpbiBmb3IgdGhlIHBhcmFtZXRlcnMgdG8KKwkgKiBiZWNvbWUgYWN0aXZlLgorCSAqLworCV9fcmF3X3dyaXRlbCgoQ0ZHX0dQTUNfQ09ORklHN18wIHwgR1BNQ19DT05GSUc3X0NTVkFMSURfRU5BQkxFRCksCisJCQkJIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDIwMDApOworCisJaWYgKG5hbmRfY2hpcCgpKXsKKwkJcmV0dXJuICgxKTsKKwl9CisjZW5kaWYgLyogZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApICovCisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIGludCBuYW5kX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyCisgKiAgICAoR1BNQykgc3VjaCB0aGF0IG9uLWJvYXJkIE5BTkQgZGV2aWNlcyBtYXkgYmUgYWNjZXNzZWQgZm9yCisgKiAgICBzZWNvbmQtc3RhZ2UgYm9vdC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE5BTkQgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZDsgb3RoZXJ3aXNlLCAxLgorICoKKyAqLworaW50CituYW5kX2luaXQodm9pZCkKK3sKKwlpbnQgc3RhdHVzID0gMTsKKworCS8qCisJICogRXN0YWJsaXNoIEdQTUMgZ2xvYmFsIHNldHRpbmdzLgorCSAqLworCisJX19yYXdfd3JpdGVsKEdQTUNfU1lTQ09ORklHX0lETEVNT0RFX1NNQVJULCBHUE1DX1NZU0NPTkZJRyk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19JUlFFTkFCTEVfQUxMX0RJU0FCTEUsIEdQTUNfSVJRRU5BQkxFKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX1RJTUVPVVRFTkFCTEVfT0ZGLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7CisKKwlpZiAoZ3BtY19jb25maWdfMCgpKSB7CisJCXB1dHMoIlVuc3VwcG9ydGVkIE5BTkQgZGV2aWNlIEAgR1BNQzAhXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCXN0YXR1cyA9IDA7CisKKyBkb25lOgorCS8qIER1bXAgR1BNQyBhbmQgU0RSQyByZWdpc3RlcnMgaWYgc28gY29uZmlndXJlZC4gKi8KKworCW9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpOworCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKgorICogIHZvaWQgYm9hcmRfaGFuZygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBib2FyZC1zcGVjaWZpYyBhY3Rpb25zIHdoZW4gdGhlIHN5c3RlbQorICogICAgaGFuZ3MgYnkgZXhlY3V0aW5nIGhhbmcoKS4gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyB0byBkbzsKKyAqICAgIGhvd2V2ZXIsIHdlIG1pZ2h0IGxhdGVyIGRyaXZlIHRoZSBwaWV6byBvciBhIExFRC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2JvYXJkX2hhbmcgKHZvaWQpCit7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvbXV4LmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGM3ZGYwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvbXV4LmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBJL08gcGFkIG11bHRpcGxleGVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHZvaWQgc2V0X211eGNvbmZfcmVncygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lcyBzZXRzIHRoZSBJL08gcGFkIG11bHRpcGxleGVycyBmb3IgVUFSVCwgR1BNQywgU0RSQywKKyAqICAgIEdQSU8uCisgKgorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICovCit2b2lkCitzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJLyoKKwkgKiBUaGUgYml0IGZpZWxkcyBmb3IgdGhlc2Ugc2V0dGluZ3MgYXJlIGFzIGZvbGxvd3M6CisJICoKKwkgKiAgIEl7RU4sRElTfQkgCS0gSW5wdXQgRW5hYmxlL0Rpc2FibGUKKwkgKiAgIFBUW0RVXQkJIAktIFB1bGwtZG93biwgLXVwCisJICogICBESVMsRU4JCSAgCS0gUHVsbC1kb3duLCAtdXAgZGlzYWJsZWQvZW5hYmxlZAorCSAqICAgTVswMTIzNDU2N10JLSBDb25maWd1cmF0aW9uIG1vZGUgMC03CisJICovCisKKwkvKgorCSAqIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisJICoKKwkgKiBNb3N0IG9mIHRoZSBTRFJDIHNpZ25hbHMgYXJlIHVzZWQgdG8gZHJpdmUgdGhlIFNhbXN1bmcKKwkgKiBLNFg1MTE2M1BJLUZDRzYgNTEyIE1iIHggMTYtYml0ICg2NCBNaUIpIEREUiBTRFJBTS4gQmVjYXVzZSB3ZQorCSAqIGludGVyZmFjZSBpbiAxNi1iaXQgcmF0aGVyIHRoYW4gMzItYml0IG1vZGUsIHdlIHBsYWNlIHRoZQorCSAqIHVudXNlZCBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKwkgKi8KKworCU1VWF9WQUwoQ1AoU0RSQ19EMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDAKKwlNVVhfVkFMKENQKFNEUkNfRDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxCisJTVVYX1ZBTChDUChTRFJDX0QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMgorCU1VWF9WQUwoQ1AoU0RSQ19EMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDMKKwlNVVhfVkFMKENQKFNEUkNfRDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q0CisJTVVYX1ZBTChDUChTRFJDX0Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENQorCU1VWF9WQUwoQ1AoU0RSQ19ENiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDYKKwlNVVhfVkFMKENQKFNEUkNfRDcpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q3CisJTVVYX1ZBTChDUChTRFJDX0Q4KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDkKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTAKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTEKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTIKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTMKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTQKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTUKKworCS8vIEJlY2F1c2Ugd2UgaW50ZXJmYWNlIFNEUkFNIGluIDE2LWJpdCBtb2RlLCBwbGFjZQorCS8vIFNEUkNfREFUQVszMToxNl0gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0QxNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJTVVYX1ZBTChDUChTRFJDX0NMSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfQ0xLCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzAKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMQorCisJLy8gUGxhY2UgdW51c2VkIERRIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoR1BNQ19BMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTEKKwlNVVhfVkFMKENQKEdQTUNfQTIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EyCisJTVVYX1ZBTChDUChHUE1DX0EzKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMworCU1VWF9WQUwoQ1AoR1BNQ19BNCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTQKKwlNVVhfVkFMKENQKEdQTUNfQTUpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E1CisJTVVYX1ZBTChDUChHUE1DX0E2KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNgorCU1VWF9WQUwoQ1AoR1BNQ19BNyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTcKKworCS8vIFBsYWNlIHRoZSB1bnVzZWQgR1BNQ19BOCBwaW4gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChHUE1DX0E4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gR1BNQ19BOSB0byBHUElPXzQyIHVzZWQgYXMgYSBwdXNoLXB1bGwsIGFjdGl2ZSBsb3cgaW5wdXQKKwkvLyBmcm9tIHRoZSBVU0IgUEhZIGZvciBVU0Igc3VzcGVuZCBub3RpZmljYXRpb24uCisKKwlNVVhfVkFMKENQKEdQTUNfQTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBHUElPXzQyCisJTVVYX1ZBTChDUChHUE1DX0ExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJTVVYX1ZBTChDUChHUE1DX0QwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMAorCU1VWF9WQUwoQ1AoR1BNQ19EMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEKKwlNVVhfVkFMKENQKEdQTUNfRDIpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QyCisJTVVYX1ZBTChDUChHUE1DX0QzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMworCU1VWF9WQUwoQ1AoR1BNQ19ENCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDQKKwlNVVhfVkFMKENQKEdQTUNfRDUpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q1CisJTVVYX1ZBTChDUChHUE1DX0Q2KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENgorCU1VWF9WQUwoQ1AoR1BNQ19ENyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDcKKwlNVVhfVkFMKENQKEdQTUNfRDgpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q4CisJTVVYX1ZBTChDUChHUE1DX0Q5KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOQorCU1VWF9WQUwoQ1AoR1BNQ19EMTApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMAorCU1VWF9WQUwoQ1AoR1BNQ19EMTEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMQorCU1VWF9WQUwoQ1AoR1BNQ19EMTIpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMgorCU1VWF9WQUwoQ1AoR1BNQ19EMTMpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMworCU1VWF9WQUwoQ1AoR1BNQ19EMTQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxNAorCU1VWF9WQUwoQ1AoR1BNQ19EMTUpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxNQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MwKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MwCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzEKKwlNVVhfVkFMKENQKEdQTUNfTkNTMiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMgorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEdQTUNfTkNTNiB0byBHUFQxMV9QV01fRVZUIHVzZWQgYXMgYSBwdXNoLXB1bGwgcHVsc2Ugd2lkdGgKKwkvLyBtb2R1bGF0ZWQgKFBXTSkgc2lnbmFsIGZvciB0aGUgcGllem8uCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0zKSk7CS8vIEdQVDExX1BXTV9FVlQKKworCS8vIEFzc2lnbiBHUE1DX05DUzcgdG8gR1BJT181OCB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dAorCS8vIFBJRVpPX05FTkFCTEUgdG8gdGhlIFRJIFNONzRMVkMyRzI0MCBEdWFsIEJ1ZmZlci9Ecml2ZXIgV2l0aAorCS8vIDMtU3RhdGUgT3V0cHV0cyBpbnB1dHMuCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNTgKKworCU1VWF9WQUwoQ1AoR1BNQ19DTEspLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0NMSworCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uQURWX0FMRQorCU1VWF9WQUwoQ1AoR1BNQ19OT0UpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25PRQorCU1VWF9WQUwoQ1AoR1BNQ19OV0UpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25XRQorCU1VWF9WQUwoQ1AoR1BNQ19OQkUwX0NMRSksCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQkUwX0NMRQorCisJLy8gQXNzaWduIEdQTUNfTkJFMSB0byBHUElPXzYxIHVzZWQgYXMgYSBwdXNoLXB1bGwgb3V0cHV0IHRvIHRoZQorCS8vIFppZ0JlZSBhY3RpdmUtbG93IHJlc2V0LgorCisJTVVYX1ZBTChDUChHUE1DX05CRTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzYxCisKKwlNVVhfVkFMKENQKEdQTUNfTldQKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV1AKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX1dBSVQwCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMQorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVuYXZhaWxhYmxlCisKKwkvLyBBc3NpZ24gR1BNQ19XQUlUMyB0byBHUElPXzY1IHVzZWQgYXMgYW4gYWN0aXZlLWhpZ2gsIHB1c2gtcHVsbAorCS8vIGJhY2twbGF0ZSBkZXRlY3QgaW5wdXQuCisKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzY1CisKKwkvKgorCSAqIERpc3BsYXkgU3Vic3lzdGVtIChEU1MpCisJICoKKwkgKiBBbGwgRFNTIHNpZ25hbHMgYXJlIHVzZWQgaW4gdGhlaXIgbm9ybWFsLCBkZWZhdWx0IG1vZGUgKE1vZGUgMCkKKwkgKiB0byBkcml2ZSB0aGUgU2Ftc3VuZyBMTVMzNTBERjBbMTNdIExDRCBkaXNwbGF5IHBhbmVsLgorCSAqLworCisJTVVYX1ZBTChDUChEU1NfUENMSyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19QQ0xLCisJTVVYX1ZBTChDUChEU1NfSFNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfSFNZTkMKKwlNVVhfVkFMKENQKERTU19WU1lOQyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19WU1lOQworCU1VWF9WQUwoQ1AoRFNTX0FDQklBUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19BQ0JJQVMKKwlNVVhfVkFMKENQKERTU19EQVRBMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExCisJTVVYX1ZBTChDUChEU1NfREFUQTIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIKKwlNVVhfVkFMKENQKERTU19EQVRBMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMworCU1VWF9WQUwoQ1AoRFNTX0RBVEE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE0CisJTVVYX1ZBTChDUChEU1NfREFUQTUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTUKKwlNVVhfVkFMKENQKERTU19EQVRBNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNgorCU1VWF9WQUwoQ1AoRFNTX0RBVEE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE3CisJTVVYX1ZBTChDUChEU1NfREFUQTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTgKKwlNVVhfVkFMKENQKERTU19EQVRBOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBOQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTAKKwlNVVhfVkFMKENQKERTU19EQVRBMTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTExCisJTVVYX1ZBTChDUChEU1NfREFUQTEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTMKKwlNVVhfVkFMKENQKERTU19EQVRBMTQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE0CisJTVVYX1ZBTChDUChEU1NfREFUQTE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTYKKwlNVVhfVkFMKENQKERTU19EQVRBMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE3CisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExOAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTkKKwlNVVhfVkFMKENQKERTU19EQVRBMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIwCisJTVVYX1ZBTChDUChEU1NfREFUQTIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjIKKwlNVVhfVkFMKENQKERTU19EQVRBMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIzCisKKwlNVVhfVkFMKENQKENBTV9XRU4pLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8qCisJICogVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlciAvIFRyYW5zbWl0dGVyIChVQVJUKQorCSAqCisJICovCisKKwlNVVhfVkFMKENQKFVBUlQxX1RYKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfVFgKKwlNVVhfVkFMKENQKFVBUlQxX1JUUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVBUlQxX1JUUworCU1VWF9WQUwoQ1AoVUFSVDFfQ1RTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVUFSVDFfQ1RTCisJTVVYX1ZBTChDUChVQVJUMV9SWCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1JYCisJLyoKKwkgKiBDb250cm9sIGFuZCBEZWJ1ZworCSAqCisJICovCisKKwlNVVhfVkFMKENQKFNZU18zMkspLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfMzJLCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDAKKwlNVVhfVkFMKENQKFNZU19CT09UMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMQorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QyCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDMKKwlNVVhfVkFMKENQKFNZU19CT09UNCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q1CisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDYKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQxKSwgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBTWVNfQ0xLT1VUMQorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfblRSU1QKKwlNVVhfVkFMKENQKEpUQUdfVENLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UQ0sKKwlNVVhfVkFMKENQKEpUQUdfVE1TKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UTVMKKwlNVVhfVkFMKENQKEpUQUdfVERJKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UREkKKwlNVVhfVkFMKENQKEpUQUdfRU1VMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19FTVUxCisJTVVYX1ZBTChDUChFVEtfQ0xLX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfQ1RMX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDBfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDFfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDJfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDNfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDRfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDVfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDZfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDdfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDhfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDlfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEwX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDExX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEyX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEzX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gRVRLX0QxWzQ1XSBhcyBNTTJfUlhSQ1YgYW5kIE1NMl9UWFNFMCBVU0IgRlMvTFMgSG9zdAorCS8vIChNb2RlIDUpCisKKwlNVVhfVkFMKENQKEVUS19EMTRfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBNTTJfUlhSQ1YKKwlNVVhfVkFMKENQKEVUS19EMTVfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBNTTJfVFhTRTAKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDlkMjcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqICAgIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXR1cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgICAgIEl0IGluaGVyaXRzIGVudGlyZWx5IGZyb20gdGhlIGVxdWl2YWxlbnQgVEkgT01BUDMgRVZNCisgKglmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8KKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IDM0MzAgWC1sb2FkZXIgY3VycmVudGx5IGRvZXMgbm90IHVzZSB0aGlzIGNvZGUuCisqICAgSXQgY291bGQgYmUgcmVtb3ZlZCBpdHMgaXMga2VwdCBmb3IgY29tcGF0YWJpbHkgd2l0aCB1LWJvb3QuCisgKgorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gQ01fQ0xLRU5fUExMLWJ5cGFzcyB2YWx1ZQorICogIFIxID0gQ01fQ0xLU0VMMV9QTEwtbSwgbiwgYW5kIGRpdmlkZXIgdmFsdWVzCisgKiAgUjIgPSBDTV9DTEtTRUxfQ09SRS1kaXZpZGVyIHZhbHVlcworICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoKKyAqICBOb3RlOiBJZiBjb3JlIHVubG9ja3MvcmVsb2NrcyBhbmQgU0RSQU0gaXMgcnVubmluZyBmYXN0IGFscmVhZHkgaXQgZ2V0cworICogICAgICAgIGNvbmZ1c2VkLiAgQSByZXNldCBvZiB0aGUgY29udHJvbGxlciBnZXRzIGl0IGJhY2suICBUYWtpbmcgYXdheSBpdHMKKyAqICAgICAgICBMMyB3aGVuIGl0cyBub3QgaW4gc2VsZiByZWZyZXNoIHNlZW1zIGJhZCBmb3IgaXQuICBOb3JtYWxseSwgdGhpcyBjb2RlCisgKiAgICAgICAgcnVucyBmcm9tIGZsYXNoIGJlZm9yZSBTRFIgaXMgaW5pdCBzbyB0aGF0IHNob3VsZCBiZSBvay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN0bWZkIHNwISwge3I0LXI2fQorCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByNCwgcGxsX2N0bF9hZGQKKyAgICAgICAgc3RyICAgICByMCwgW3I0XQord2FpdDE6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJlcSAgICAgd2FpdDEgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNSwgcGxsX2Rpdl9hZGQxCisgICAgICAgIHN0ciAgICAgcjEsIFtyNV0gICAgICAgICAgLyogc2V0IG0sIG4sIG0yICovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMgorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIC8qIHNldCBsMy9sNC8uLiBkaXZpZGVycyovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMyAgLyogd2t1cCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDMgIC8qIHJzbSB2YWwgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDUgIC8qIGVtdSAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDUKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzVfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIFtyNV0KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbG9jayBEUExMMyBhbmQgd2FpdCBhIGJpdCAqLworICAgICAgICBvcnIgICAgIHIwLCByMCwgIzB4NyAgIC8qIHNldCB1cCBmb3IgbG9jayBtb2RlICovCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8KKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKy8qIFRoZSBOb3IgaGFzIHRvIGJlIGluIHRoZSBGbGFzaCBCYXNlIENTMCBmb3IgdGhpcyBjb25kaXRpb24gdG8gaGFwcGVuICovCitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHMV8wKQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkICAoR1BNQ19DT05GSUczXzApCitmbGFzaF9jZmczX3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHNF8wKQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzVfMCkKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX2Rpdl9hZGQxOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMCitwbGxfZGl2X2FkZDI6CisgICAgLndvcmQgQ01fQ0xLU0VMX0NPUkUKK3BsbF9kaXZfYWRkMzoKKyAgICAud29yZCBDTV9DTEtTRUxfV0tVUAorcGxsX2Rpdl92YWwzOgorICAgIC53b3JkIChXS1VQX1JTTSA8PCAxKQorcGxsX2Rpdl9hZGQ0OgorICAgIC53b3JkIENNX0NMS1NFTF9HRlgKK3BsbF9kaXZfdmFsNDoKKyAgICAud29yZCAoR0ZYX0RJViA8PCAwKQorcGxsX2Rpdl9hZGQ1OgorICAgIC53b3JkIENNX0NMS1NFTDFfRU1VCitwbGxfZGl2X3ZhbDU6CisgICAgLndvcmQgQ0xTRUwxX0VNVV9WQUwKKyNlbmRpZiAvKiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAqLworCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4KKyAqIFRoZSB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBzeXNjbGsgYW5kIGZvciBFUzEgYW5kIEVTMi4KKyAqLworCittcHVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZFCisud29yZCAweDA3Cisud29yZCAweDA1Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MUY0Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxNzkKKy53b3JkIDB4MTIKKy53b3JkIDB4MDQKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MTkKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQQorLndvcmQgMHgzMgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfbXB1X2RwbGxfcGFyYW0KK2dldF9tcHVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIG1wdV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitpdmFfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTY4Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MEIKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDEzRgorLndvcmQgMHgzMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgxNworLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitjb3JlX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgwRQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgxMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE0QworLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDIxCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxCisud29yZCAweDEzCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKgorICogVGFibGVzIGZvciAzNngvMzd4IGRldmljZXMKKyAqCisgKiAoUG9wdWxhdGVkIGZvciAxM01IeiBvbmx5KQorICovCittcHVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF8zMDBNSFopCisud29yZCAxNTAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgMzAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDcsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAxNTAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAxNSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWikKKy53b3JkIDMwMCwgIDUsIDAsIDEgCS8vIDEyICAgTUh6Cisud29yZCA2MDAsIDEyLCAwLCAxIAkvLyAxMyAgIE1IegorLndvcmQgMTI1LCAgMywgMCwgMSAJLy8gMTkuMiBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDI2ICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2Vsc2UKKyMgZXJyb3IgIk1QVSBEUExMIHNldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEiCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWikgKi8KKworaXZhXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgIE0gICBOICAgRlMgTTIKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHoKKworY29yZV8zNnhfZHBsbF9wYXJhbToKKy8vICAgIE0gICAgTiAgIEZTIE0yCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8yMDBNSFopCisud29yZCAxMDAsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAyMDAsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAzNzUsIDM1LCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxMDAsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAzNzUsIDcxLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzMzMk1IWikKKy53b3JkIDE2NiwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDMzMiwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDQxNSwgMjMsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDE2NiwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDQxNSwgNDcsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaKQorLndvcmQgMjAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgNDAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAxNywgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2Vsc2UKKyMgZXJyb3IgIkNvcmUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaKSAqLworCisvKgorICogRm9yIHRoZSBwZXJpcGhlcmFsIChQRVIpIChha2EgRFBMTDQpIGNsb2NrIHNldHRpbmdzLCB0aGVyZSBhcmUgb25seQorICogZWZmZWN0aXZlbHkgdHdvIGNsb2NrIGNob2ljZXMsIDk2IE1IeiBvciAxOTIgTUh6LiBIb3dldmVyLCB0aGUgb25seQorICogdGltZSAxOTIgTUh6IGlzIGFwdCB0byBiZSB1c2VkIGluIGFuIGFwcGxpY2F0aW9uIGlzIGlmIGJvdGggU0dYIGFuZAorICogVFYgb3V0cHV0IGFyZSB1c2VkLgorICoKKyAqICAgRm9yIGFueSBnaXZlbiBzeXN0ZW0gY2xvY2ssIHRoZSBkaXZpZGVycyBhcmUgY29uZmlndXJlZCB0aHVzIChwZXIKKyAqICAgU2VjdGlvbiAzLjUuMy4zLjMuMiAiVHlwZSBCIERQTEwgKExvdy1KaXR0ZXIpIiBvZiB0aGUgT01BUDMgVFJNKToKKyAqCisgKiAgICAgUEVSW2Nsa291dF0gPSAoU1lTW2Nsa291dF0gKiBNKSAvIChOICsgMSkKKyAqCisgKiAgICAgICBNMltjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE0yICAgICAgICAgICB1c2VkIGJ5IFVBUlQsIE1NQywgSTJDLCBldGMuCisgKiAgICAgICBNM1tjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE0zICAgICAgICAgICB1c2VkIGJ5IFRWIG91dC4KKyAqICAgICAgIE00W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTQgICAgICAgICAgIHVzZWQgYnkgRFNTLgorICogICAgICAgTTVbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNSAgICAgICAgICAgdXNlZCBieSBjYW1lcmEuCisgKiAgICAgICBNNltjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE02ICAgICAgICAgICB1c2VkIGJ5IGVtdWxhdGlvbi4KKyAqCisgKiAgU28sIGZvciBhIDE5LjIgTUh6IHN5c3RlbSBjbG9jayBhbmQgdGhlIHNjYWxhciBlbnRyaWVzIGJlbG93OgorICoKKyAqICAgICAgIFBFUltjbGtvdXRdID0gKDE5LjIgKiA1NDApIC8gKDExICsgMSkgPSA4NjQKKyAqCisgKiAgICAgICBNMltjbGtvdXRdOiA4NjQgLyAgOSA9ICA5NiAgIE1IegorICogICAgICAgTTNbY2xrb3V0XTogODY0IC8gMTYgPSAgNTQgICBNSHoKKyAqICAgICAgIE00W2Nsa291dF06IDg2NCAvICA1ID0gMTcyLjggTUh6CisgKiAgICAgICBNNVtjbGtvdXRdOiA4NjQgLyAgNCA9IDIxNiAgIE1IegorICogICAgICAgTTZbY2xrb3V0XTogODY0IC8gIDMgPSAyODggICBNSHoKKyAqLworcGVyXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgU1lTX0NMSyAgICBNICAgICAgTiAgICAgIE0yICAgICAgTTMgICAgICBNNCAgICAgTTUgICAgICBNNiAgICAgIG0yRElWCisud29yZCAxMjAwMCwgICAgNDMyLCAgICA1LCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTIgICBNSHoKKy53b3JkIDEzMDAwLCAgICA4NjQsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxMyAgIE1IegorLndvcmQgMTkyMDAsICAgIDU0MCwgICAxMSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDE5LjIgTUh6Cisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMjYgICBNSHoKKy53b3JkIDM4NDAwLCAgICAyNzAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAzOC40IE1IegorLndvcmQgMTY4MDAsICAgIDM2MCwgICAgNiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDE2LjggTUh6CisKKy5nbG9ibCBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtCitnZXRfMzZ4X21wdV9kcGxsX3BhcmFtOgorCWFkcglyMCwgbXB1XzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbQorZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGl2YV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtCitnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGNvcmVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtCitnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtOgorCWFkcglyMCwgcGVyXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcGxhdGZvcm0uaCBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4YzEyZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3BsYXRmb3JtLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yCisgKiAgICAgIGFjY2Vzc2luZyBEaWdpdGFsIFBoYXNlZCBMb2NrIExvb3AgKERQTEwpIHBhcmFtZXRlcnMgYW5kCisgKiAgICAgIHNldHRpbmdzLgorICoKKyAqLworCisjaWZuZGVmIF9ORVNUX0o0OV9QTEFURk9STV9IXworI2RlZmluZSBfTkVTVF9KNDlfUExBVEZPUk1fSF8KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qCisgKiBUeXBlIERlZmluaXRpb25zCisgKi8KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisJdTMyIG07CisJdTMyIG47CisJdTMyIGZzZWw7CisJdTMyIG0yOworfTsKKworc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSB7CisJdTMyIHN5c19jbGs7CisJdTMyIG07CisJdTMyIG47CisJdTMyIG0yOworCXUzMiBtMzsKKwl1MzIgbTQ7CisJdTMyIG01OworCXUzMiBtNjsKKwl1MzIgbTJkaXY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcGxsX3BhcmFtIGRwbGxfcGFyYW07CisKKy8qCisgKiBJbmxpbmUgRnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBwbGF0Zm9ybS5TLgorICovCisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9ORVNUX0o0OV9QTEFURk9STV9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcHJjbS5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcHJjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjVhZDcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wcmNtLmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBjbG9jayBzZXQtdXAgZm9yIHRoZSBwcm9jZXNzb3IncyBQb3dlciwgUmVzZXQgYW5kCisgKiAgICAgIENsb2NrIE1hbmFnZXIgKFBSQ00pCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHUzMiBnZXRfb3NjX2Nsa19zcGVlZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGRldGVybWluZXMgdGhlIHJlZmVyZW5jZSBvc2NpbGxhdG9yIHNwZWVkIGJhc2VkIG9uCisgKiAgICBhIGtub3duIDMyIGtIeiBjbG9jayBhbmQgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBjbG9jayBzcGVlZC4KKyAqCisgKi8KK3N0YXRpYyB1MzIKK2dldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCBjZGl2LCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCisJaWYgKHZhbCAmIEJJVDcpCisJCWNkaXYgPSAyOworCWVsc2UgaWYgKHZhbCAmIEJJVDYpCisJCWNkaXYgPSAxOworCWVsc2UKKwkJLyoKKwkJICogU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUhCisJCSAqIFRCRDogQWRkIGEgV0FSTigpL0JVRygpCisJCSAqICAgICAgRm9yIG5vdywgYXNzdW1lIGRpdmlkZXIgYXMgMS4KKwkJICovCisJCWNkaXYgPSAxOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCWlmIChjZGl2ID09IDIpCisJeworCQljZGlmZiAqPSAyOworCX0KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKgorICogIHZvaWQgZ2V0X3N5c19jbGtpbl9zZWwoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIFBSQ00gUFJNIHN5c3RlbSBjbG9jaworICogICAgZnJlcXVlbmN5IHNlbGVjdG9yLCB3aGljaCBzaG91bGQgYmUgd3JpdHRlbiB0byBQUk1fQ0xLU0VMLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGhlcnR6ICAtIFRoZSBzcGVlZCwgaW4gTUh6LCB0aGF0IHRoZSBzeXN0ZW0gY2xvY2sgaXMgYmVsaWV2ZWQKKyAqICAgICAgICAgICAgICAgdG8gYmUgcnVubmluZyBhdC4KKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIGluZGV4IHVzZWQgdG8gYWNjZXNzIHRoZQorICogICAgICAgICAgICAgICBkaWdpdGFsIFBMTCBzZXR0aW5ncy4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgc3lzX2Nsa2luX3NlbCAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggZm9yIHRoZSBkaWdpdGFsIFBMTCBzZXR0aW5ncworICogICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBmb3IgdGhlIHNwZWNpZmllZCBzeXN0ZW0gY2xvY2sgcmF0ZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLworc3RhdGljIHZvaWQKK2dldF9zeXNfY2xraW5fc2VsKHUzMiBoZXJ0eiwgdTMyICpzeXNfY2xraW5fc2VsKQoreworCXN3aXRjaCAoaGVydHopIHsKKworCWNhc2UgUzM4XzRNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8zOF80X01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMyNk06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzI2XzBfTUhaOworCQlicmVhazsKKworCWNhc2UgUzE5XzJNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xOV8yX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxNl84TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTZfOF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTNNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xM18wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxMk06CisJZGVmYXVsdDoKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTJfMF9NSFo7CisJCWJyZWFrOworCisJfQorfQorCisvKgorICogT01BUDM0eC8zNXggc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkCitkcGxsM19pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM0WCk7CS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2RwbGw0X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyID0gcHRyICsgY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA1LCBQRVJfTTZYMik7CQkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJCS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkJLyogc2V0IE00ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA1LCBQRVJfTTNYMik7CQkvKiBzZXQgTTMgKi8KKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKFBFUklQSF9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbMjA6MjNdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCkgOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHVfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChNUFVfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9NUFVbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgNCwgNCwgcHRyLT5mc2VsKTsKK30KKworc3RhdGljIHZvaWQKK2l2YV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKElWQTJfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCA0LCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisvKgorICogT01BUDM2MzAgc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkCitkcGxsM19pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM2WCk7CQkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICpwdHI7CisKKwlwdHIgPSAoc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqKWdldF8zNnhfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIE02IChESVZfRFBMTDQpOiBDTV9DTEtTRUwxX0VNVVsyNDoyOV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNiwgcHRyLT5tNik7CisKKwkvKiBNNSAoQ0xLU0VMX0NBTSk6IENNX0NMS1NFTDFfRU1VWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDYsIHB0ci0+bTUpOworCisJLyogTTQgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1swOjVdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA2LCBwdHItPm00KTsKKworCS8qIE0zIChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbODoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDYsIHB0ci0+bTMpOworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOV0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMiwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogTTJESVYgKENMS1NFTF85Nk0pOiBDTV9DTEtTRUxfQ09SRVsxMjoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAxMiwgMiwgcHRyLT5tMmRpdik7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKTogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9NUFVfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2l2YV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqICB2b2lkIHByY21faW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGNsb2NrcyBpbiBhIGJvYXJkLXNwZWNpZmljIG1hbm5lciBmb3IKKyAqICAgIHRoZSBwcm9jZXNzb3IncyBQb3dlciwgUmVzZXQgYW5kIENsb2NrIE1hbmFnZXIgKFBSQ00pIGFuZCBpcworICogICAgY2FsbGVkIG9ubHkgd2hlbiBhbiBTUkFNLWJhc2VkIHN0YWNrIGlzIGF2YWlsYWJsZSAoaS5lLiBubworICogICAgU0RSQU0pLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcHJjbV9pbml0KHZvaWQpCit7CisJdTMyIHN5c19jbGtfcmF0ZSA9IDAsIHN5c19jbGtpbl9zZWwsIHN5c19jbGtfZGl2OworCXUzMiBjbGtfaW5kZXgsIHNpbF9pbmRleDsKKworCS8qIEdhdWdlIHRoZSBpbnB1dCBjbG9jayBzcGVlZCBhbmQgZmluZCBvdXQgdGhlIHN5c19jbGtpbl9zZWwKKwkgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBjbG9jay4KKwkgKi8KKwlzeXNfY2xrX3JhdGUgPSBnZXRfb3NjX2Nsa19zcGVlZCgpOworCWdldF9zeXNfY2xraW5fc2VsKHN5c19jbGtfcmF0ZSwgJnN5c19jbGtpbl9zZWwpOworCisJLyogU2V0IHRoZSBQUk1fQ0xLU0VMX1NZU19DTEtJTl9TRUwgdmFsdWUgaW4gdGhlIHByb2Nlc3Nvci4gKi8KKworCXNyMzIoUFJDTV9QUk1fQ0NSX0NMS1NFTCwKKwkJIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9TVEFSVCwKKwkJIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9CSVRTLAorCQkgc3lzX2Nsa2luX3NlbCk7CisKKwkvKiBJZiB0aGUgaW5wdXQgY2xvY2sgaXMgZ3JlYXRlciB0aGFuIDE5LjJNIGFsd2F5cyBkaXZpZGUgYnkgdHdvLgorCSAqCisJICogT24gT01BUDM2MzAsIEREUiBkYXRhIGNvcnJ1cHRpb24gaGFzIGJlZW4gb2JzZXJ2ZWQgb24gT0ZGIG1vZGUKKwkgKiBleGl0IGlmIHRoZSBzeXMgY2xvY2sgd2FzIGxvd2VyIHRoYW4gMjZNLiBBcyBhIHdvcmsgYXJvdW5kLAorCSAqIE9NQVAzNjMwIGlzIG9wZXJhdGVkIGF0IDI2TSBzeXMgY2xvY2sgYW5kIHRoaXMgaW50ZXJuYWwgZGl2aXNpb24KKwkgKiBpcyBub3QgcGVyZm9ybWVkLgorCSAqLworCisJaWYoKGlzX2NwdV9mYW1pbHkoKSAhPSBDUFVfT01BUDM2WFgpICYmCisJICAgKHN5c19jbGtpbl9zZWwgPiBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFopKSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzI7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAyOworCisJfSBlbHNlIHsKKwkJc3lzX2Nsa19kaXYgPSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMTsKKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbCAvIDE7CisKKwl9CisKKwlzcjMyKFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMLAorCQkgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX1NUQVJULAorCQkgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JJVFMsCisJCSBzeXNfY2xrX2Rpdik7CisKKwlpZiAoaXNfY3B1X2ZhbWlseSgpID09IENQVV9PTUFQMzZYWCkgeworCQlkcGxsM19pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCisJfSBlbHNlIHsKKwkJc2lsX2luZGV4ID0gZ2V0X2NwdV9yZXYoKSAtIDE7CisKKwkJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJCSAqIHNpbGljb24gcmV2aXNpb24uIFRoZSBjbGtfaW5kZXggdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGdldAorCQkgKiB0aGUgdmFsdWVzIGZvciB0aGF0IGlucHV0IHN5c2NsayBmcm9tIHRoZSBEUExMIHBhcmFtIHRhYmxlCisJCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZQorCQkgKiBhcHByb3ByaWF0ZSBzaWxpY29uIHJldi4KKwkJICovCisKKwkJLyogVW5sb2NrIE1QVSBEUExMIChzbG93cyB0aGluZ3MgZG93biwgYW5kIG5lZWRlZCBsYXRlcikgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9XX1BPV0VSX0JZUEFTUyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkJZHBsbDNfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCisJCS8qIExvY2sgTVBVIERQTEwgdG8gc2V0IGZyZXF1ZW5jeSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKwl9CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS94LWxvYWQubGRzIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDYwM2EyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkveC1sb2FkLmxkcwpAQCAtMCwwICsxLDY1IEBACisvKgorICoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICogICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBYLUxvYWRlciBsaW5rZXIgc2NhdHRlciBmaWxlIGZvciB0aGUgTmVzdAorICogICAgICBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqLworCisvKgorICogTm92ZW1iZXIgMjAwNiAtIENoYW5nZWQgdG8gc3VwcG9ydCAzNDMwc2RwIGRldmljZQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwMjBhZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworT0JKUwk6PSBvbWFwMTcxMGgzLm8gCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWUzYzc2Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9jb25maWcubWsKQEAgLTAsMCArMSwyNiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDIKKyMgR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorIyBEYXZpZCBNdWVsbGVyLCBFTFNPRlQgQUcsIDxkLm11ZWxsZXJAZWxzb2Z0LmNoPgorIworIyAoQykgQ29weXJpZ2h0IDIwMDQKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIyBLc2hpdGlqIEd1cHRhIDxLc2hpdGlqQHRpLmNvbT4KKyMKKyMgVEkgSDMgYm9hcmQgd2l0aCBPTUFQMTcxMCAoQVJNOTI1RUpTKSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cworIworIyBJbm5vdmF0b3IgaGFzIDEgYmFuayBvZiAyNTYgTUIgU0RSQU0KKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgMTAwMCcwMDAwIHRvIDIwMDAnMDAwMAorIworIworIyBMaW51eC1LZXJuZWwgaXMgZXhwZWN0ZWQgdG8gYmUgYXQgMTAwMCc4MDAwLCBlbnRyeSAxMDAwJzgwMDAKKyMgKG1lbSBiYXNlICsgcmVzZXJ2ZWQpCisjCisjIHdlIGxvYWQgb3Vyc2VsZiB0byAxMTA4JzAwMDAKKyMKKyMKKworUExBVEZPUk1fTERGTEFHUyArPSAtbm8td2Fybi1taXNtYXRjaAorVEVYVF9CQVNFID0gMHgxMTA4MDAwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9vbWFwMTcxMGgzLmMgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL29tYXAxNzEwaDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDVjZmUyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9vbWFwMTcxMGgzLmMKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGF2aWQgTXVlbGxlciwgRUxTT0ZUIEFHLCA8ZC5tdWVsbGVyQGVsc29mdC5jaD4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaWYgZGVmaW5lZChDT05GSUdfT01BUDE3MTApCisjaW5jbHVkZSA8Li9jb25maWdzL29tYXAxNTEwLmg+CisjZW5kaWYKKyAgCisjZGVmaW5lIENPTVBfTU9ERV9FTkFCTEUgKCh1bnNpZ25lZCBpbnQpMHgwMDAwRUFFRikKKworaW50IGJvYXJkX2luaXQgKHZvaWQpCit7CisjaWZkZWYgQ0ZHX1BSSU5URiAKKworICAJLyogc2V0dXAgZm9yIFVBUlQxICovCisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKCh1bnNpZ25lZCBpbnQpRlVOQ19NVVhfQ1RSTF8wKSAmPSB+KDB4MDIwMDAwMDApOwkvKiBiaXQgMjUgKi8KKyAgCS8qIGJpdCAyOSBmb3IgVUFSVDEgKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGludClNT0RfQ09ORl9DVFJMXzApICY9IH4oMHgwMDAwMjAwMCk7CisgIAorCS8qIEVuYWJsZSB0aGUgcG93ZXIgZm9yIFVBUlQxICovCisjZGVmaW5lIFVBUlQxXzQ4TUhaX0VOQUJMRQkoKHVuc2lnbmVkIHNob3J0KTB4MDIwMCkKKyNkZWZpbmUgU1dfQ0xPQ0tfUkVRVUVTVAkweEZGRkUwODM0CisJKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilTV19DTE9DS19SRVFVRVNUKSB8PSBVQVJUMV80OE1IWl9FTkFCTEU7CisKKyNlbmRpZgorCisgCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopICgodW5zaWduZWQgaW50KUNPTVBfTU9ERV9DVFJMXzApID0gQ09NUF9NT0RFX0VOQUJMRTsKKyAgCXJldHVybiAwOworfQorCisjZGVmaW5lIEdQSU8xX0RJUkVDVElPTgkJMHhGRkZCRTQzNAorI2RlZmluZSBGVU5DX01VWF9DVFJMX0YJCTB4RkZGRTEwOTQKKyNkZWZpbmUgUFVfUERfU0VMXzQJCQkweEZGRkUxMEM0CisvKgorICogT24gSDMgYm9hcmQsIE5hbmQgUi9CIGlzIHRpZWQgdG8gR1BJT18xMAorICogV2Ugc2V0dXAgdGhpcyBHUElPIHBpbiAKKyAqLworaW50IG5hbmRfaW5pdCAodm9pZCkKK3sKKyAgIAkKKyAJLyogR1BJT18xMCBmb3IgaW5wdXQuIGl0IGlzIGluIEdQSU8xIG1vZHVsZSAqLworIAkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGludClHUElPMV9ESVJFQ1RJT04pIHw9IDB4MDQwMDsgCisJCisJLyogR1BJTzEwIEZ1bmNfTVVYX0NUUkwgcmVnIGJpdCAyOToyNywgQ29uZmlndXJlIFYyIHRvIG1vZGUxIGFzIEdQSU8gKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGludClGVU5DX01VWF9DVFJMX0YpICY9IDB4QzdGRkZGRkY7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKCh1bnNpZ25lZCBpbnQpRlVOQ19NVVhfQ1RSTF9GKSB8PSAweDA4MDAwMDAwOworCSAgCisJLyogR1BJTzEwIHB1bGx1cC9kb3duIHJlZ2lzdGVyLCBFbmFibGUgcHVsbHVwIG9uIEdQSU8xMCAqLworCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopICgodW5zaWduZWQgaW50KVBVX1BEX1NFTF80KSB8PSAweDA4OworIAkgCisgCWlmIChuYW5kX2NoaXAoKSl7CisJCXByaW50ZigiVW5zdXBwb3J0ZWQgQ2hpcCFcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIG9wdGlvbmFsbHkgZG8gc29tZXRoaW5nIGxpa2UgYmxpbmtpbmcgTEVEICovCit2b2lkIGJvYXJkX2hhbmcgKHZvaWQpCit7fQorIApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjRlM2UKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL3BsYXRmb3JtLlMKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogS3NoaXRpaiBHdXB0YSA8S3NoaXRpakB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2lmIGRlZmluZWQoQ09ORklHX09NQVAxNzEwKQorI2luY2x1ZGUgPC4vY29uZmlncy9vbWFwMTUxMC5oPgorI2VuZGlmCisKKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKy5nbG9ibCBwbGF0Zm9ybXNldHVwCitwbGF0Zm9ybXNldHVwOgorCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBTZXQgdXAgQVJNIENMTSByZWdpc3RlcnMgKElETEVDVDEpICAgICAgICAgICAgICAgICAgICoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGRyCXIwLAlSRUdfQVJNX0lETEVDVDEKKwlsZHIJcjEsCVZBTF9BUk1fSURMRUNUMQorCXN0cglyMSwJW3IwXQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogU2V0IHVwIEFSTSBDTE0gcmVnaXN0ZXJzIChJRExFQ1QyKSAgCQkgICAgICAgICoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGRyCXIwLAlSRUdfQVJNX0lETEVDVDIKKwlsZHIJcjEsCVZBTF9BUk1fSURMRUNUMgorCXN0cglyMSwJW3IwXQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogU2V0IHVwIEFSTSBDTE0gcmVnaXN0ZXJzIChJRExFQ1QzKQkJICAgICAgICAqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxkcglyMCwJUkVHX0FSTV9JRExFQ1QzCisJbGRyCXIxLAlWQUxfQVJNX0lETEVDVDMKKwlzdHIJcjEsCVtyMF0KKworCisJbW92CXIxLAkjMHgwNQkJLyogUEVSX0VOIGJpdCAqLworCWxkcglyMCwJUkVHX0FSTV9SU1RDVDIKKwlzdHJoCXIxLAlbcjBdCQkvKiBDTEtNOyBQZXJpcGhlcmFsIHJlc2V0LiAqLworCisJLyogU2V0IENMS00gdG8gU3luYy1TY2FsYWJsZQkqLworCS8qIEkgc3VwcG9zZWRseSBuZWVkIHRvIGVuYWJsZSB0aGUgZHNwIGNsb2NrIGJlZm9yZSBzd2l0Y2hpbmcgKi8KKwlsZHIJcjEsCVZBTF9BUk1fU1lTU1QKKwlsZHIJcjAsCVJFR19BUk1fU1lTU1QKKwlzdHJoCXIxLAlbcjBdCisJbW92CXIwLAkjMHg0MDAKKzE6CisJc3VicwlyMCwJcjAsCSMweDEJLyogd2FpdCBmb3IgYW55IGJ1YmJsZXMgdG8gZmluaXNoICovCisJYm5lCTFiCisJbGRyCXIxLAlWQUxfQVJNX0NLQ1RMCisJbGRyCXIwLAlSRUdfQVJNX0NLQ1RMCisJc3RyaAlyMSwJW3IwXQorCisJLyogYSBmZXcgbm9wcyB0byBsZXQgc2V0dGxlICovCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisKKwkvKiBzZXR1cCBEUExMIDEgKi8KKwkvKiBSYW1wIHVwIHRoZSBjbG9jayB0byA5Nk1oeiAqLworCWxkcglyMSwJVkFMX0RQTEwxX0NUTAorCWxkcglyMCwJUkVHX0RQTEwxX0NUTAorCXN0cmgJcjEsCVtyMF0KKwlhbmRzCXIxLAlyMSwJIzB4MTAJLyogQ2hlY2sgaWYgUExMIGlzIGVuYWJsZWQuICovCisJYmVxCWxvY2tfZW5kCS8qIERvIG5vdCBsb29rIGZvciBsb2NrIGlmIEJZUEFTUyBzZWxlY3RlZCAqLworMjoKKwlsZHJoCXIxLAlbcjBdCisJYW5kcwlyMSwJcjEsCSMweDAxCS8qCUNoZWNrIHRoZSBMT0NLIGJpdC4qLworCWJlcSAyYgkJCS8qCWxvb3AgdW50aWwgYml0IGdvZXMgaGkuICovCitsb2NrX2VuZDoKKworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogVHVybiBvZmYgdGhlIHdhdGNoZG9nIGR1cmluZyBpbml0Li4uCQkJKgorIAkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGRyCXIwLAlSRUdfV0FUQ0hET0cKKwlsZHIJcjEsCVdBVENIRE9HX1ZBTDEKKwlzdHIJcjEsCVtyMF0KKwlsZHIJcjEsCVdBVENIRE9HX1ZBTDIKKwlzdHIJcjEsCVtyMF0KKwlsZHIJcjAsCVJFR19XU1BSRE9HCisJbGRyCXIxLAlXU1BSRE9HX1ZBTDEKKwlzdHIJcjEsCVtyMF0KKwlsZHIJcjAsCVJFR19XV1BTRE9HCisKK3dhdGNoMVdhaXQ6CisJbGRyCXIxLAlbcjBdCisJdHN0CXIxLAkjMHgxMAorCWJuZQl3YXRjaDFXYWl0CisKKwlsZHIJcjAsCVJFR19XU1BSRE9HCisJbGRyCXIxLAlXU1BSRE9HX1ZBTDIKKwlzdHIJcjEsCVtyMF0KKwlsZHIJcjAsCVJFR19XV1BTRE9HCit3YXRjaDJXYWl0OgorCWxkcglyMSwJW3IwXQorCXRzdAlyMSwJIzB4MTAKKwlibmUJd2F0Y2gyV2FpdAorCisKKwkvKiBTZXQgbWVtb3J5IHRpbWluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbmV3IGNsb2NrIHNwZWVkICovCisgCSAKKwkvKgorCSogRGVsYXkgZm9yIFNEUkFNIGluaXRpYWxpemF0aW9uLgorCSovCisJbW92CXIzLAkjMHgxODAwCQkvKiB2YWx1ZSBzaG91bGQgYmUgY2hlY2tlZCAqLworMzoKKwlzdWJzCXIzLAlyMywJIzB4MQkvKiBEZWNyZW1lbnQgY291bnQgKi8KKwlibmUgCTNiCisKKworCS8qCisJICogU2V0IFNEUkFNIGNvbnRyb2wgdmFsdWVzLiBEaXNhYmxlIHJlZnJlc2ggYmVmb3JlIE1SUyBjb21tYW5kLgorCSAqLworCisJLyogbW9iaWxlIGRkciBvcGVyYXRpb24gKi8KKwlsZHIJcjAsCVJFR19TRFJBTV9PUEVSQVRJT04KKwltb3YJcjIsCSMwNworCXN0cglyMiwJW3IwXQorCisJLyogY29uZmlnIHJlZ2lzdGVyICovCisJbGRyCXIwLAlSRUdfU0RSQU1fQ09ORklHCisJbGRyCXIxLAlTRFJBTV9DT05GSUdfVkFMCisJc3RyCXIxLAlbcjBdCisKKwkvKiBtYW51YWwgY29tbWFuZCByZWdpc3RlciAqLworCWxkcglyMCwJUkVHX1NEUkFNX01BTlVBTF9DTUQKKwkvKiBpc3N1ZSBzZXQgY2tlIGhpZ2ggKi8KKwltb3YJcjEsCSNDTURfU0RSQU1fQ0tFX1NFVF9ISUdICisJc3RyCXIxLAlbcjBdCisJLyogaXNzdWUgbm9wICovCisJbW92CXIxLAkjQ01EX1NEUkFNX05PUAorCXN0cglyMSwJW3IwXQorCisJbW92CXIyLAkjMHgwMTAwCit3YWl0TUREUjE6CisJc3VicwlyMiwJcjIsCSAjMQorCWJuZQl3YWl0TUREUjEJLyogZGVsYXkgbG9vcCAqLworCisJLyogaXNzdWUgcHJlY2hhcmdlICovCisJbW92CXIxLAkjQ01EX1NEUkFNX1BSRUNIQVJHRQorCXN0cglyMSwJW3IwXQorCisKKwkvKiBpc3N1ZSBhdXRvcmVmcmVzaCB4IDIgKi8KKwltb3YJcjEsCSNDTURfU0RSQU1fQVVUT1JFRlJFU0gKKwlzdHIJcjEsCVtyMF0KKwlzdHIJcjEsCVtyMF0KKworCS8qIG1ycyByZWdpc3RlciBkZHIgbW9iaWxlICovCisJbGRyCXIwLAlSRUdfU0RSQU1fTVJTCisJbW92CXIxLAkjMHgzMworCXN0cglyMSwJW3IwXQorCisJLyogZW1yczEgbG93LXBvd2VyIHJlZ2lzdGVyICovCisJbGRyCXIwLAlSRUdfU0RSQU1fRU1SUzEKKwkvKiBzZWxmIHJlZnJlc2ggb24gYWxsIGJhbmtzICovCisJbW92CXIxLAkjMAorCXN0cglyMSwJW3IwXQorCisJbGRyCXIwLAlSRUdfRExMX1VSRF9DT05UUk9MCisJbGRyCXIxLAlETExfVVJEX0NPTlRST0xfVkFMCisJc3RyCXIxLAlbcjBdCisKKwlsZHIJcjAsCVJFR19ETExfTFJEX0NPTlRST0wKKwlsZHIJcjEsCURMTF9MUkRfQ09OVFJPTF9WQUwKKwlzdHIJcjEsCVtyMF0KKworCWxkcglyMCwJUkVHX0RMTF9XUlRfQ09OVFJPTAorCWxkcglyMSwJRExMX1dSVF9DT05UUk9MX1ZBTAorCXN0cglyMSwJW3IwXQorCisJLyogZGVsYXkgbG9vcCAqLworCW1vdglyMiwJIzB4MDEwMAord2FpdE1ERFIyOgorCXN1YnMJcjIsCXIyLAkjMQorCWJuZQl3YWl0TUREUjIKKworCS8qCisJICogRGVsYXkgZm9yIFNEUkFNIGluaXRpYWxpemF0aW9uLgorCSAqLworCW1vdglyMywJIzB4MTgwMAorNDoKKwlzdWJzCXIzLAlyMywJIzEJLyogRGVjcmVtZW50IGNvdW50LiAqLworCWJuZQk0YgorCWIJY29tbW9uX3RjCisKK3NraXBfc2RyYW06CisKKwlsZHIJcjAsCVJFR19TRFJBTV9DT05GSUcKKwlsZHIJcjEsCVNEUkFNX0NPTkZJR19WQUwKKwlzdHIJcjEsCVtyMF0KKworCS8qIEVuYWJsZSBFTUlGRiBUQyBEb3VibGVyIGluIE9NQVAxNzEwICovCisJbGRyCXIwLAlSRUdfRU1JRkZfRE9VQkxFUgorCW1vdglyMCwJIzB4MTsKKworY29tbW9uX3RjOgorCS8qIHNsb3cgaW50ZXJmYWNlICovCisJbGRyCXIxLAlWQUxfVENfRU1JRlNfQ09ORklHCisJbGRyCXIwLAlSRUdfVENfRU1JRlNfQ09ORklHCisJc3RyCXIxLAlbcjBdCisKKyNpZmRlZiBDRkdfQk9PVF9DUzAKKwkvKiBDaGlwIFNlbGVjdCAzIGZvciBOQU5EKi8KKwlsZHIJcjEsCVZBTF9UQ19FTUlGU19DUzNfQ09ORklHCisJbGRyCXIwLAlSRUdfVENfRU1JRlNfQ1MzX0NPTkZJRworCXN0cglyMSwJW3IwXSAKKyNlbHNlCisJLyogQ2hpcCBTZWxlY3QgMiBmb3IgTkFORCovCisJbGRyCXIxLAlWQUxfVENfRU1JRlNfQ1MyX0NPTkZJRworCWxkcglyMCwJUkVHX1RDX0VNSUZTX0NTMl9DT05GSUcKKwlzdHIJcjEsCVtyMF0gCisjZW5kaWYKKyAgCisgICAgICAgIC8qIFN0YXJ0IE1QVSBUaW1lciAxICovCisgICAgICAgIGxkciAgICAgcjAsICAgICBSRUdfTVBVX0xPQURfVElNRVIKKyAgICAgICAgbGRyICAgICByMSwgICAgIFZBTF9NUFVfTE9BRF9USU1FUgorICAgICAgICBzdHIgICAgIHIxLCAgICAgW3IwXQorCisgICAgICAgIGxkciAgICAgcjAsICAgICBSRUdfTVBVX0NOVExfVElNRVIKKyAgICAgICAgbGRyICAgICByMSwgICAgIFZBTF9NUFVfQ05UTF9USU1FUgorICAgICAgICBzdHIgICAgIHIxLCAgICAgW3IwXQorCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCisKK1JFR19UQ19FTUlGU19DT05GSUc6CQkvKiAzMiBiaXRzICovCisJLndvcmQgMHhmZmZlY2MwYworI2lmZGVmIENGR19CT09UX0NTMAorUkVHX1RDX0VNSUZTX0NTM19DT05GSUc6CS8qIDMyIGJpdHMgKi8KKwkud29yZCAweGZmZmVjYzFjCisjZWxzZQorUkVHX1RDX0VNSUZTX0NTMl9DT05GSUc6CS8qIDMyIGJpdHMgKi8KKwkud29yZCAweGZmZmVjYzE4CisjZW5kaWYKKyAKKy8qIE1QVSBjbG9jay9yZXNldC9wb3dlciBtb2RlIGNvbnRyb2wgcmVnaXN0ZXJzICovCitSRUdfQVJNX0NLQ1RMOgkJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZTAwCisKK1JFR19BUk1fSURMRUNUMzoJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZTI0CitSRUdfQVJNX0lETEVDVDI6CQkvKiAxNiBiaXRzICovCisJLndvcmQgMHhmZmZlY2UwOAorUkVHX0FSTV9JRExFQ1QxOgkJLyogMTYgYml0cyAqLworCS53b3JkIDB4ZmZmZWNlMDQKKworUkVHX0FSTV9SU1RDVDI6CQkJLyogMTYgYml0cyAqLworCS53b3JkIDB4ZmZmZWNlMTQKK1JFR19BUk1fU1lTU1Q6CQkJLyogMTYgYml0cyAqLworCS53b3JkIDB4ZmZmZWNlMTgKKy8qIERQTEwgY29udHJvbCByZWdpc3RlcnMgKi8KK1JFR19EUExMMV9DVEw6CQkJLyogMTYgYml0cyAqLworCS53b3JkIDB4ZmZmZWNmMDAKKworLyogV2F0Y2ggRG9nIHJlZ2lzdGVyICovCisvKiBzZWN1cmUgd2F0Y2hkb2cgc3RvcCAqLworUkVHX1dTUFJET0c6CisJLndvcmQgMHhmZmZlYjA0OAorLyogd2F0Y2hkb2cgd3JpdGUgcGVuZGluZyAqLworUkVHX1dXUFNET0c6CisJLndvcmQgMHhmZmZlYjAzNAorCitXU1BSRE9HX1ZBTDE6CisJLndvcmQgMHgwMDAwYWFhYQorV1NQUkRPR19WQUwyOgorCS53b3JkIDB4MDAwMDU1NTUKKworLyogU0RSQU0gY29uZmlnIGlzOiBhdXRvIHJlZnJlc2ggZW5hYmxlZCwgMTYgYml0IDQgYmFuaywKKyBjb3VudGVyIEA4MTkyIHJvd3MsIDEwIG5zLCA4IGJ1cnN0ICovCitSRUdfU0RSQU1fQ09ORklHOgorCS53b3JkIDB4ZmZmZWNjMjAKKworLyogT3BlcmF0aW9uIHJlZ2lzdGVyICovCitSRUdfU0RSQU1fT1BFUkFUSU9OOgorCS53b3JkIDB4ZmZmZWNjODAKKworUkVHX0VNSUZGX0RPVUJMRVI6CisJLndvcmQgMHhmZmZlY2M2MAorCisvKiBNYW51YWwgY29tbWFuZCByZWdpc3RlciAqLworUkVHX1NEUkFNX01BTlVBTF9DTUQ6CisJLndvcmQgMHhmZmZlY2M4NAorCisvKiBTRFJBTSBNUlMgKE5ldykgY29uZmlnIGlzOiBDQVMgbGF0ZW5jeSBpcyAyLCBidXJzdCBsZW5ndGggOCAqLworUkVHX1NEUkFNX01SUzoKKwkud29yZCAweGZmZmVjYzcwCisKKy8qIFNEUkFNIE1SUyAoTmV3KSBjb25maWcgaXM6IENBUyBsYXRlbmN5IGlzIDIsIGJ1cnN0IGxlbmd0aCA4ICovCitSRUdfU0RSQU1fRU1SUzE6CisJLndvcmQgMHhmZmZlY2M3OAorCisvKiBXUlQgRExMIHJlZ2lzdGVyICovCitSRUdfRExMX1dSVF9DT05UUk9MOgorCS53b3JkIDB4ZmZmZWNjNjQKK0RMTF9XUlRfQ09OVFJPTF9WQUw6CisJLndvcmQgMHgwMzUwMDAwMgorCisvKiBVUkQgRExMIHJlZ2lzdGVyICovCitSRUdfRExMX1VSRF9DT05UUk9MOgorCS53b3JkIDB4ZmZmZWNjYzAKK0RMTF9VUkRfQ09OVFJPTF9WQUw6CisJLndvcmQgMHgwMDAwMDAwNgorCisvKiBMUkQgRExMIHJlZ2lzdGVyICovCitSRUdfRExMX0xSRF9DT05UUk9MOgorCS53b3JkIDB4ZmZmZWNjY2MKKworUkVHX1dBVENIRE9HOgorCS53b3JkIDB4ZmZmZWM4MDgKKworUkVHX01QVV9MT0FEX1RJTUVSOgorICAgICAgICAud29yZCAweGZmZmVjNjAwCitSRUdfTVBVX0NOVExfVElNRVI6CisgICAgICAgIC53b3JkIDB4ZmZmZWM1MDAKKworLyogOTYgTUh6IFNhbXN1bmcgTW9iaWxlIEREUiAqLworU0RSQU1fQ09ORklHX1ZBTDoKKwkud29yZCAweDBjMDI4YWY0CisKK0RMTF9MUkRfQ09OVFJPTF9WQUw6CisJLndvcmQgMHgwMDAwMDAwNgorCitWQUxfQVJNX0NLQ1RMOgorCS53b3JkIDB4MzUwZQorVkFMX0FSTV9TWVNTVDoKKwkud29yZCAweDEwMDEKKworVkFMX0RQTEwxX0NUTDoKKwkud29yZCAweDI4MTAKKworI2lmZGVmIENGR19CT09UX0NTMAorVkFMX1RDX0VNSUZTX0NPTkZJRzoKKwkud29yZCAweDAwMDAwMDEwIAorVkFMX1RDX0VNSUZTX0NTM19DT05GSUc6CQorIAkud29yZCAweGZmODBmZmYzICAgCisjZWxzZQorVkFMX1RDX0VNSUZTX0NPTkZJRzoKKwkud29yZCAweDAwMDAwMDEyICAgLypzd2FwIENTMC9DUzMgYWRkcmVzc2luZyAqLworVkFMX1RDX0VNSUZTX0NTMl9DT05GSUc6CQorIAkud29yZCAweGZmODBmZmYzICAgCisjZW5kaWYKKworIAorVkFMX1RDX0VNSUZGX1NEUkFNX0NPTkZJRzoKKwkud29yZCAweDAxMDI5MGZjCitWQUxfVENfRU1JRkZfTVJTOgorCS53b3JkIDB4MDAwMDAwMjcKKworVkFMX0FSTV9JRExFQ1QxOgorCS53b3JkIDB4MDAwMDE0YzYKKworVkFMX0FSTV9JRExFQ1QyOgorCS53b3JkIDB4MDAwMDA5ZmYKK1ZBTF9BUk1fSURMRUNUMzoKKwkud29yZCAweDAwMDAwMDNmCisKK1dBVENIRE9HX1ZBTDE6CisJLndvcmQgMHgwMDAwMDBmNQorV0FUQ0hET0dfVkFMMjoKKwkud29yZCAweDAwMDAwMGEwCisKK1ZBTF9NUFVfTE9BRF9USU1FUjoKKyAgICAgICAgLndvcmQgMHhmZmZmZmZmZgorVkFMX01QVV9DTlRMX1RJTUVSOgorICAgICAgICAud29yZCAweGZmZmZmZmExCisKKy8qIGNvbW1hbmQgdmFsdWVzICovCisuZXF1IENNRF9TRFJBTV9OT1AsCQkweDAwMDAwMDAwCisuZXF1IENNRF9TRFJBTV9QUkVDSEFSR0UsCTB4MDAwMDAwMDEKKy5lcXUgQ01EX1NEUkFNX0FVVE9SRUZSRVNILAkweDAwMDAwMDAyCisuZXF1IENNRF9TRFJBTV9DS0VfU0VUX0hJR0gsCTB4MDAwMDAwMDcKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjg0ZWVhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy94LWxvYWQubGRzCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCS4gPSBBTElHTig0KTsKKwkudGV4dAk6CisJeworCSAgY3B1L2FybTkyNmVqcy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKyAJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNDc0MjgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gb21hcDI0MjBoNC5vIAorU09CSlMJOj0gcGxhdGZvcm0ubworCiskKExJQik6CSQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3NzBmMwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgVEkgSDQgYm9hcmQgd2l0aCBPTUFQMjQyMCAoQVJNMTEzNikgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgSDQgaGFzIDEgYmFuayBvZiAzMk1CIG9yIDY0TUIgbUREUi1TRFJBTSBvbiBDUzAKKyMgSDQgaGFzIDEgYmFuayBvZiAzMk1CIG9yIDAwTUIgbUREUi1TRFJBTSBvbiBDUzEKKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIChiYW5rMCkKKyMgQTAwMC8wMDAwIChiYW5rMSkgRVMyIHdpbGwgYmUgY29uZmlndXJhYmxlCisjIExpbnV4LUtlcm5lbCBpcyBleHBlY3RlZCB0byBiZSBhdCA4MDAwJzgwMDAsIGVudHJ5IDgwMDAnODAwMAorIyAobWVtIGJhc2UgKyByZXNlcnZlZCkKKworIyBGb3IgdXNlIHdpdGggZXh0ZXJuYWwgb3IgaW50ZXJuYWwgYm9vdHMuCisjIENPTkZJR19QQVJUSUFMX1NSQU0gbXVzdCBiZSBkZWZpbmVkIHRvIHVzZSB0aGlzLgorVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIFVzZWQgd2l0aCBmdWxsIFNSQU0gYm9vdC4KKyMgVGhpcyBpcyBlaXRoZXIgd2l0aCBhIEdQIHN5c3RlbSBvciBhIHNpZ25lZCBib290IGltYWdlLgorIyBlYXNpZXN0LCBhbmQgc2FmZXN0IHdheSB0byBnbyBpZiB5b3UgY2FuLgorIyBDb21tZW50IG91dCAvL0NPTkZJR19QQVJUSUFMX1NSQU0gZm9yIHRoaXMgb25lLgorIworI1RFWFRfQkFTRSA9IDB4NDAyODAwMDAKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9vbWFwMjQyMGg0LmMgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L29tYXAyNDIwaDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjgxYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9vbWFwMjQyMGg0LmMKQEAgLTAsMCArMSw1OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGV4YXMgSW5zdHJ1bWVudHMuCisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDI0MjAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKTsKK3N0YXRpYyB2b2lkIHdhdGNoZG9nX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBwZXJpcGhlcmFsX2VuYWJsZSh2b2lkKTsKK3N0YXRpYyB2b2lkIG11eFNldHVwVUFSVDEodm9pZCk7CitzdGF0aWMgdTMyICBnZXRfY3B1X3Jldih2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSAodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIKKwkJCQkJICAic3VicyAlMCwgJTEsICMxXG4iCisJCQkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIiAobG9vcHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBib2FyZF9pbml0CisgKiBEZXNjcmlwdGlvbjogRWFybHkgaGFyZHdhcmUgaW5pdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisjaWZkZWYgQ0ZHX1NEUkFNX0REUgordm9pZAorY29uZmlnX3NkcmFtX2Rkcih1MzIgcmV2KQoreworCS8qIGJhbGwgRDExLCBtb2RlIDAgKi8KKwlfX3Jhd193cml0ZWIoMHgwOCwgMHg0ODAwMDAzMik7CisKKwkvKiBTRFJDX0NTMCBDb25maWd1cmF0aW9uICovCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworCQlfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisJCV9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKwl9IGVsc2UgeworCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKwl9CisKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMSwgU0RSQ19SRlJfQ1RSTCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19BQ1RJTV9DVFJMQV8wX0VTMSwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX0FDVElNX0NUUkxCXzBfRVMxLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCisKKwkvKiAKKwkgKiBDUzAgU0RSQyBNb2RlIFJlZ2lzdGVyCisJICogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkKKwkgKiBTZXJpYWwgbW9kZQorCSAqIENBUyBsYXRlbmN5ID0gMyAKKwkgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAzMiwgU0RSQ19NUl8wKTsKKworIAkvKiBTRFJDIERMTEEgY29udHJvbCByZWdpc3RlciAqLworCS8qIERlbGF5IGlzIDkwIGRlZ3JlZXMgKi8KKwlpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKSB7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDIsIFNEUkNfRExMQV9DVFJMKTsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMiwgU0RSQ19ETExCX0NUUkwpOworCX0gZWxzZSB7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDgsIFNEUkNfRExMQV9DVFJMKTsJLy8gRVMyLngKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwOCwgU0RSQ19ETExCX0NUUkwpOwkvLyBFUzIueAorCX0KKworfQorI2VuZGlmIC8vIENGR19TRFJBTV9ERFIKKworCisjaWZkZWYgQ0ZHX1NEUkFNX0NPTUJPIAordm9pZAorY29uZmlnX3NkcmFtX2NvbWJvKHUzMiByZXYpCit7CisKKwl1MzIgZGxsY3RybD0wOworCisgICAgICAgIC8qIGJhbGwgQzEyLCBtb2RlIDAgKi8KKyAgICAgICAgX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTEpOworICAgICAgICAvKiBiYWxsIEQxMSwgbW9kZSAwICovCisgICAgICAgIF9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMyKTsKKyAgICAgICAgLyogYmFsbCBCMTMsIG1vZGUgMCAtIGZvciBDS0UxIChub3QgbmVlZGVkIHJrdyBmb3IgY29tYm8pICovCisgICAgICAgIF9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMGEzKTsKKworICAgICAgICAvKmNvbmZpZ3VyZSBzZHJjIDMyIGJpdCBmb3IgQ09NQk8gZGRyIHNkcmFtLiBJc3N1ZSBzb2Z0IHJlc2V0ICovCisgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDAwMDEyLCBTRFJDX1NZU0NPTkZJRyk7CisgICAgICAgIGRlbGF5KDIwMDAwMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDAwMDEwLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKiBTRFJDVHJpU3RhdGU6IG5vIFRyaXMgKi8KKyAgICAgICAgLyogQ1MwTXV4Q2ZnOiAwMDAgKDMyLWJpdCBTRFJBTSBvbiBEMzEuLjApICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisKKyAgICAgICAgLyogQ1MwIFNEUkMgTWVtb3J5IENvbmZpZ3VyYXRpb24sICovCisgICAgICAgIC8qIEREUi1TRFJBTSwgRXh0ZXJuYWwgU0RSQU0gaXMgeDMyYml0LCAqLworICAgICAgICAvKiBDb25maWd1cmUgdG8gTVVYOTogMXg4TWJ4MzIgICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX0NPTUJPX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxLCBTRFJDX1JGUl9DVFJMKTsKKworICAgICAgICAvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCisgICAgICAgIC8qIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKyAgICAgICAgLyogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkgKi8KKyAgICAgICAgLyogU2VyaWFsIG1vZGUgKi8KKyAgICAgICAgLyogQ0FTIGxhdGVuY3kgPSAzICAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX01SXzBfRERSLCBTRFJDX01SXzApOworCisgICAgICAgIC8qIENTMSBTRFJDIE1lbW9yeSBDb25maWd1cmF0aW9uLCAqLworICAgICAgICAvKiBERFItU0RSQU0sIEV4dGVybmFsIFNEUkFNIGlzIHgzMmJpdCwgKi8KKyAgICAgICAgLyogQ29uZmlndXJlIHRvIE1VWDk6IDF4OE1ieDMyICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX0NPTUJPX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMSk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEFfMF8xMDBNSHosIFNEUkNfQUNUSU1fQ1RSTEFfMSk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8xKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMSwgMHg2ODAwOTBkNCk7CisKKyAgICAgICAgLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzEpOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMSk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzEpOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8xKTsKKworICAgICAgICAvKiBDUzEgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisJLyogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkgKi8KKyAgICAgICAgLyogU2VyaWFsIG1vZGUgKi8KKyAgICAgICAgLyogQ0FTIGxhdGVuY3kgPSAzICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMSk7CisKKyAgICAgICAgLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICAgICAgLyogRGVsYXkgaXMgOTAgZGVncmVlcyAqLworCWlmIChyZXYgPT0gQ1BVXzI0MlhfRVMxKQorCQlkbGxjdHJsID0gKEJJVDB8QklUMyk7CisJZWxzZQorCQlkbGxjdHJsID0gQklUMDsJCQorCisgICAgICAgIGlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpIHsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwNiwgU0RSQ19ETExBX0NUUkwpOworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEFfQ1RSTCk7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzA2LCBTRFJDX0RMTEJfQ1RSTCk7IC8qIGxvYWQgY3RyIHZhbHVlICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQl9DVFJMKTsgLyogbG9jayBhbmQgZ28gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQV9DVFJMKTsgICAvLyBFUzIueAorICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAmIH4oTE9BRERMTHxkbGxjdHJsKSwgU0RSQ19ETExBX0NUUkwpOyAvLyBFUzIueAorICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExCX0NUUkwpOyAgIC8vIEVTMi54ID8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwgJiB+KExPQURETEx8ZGxsY3RybCksIFNEUkNfRExMQl9DVFJMKTsgLy8gRVMyLngKKyAgICAgICAgfQorfQorCisjZW5kaWYgLy8gQ0ZHX1NEUkFNX0NPTUJPCisKKyNpZmRlZiBDRkdfU0RSQU1fU0RSIAordm9pZAorY29uZmlnX3NkcmFtX3Nkcih1MzIgcmV2KQoreworCXUzMiBkbGxjdHJsPTA7CisKKwkvKiBiYWxsIEQxMSwgbW9kZSAwICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzIpOworCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMTIsIFNEUkNfU1lTQ09ORklHKTsKKwlkZWxheSgyMDAwMDApOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDEwLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKiBDaGlwLWxldmVsIHNoYXJlZCBpbnRlcmZhY2UgbWFuYWdlbWVudCAqLworCS8qIFNEUkNUcmlTdGF0ZTogbm8gVHJpcyAqLworCS8qIENTME11eENmZzogMDAwICgzMi1iaXQgU0RSQU0gb24gRDMxLi4wKSAqLworCS8qIENTMU11eENmZzogMDAwICgzMi1iaXQgU0RSQU0gb24gRDMxLi4wKSAqLworCWlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpCisJCV9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKwllbHNlCisJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCS8qIENTMCBTRFJDIE1lbW9yeSBDb25maWd1cmF0aW9uLCAqLworCS8qIEREUi1TRFJBTSwgRXh0ZXJuYWwgU0RSQU0gaXMgeDMyYml0LCAqLworCS8qIENvbmZpZ3VyZSB0byBNVVgxNDogMzJNYngzMiAqLworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfTURDRkdfMF9TRFIsIFNEUkNfTUNGR18wKTsgLyogZGlmZiBmcm9tIGNvbWJvIGNhc2UgKi8KKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxLCBTRFJDX1JGUl9DVFJMKTsKKworCS8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKyAKKwkvKiBDUzAgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisJLyogQnVyc3QgbGVuZ3RoID0gMiAtIFNEUiBtZW1vcnkgKi8KKwkvKiBTZXJpYWwgbW9kZSAqLworCS8qIENBUyBsYXRlbmN5ID0gMyAgKi8KKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX01SXzBfU0RSLCBTRFJDX01SXzApOyAgLyogZGlmZiBmcm9tIGNvbWJvIGNhc2UgKi8KKworCS8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCS8qIERlbGF5IGlzIDkwIGRlZ3JlZXMgKi8KKworCWlmIChyZXYgPT0gQ1BVXzI0MlhfRVMxKQorICAgICAgICAgICAgICAgIGRsbGN0cmwgPSAoQklUMHxCSVQzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRsbGN0cmwgPSBCSVQwOworCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwNiwgU0RSQ19ETExBX0NUUkwpOworCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExBX0NUUkwpOworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzA2LCBTRFJDX0RMTEJfQ1RSTCk7IC8qIGxvYWQgY3RyIHZhbHVlICovCisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEJfQ1RSTCk7IC8qIGxvY2sgYW5kIGdvICovCisJfQorCWVsc2UgeworCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQV9DVFJMKTsJLy8gRVMyLngKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICYgfihMT0FERExMfGRsbGN0cmwpLCBTRFJDX0RMTEFfQ1RSTCk7CS8vIEVTMi54CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEJfQ1RSTCk7CS8vIEVTMi54CisJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAmIH4oTE9BRERMTHxkbGxjdHJsKSwgU0RSQ19ETExCX0NUUkwpOwkvLyBFUzIueAorCX0KKyAgIAorfQorI2VuZGlmIC8vIENGR19TRFJBTV9TRFIKKworI2lmZGVmIENGR19TRFJBTV9TVEFDS0VEIAordm9pZAorY29uZmlnX3NkcmFtX3N0YWNrZWQodTMyIHJldikKK3sKKworCS8qIFBpbiBNdXhpbmcgZm9yIFNEUkMgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMSk7CS8qIG11eCBtb2RlIDAgKENTMSkgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMyk7CS8qIG11eCBtb2RlIDAgKENLRTEpICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzIpOwkvKiBjb25uZWN0IHNkcmNfYTEyICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzEpOwkvKiBjb25uZWN0IHNkcmNfYTEzICovCisKKwkvKiBjb25maWd1cmUgc2RyYyAzMiBiaXQgZm9yIENPTUJPIGRkciBzZHJhbSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDEwLCBTRFJDX1NZU0NPTkZJRyk7CS8qIG5vIGlkbGUgYWNrIGFuZCBSRVNFVCBlbmFibGUgKi8KKwlkZWxheSgyMDAwMDApOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDEwLCBTRFJDX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgbW9kZSAqLworCisJLyogU0RSQ19TSEFSSU5HICovCisJLyogVS1ib290IGlzIHdyaXRpbmcgMHgwMDAwMDEwMCB0aG91Z2ggKEg0XzI0MjBfU0RSQ19TSEFSSU5HICkgKi8KKwkvL19fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCV9fcmF3X3dyaXRlbCgweDAwMDA0OTAwLCBTRFJDX1NIQVJJTkcpOworCisJLyogU0RSQ19DUzAgQ29uZmlndXJhdGlvbiAqLworCS8qIE5vbmUgZm9yIEVTMi4xICovCisKKwkvKiAgU0RSQ19DUzEgQ29uZmlndXJhdGlvbiAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAwLCBTRFJDX0NTX0NGRyk7CS8qIFJlbWFwIENTMSB0byAweDgwMDAwMDAwICovCisKKwkvKiBEaXNhYmxlIHBvd2VyIGRvd24gb2YgQ0tFICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwODUsIFNEUkNfUE9XRVIpOworCisJX19yYXdfd3JpdGVsKDB4MDFBMDIwMTksIFNEUkNfTUNGR18xKTsJLyogU0RSQ19NQ0ZHMSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDNERDAzLCBTRFJDX1JGUl9DVFJMMSk7CS8qIFNEUkNfUkZSX0NUUkwxICovCisJX19yYXdfd3JpdGVsKDB4OTJEREM0ODUsIFNEUkNfQUNUSU1fQ1RSTEFfMSk7CS8qIFNEUkNfQUNUSU1fQ1RSTEEwICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMTQsIFNEUkNfQUNUSU1fQ1RSTEJfMSk7CS8qIFNEUkNfQUNUSU1fQ1RSTEIwICovCisKKwkvKk1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzEpOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8xKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8xKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8xKTsKKworCS8qIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKwkvKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeSAqLworCS8qIFNlcmlhbCBtb2RlICovCisJLyogQ0FTIGxhdGVuY3kgPSAzICAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDMyLCBTRFJDX01SXzEpOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDIwLCBTRFJDX0VNUjJfMSk7CS8qIHdlYWstc3RyZW5ndGggZHJpdmVyICovCisKKyAJLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkvKiBEZWxheSBpcyA5MCBkZWdyZWVzICovCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEFfQ1RSTCk7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQl9DVFJMKTsKKwl9CisJZWxzZSB7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDMxMDgsIFNEUkNfRExMQV9DVFJMKTsJLy8gRVMyLngKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMzEwOCwgU0RSQ19ETExCX0NUUkwpOwkvLyBFUzIueAorCX0KK30KKyNlbmRpZiAvLyBDRkdfU0RSQU1fU1RBQ0tFRAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc19pbml0CisgKiBEZXNjcmlwdGlvbjogRG9lcyBlYXJseSBzeXN0ZW0gaW5pdCBvZiBtdXhpbmcgYW5kIGNsb2Nrcy4KKyAqIC0gQ2FsbGVkIGF0IHRpbWUgd2hlbiBvbmx5IHN0YWNrIGlzIGF2YWlsYWJsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHNfaW5pdChpbnQgc2tpcCkKK3sKKwl1MzIgICByZXY7CisKKwlyZXYgPSBnZXRfY3B1X3JldigpOworCisJd2F0Y2hkb2dfaW5pdCgpOworCW11eFNldHVwVUFSVDEoKTsKKwlkZWxheSgxMDApOworCisJLypEUExMIG91dCA9IDJ4IERQTEwgLS0+IGNvcmUgY2xvY2sgKi8KKwlfX3Jhd193cml0ZWwoRFBMTF9PVVQsIENNX0NMS1NFTDJfUExMKTsKKworCS8qRFBMTCBpbnRvIGxvdyBwb3dlciBieXBhc3MgKG90aGVycyBvZmYpICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDEsIENNX0NMS0VOX1BMTCk7CisKKwkvKk1QVSBjb3JlIGNsb2NrID0gQ29yZSAvMiA9IDMwMCAqLworCV9fcmF3X3dyaXRlbChNUFVfRElWLCBDTV9DTEtTRUxfTVBVKTsKKworCS8qRFNQaWY9MjAwLCBEU1BpZj0xMDAsIElWQT0yMDAgKi8KKwlfX3Jhd193cml0ZWwoRFNQX0RJViwgQ01fQ0xLU0VMX0RTUCk7CisKKwkvKkdGWCBjbG9jayAoTDMvMikgNTBNSHogKi8KKwlfX3Jhd193cml0ZWwoR0ZYX0RJViwgQ01fQ0xLU0VMX0dGWCk7CisKKwkvKkwzPTEwMCwgTDQ9MTAwLCBEaXNwbGF5U1M9NTAgVmx5bmM9OTZNaHosc3NpPTEwMCwgdXNiPTUwICovCisJX19yYXdfd3JpdGVsKEJVU19ESVYsIENNX0NMS1NFTDFfQ09SRSk7CisKKwkvKjEyTUh6IGFwbGwgc3JjLCAxMi8oMSsxKSo1MD0zMDAgKi8KKwlfX3Jhd193cml0ZWwoRFBMTF9WQUwsIENNX0NMS1NFTDFfUExMKTsKKworCS8qVmFsaWQgdGhlIGNvbmZpZ3VyYXRpb24gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMSwgUFJDTV9DTEtDRkdfQ1RSTCk7CisJZGVsYXkoMTAwMCk7CisKKwkvKkVuYWJsZSBEUExMPTMwMCwgOTZNSHogQVBMTCBsb2NrZWQuICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMEYsIENNX0NMS0VOX1BMTCk7CisJZGVsYXkoMjAwMDAwKTsKKworI2lmZGVmIENGR19TRFJBTV9ERFIKKwljb25maWdfc2RyYW1fZGRyKHJldik7CisjZWxpZiBkZWZpbmVkKENGR19TRFJBTV9DT01CTykKKwljb25maWdfc2RyYW1fY29tYm8ocmV2KTsKKyNlbGlmIGRlZmluZWQoQ0ZHX1NEUkFNX1NEUikKKwljb25maWdfc2RyYW1fc2RyKHJldik7CisjZWxpZiBkZWZpbmVkKENGR19TRFJBTV9TVEFDS0VEKQorCWNvbmZpZ19zZHJhbV9zdGFja2VkKHJldik7CisjZWxzZQorI2Vycm9yIFNEUkFNIHR5cGUgbm90IHN1cHBvcnRlZAorI2VuZGlmCQorCisJZGVsYXkoMjAwMDApOworCXBlcmlwaGVyYWxfZW5hYmxlKCk7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbWlzY19pbml0X3IKKyAqIERlc2NyaXB0aW9uOiBJbml0IGV0aGVybmV0IChkb25lIGhlcmUgc28gdWRlbGF5IHdvcmtzKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworI2RlZmluZSBHUCAoQklUOHxCSVQ5KQorCisJLyogVGhlcmUgYXJlIDQgd2F0Y2ggZG9ncy4gIDEgc2VjdXJlLCBhbmQgMyBnZW5lcmFsIHB1cnBvc2UuCisJICogSSB3b3VsZCBleHBlY3QgdGhhdCB0aGUgUk9NIHRha2VzIGNhcmUgb2YgdGhlIHNlY3VyZSBvbmUsCisJICogYnV0IHdlIHdpbGwgdHJ5IGFsc28uICBPZiB0aGUgMyBHUCBvbmVzLCAxIGNhbiByZXNldCB1cworCSAqIGRpcmVjdGx5LCB0aGUgb3RoZXIgMiBvbmx5IGdlbmVyYXRlIE1QVSBpbnRlcnJ1cHRzLgorCSAqLworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxICxXRDJfQkFTRStXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiAsV0QyX0JBU0UrV1NQUik7CisKKyNpZiBNUFVfV0RfQ0xPQ0tFRCAvKiB2YWx1ZSAweDEwIHN0aWNrIG9uIGFwdGl4LCBCSVQ0IHBvbGFyaXR5IHNlZW1zIG9wcHNpdGUqLworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxICxXRDNfQkFTRStXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEM19CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiAsV0QzX0JBU0UrV1NQUik7CisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSAsV0Q0X0JBU0UrV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDRfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIgLFdENF9CQVNFK1dTUFIpOworI2VuZGlmCisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZStXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZHJhbV9pbml0CisgKiBEZXNjcmlwdGlvbjogc2V0cyB1Ym9vdHMgaWRlYSBvZiBzZHJhbSBzaXplCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkcmFtX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBlcmlwaGVyYWxfZW5hYmxlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHYsIGlmX2Nsa3M9MCwgZnVuY19jbGtzPTA7CisKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiovCisJaWZfY2xrcyB8PSBCSVQ0OworCWZ1bmNfY2xrcyB8PSBCSVQ0OworCXYgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUwyX0NPUkUpIHwgMHg0OwkvKiBTeXNfY2xrIGlucHV0IE9NQVAyNDIwX0dQVDIgKi8KKwlfX3Jhd193cml0ZWwodiwgQ01fQ0xLU0VMMl9DT1JFKTsKKwlfX3Jhd193cml0ZWwoMHgxLCBDTV9DTEtTRUxfV0tVUCk7CisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9jayAqLworCWZ1bmNfY2xrcyB8PSBCSVQyMTsKKwlpZl9jbGtzIHw9IEJJVDIxOworI2VuZGlmCisJdiA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTjFfQ09SRSkgfCBpZl9jbGtzOwkvKiBJbnRlcmZhY2UgY2xvY2tzIG9uICovCisJX19yYXdfd3JpdGVsKHYsQ01fSUNMS0VOMV9DT1JFICk7CisJdiA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTjFfQ09SRSkgfCBmdW5jX2Nsa3M7IC8qIEZ1bmN0aW9uYWwgQ2xvY2tzIG9uICovCisJX19yYXdfd3JpdGVsKHYsIENNX0ZDTEtFTjFfQ09SRSk7CisJZGVsYXkoMTAwMCk7CisKKyNpZm5kZWYgS0VSTkVMX1VQREFURUQKKwl7CisjZGVmaW5lIFYxIDB4ZmZmZmZmZmYKKyNkZWZpbmUgVjIgMHgwMDAwMDAwNworCisJCV9fcmF3X3dyaXRlbChWMSwgQ01fRkNMS0VOMV9DT1JFKTsKKwkJX19yYXdfd3JpdGVsKFYyLCBDTV9GQ0xLRU4yX0NPUkUpOworCQlfX3Jhd193cml0ZWwoVjEsIENNX0lDTEtFTjFfQ09SRSk7CisJCV9fcmF3X3dyaXRlbChWMSwgQ01fSUNMS0VOMl9DT1JFKTsKKwl9CisjZW5kaWYKKworfQorCisvKiBQaW4gTXV4aW5nIHJlZ2lzdGVycyB1c2VkIGZvciBVQVJUMSAqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDFfQ1RTICAgICAgICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKTB4NDgwMDAwQzUpCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMV9SVFMgICAgICAgKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopMHg0ODAwMDBDNikKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQxX1RYICAgICAgICAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikweDQ4MDAwMEM3KQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDFfUlggICAgICAgICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKTB4NDgwMDAwQzgpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbXV4U2V0dXBVQVJUMSAgKG9zdGJvb3QpCisgKiBEZXNjcmlwdGlvbjogU2V0IHVwIHVhcnQxIG11eGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbXV4U2V0dXBVQVJUMSh2b2lkKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICpNdXhDb25maWdSZWc7CisKKwkvKiBVQVJUMV9DVFMgcGluIGNvbmZpZ3VyYXRpb24sIFBJTiA9IEQyMSAqLworCU11eENvbmZpZ1JlZyA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopQ09OVFJPTF9QQURDT05GX1VBUlQxX0NUUzsKKwkqTXV4Q29uZmlnUmVnID0gMHgwMCA7IC8qIE1vZGUgPSAwLCBQVVBEPURpc2FibGVkICovCisKKwkvKiBVQVJUMV9SVFMgcGluIGNvbmZpZ3VyYXRpb24sIFBJTiA9IEgyMSAqLworCU11eENvbmZpZ1JlZyA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopQ09OVFJPTF9QQURDT05GX1VBUlQxX1JUUzsKKwkqTXV4Q29uZmlnUmVnID0gMHgwMCA7IC8qIE1vZGUgPSAwLCBQVVBEPURpc2FibGVkICovCisKKwkvKiBVQVJUMV9UWCBwaW4gY29uZmlndXJhdGlvbiwgUElOID0gTDIwICovCisJTXV4Q29uZmlnUmVnID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilDT05UUk9MX1BBRENPTkZfVUFSVDFfVFg7CisJKk11eENvbmZpZ1JlZyA9IDB4MDAgOyAvKiBNb2RlID0gMCwgUFVQRD1EaXNhYmxlZCAqLworCisJLyogVUFSVDFfUlggcGluIGNvbmZpZ3VyYXRpb24sIFBJTiA9IFQyMSAqLworCU11eENvbmZpZ1JlZyA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopQ09OVFJPTF9QQURDT05GX1VBUlQxX1JYOworCSpNdXhDb25maWdSZWcgPSAweDAwIDsgLyogTW9kZSA9IDAsIFBVUEQ9RGlzYWJsZWQgKi8KK30KKworaW50IG5hbmRfaW5pdCh2b2lkKQoreworCXUzMglyZXY7CisKKwlyZXYgPSBnZXRfY3B1X3JldigpOworCisKKwkvKiBHUE1DIHBpbiBtdXhpbmcgKi8gCisJKCoodm9sYXRpbGUgaW50KikweDQ4MDAwMDcwKSAmPSAweDAwMDAwMEZGOworCSgqKHZvbGF0aWxlIGludCopMHg0ODAwMDA3NCkgJj0gMHgwMDAwMDAwMDsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NDgwMDAwNzgpICY9IDB4MDAwMDAwMDA7CisJKCoodm9sYXRpbGUgaW50KikweDQ4MDAwMDdDKSAmPSAweDAwMDAwMDAwOworCSgqKHZvbGF0aWxlIGludCopMHg0ODAwMDA4MCkgJj0gMHhGRjAwMDAwMDsKKworCS8qIEdQTUNfSU9fRElSICovCisJKCoodm9sYXRpbGUgaW50KikweDQ4MDAwMDhDKSA9IDB4MTkwMDAwMDA7CisKKwkvKiBHUE1DIENvbmZpZ3VyYXRpb24gKi8KKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwMTApID0gMHgwMDAwMDAwQTsKKwl3aGlsZSAoKCgqKHZvbGF0aWxlIGludCAqKTB4NjgwMEEwMTQpICYgMHgwMDAwMDAwMSkgPT0gMCk7CisKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNTApID0gMHgwMDAwMDAwMTsJCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDYwKSA9IDB4MDAwMDE4MDA7CQorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA2NCkgPSAweDAwMTQxNDAwOwkKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNjgpID0gMHgwMDE0MTQwMDsJCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDZDKSA9IDB4MEYwMTBGMDE7CQorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA3MCkgPSAweDAxMEMxNDE0OworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA3NCkgPSAweDAwMDAwQTgwOworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA3OCkgPSAweDAwMDAwQzQ0OyAJLy9iYXNlIDB4MDQwMDAwMDAKKworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTBBOCkgPSAweDAwMDAwMDAwOworCWRlbGF5KDEwMDApOworI2lmZGVmIENGR19TRFJBTV9TVEFDS0VECisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDkwKSA9IDB4MDAwMTEwMDA7CisjZWxzZQorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA5MCkgPSAweDAwMDExMjAwOworI2VuZGlmCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDk0KSA9IDB4MDAxZjFmMDA7CisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDk4KSA9IDB4MDAwODA4MDI7CisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDlDKSA9IDB4MUMwOTFDMDk7CisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMEEwKSA9IDB4MDMxQTFGMUY7CisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMEE0KSA9IDB4MDAwMDAzQzI7CisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMEE4KSA9IDB4MDAwMDBGNDg7CisKKwlpZiAocmV2ICE9IENQVV8yNDIwXzI0MjJfRVMxKQorCQkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNDApID0gMHgxRkYwOwkvLyBlczIueAorCisgCWlmIChuYW5kX2NoaXAoKSl7CisJCXByaW50ZigiVW5zdXBwb3J0ZWQgQ2hpcCFcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2NwdV9yZXYodm9pZCkKK3sKKyAgICAgICAgdTMyIHY7CisgICAgICAgIHYgPSBfX3Jhd19yZWFkbChUQVBfSURDT0RFX1JFRyk7CisgICAgICAgIHYgPSB2ID4+IDI4OworICAgICAgICByZXR1cm4odisxKTsgIC8qIGN1cnJlbnRseSAyNDIyIGFuZCAyNDIwIG1hdGNoIHVwICovCit9CisKKy8qIG9wdGlvbmFsbHkgZG8gc29tZXRoaW5nIGxpa2UgYmxpbmtpbmcgTEVEICovCit2b2lkIGJvYXJkX2hhbmcgKHZvaWQpCit7fQorCisKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzM3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L3BsYXRmb3JtLlMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAyNDIwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWZkZWYgQ09ORklHX1BBUlRJQUxfU1JBTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLyAKKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBQUkNNX0NMS0NGR19DVFJMIC0gYWRkciBvZiB2YWxpZCByZWcKKyAqICBSMSA9IENNX0NMS0VOX1BMTCAtIGFkZHIgZHBsbCBjdGxyIHJlZworICogIFIyID0gZHBsbCB2YWx1ZQorICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN1YiAgICAgc3AsIHNwLCAjMHg0IC8qIGdldCBzb21lIHN0YWNrIHNwYWNlICovCisgICAgICAgIHN0ciAgICAgcjQsIFtzcF0gICAgIC8qIHNhdmUgcjQncyB2YWx1ZSAqLworCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByOCwgcGxsX2N0bF9hZGQKKyAgICAgICAgbW92ICAgICByNCwgIzB4MgorICAgICAgICBzdHIgICAgIHI0LCBbcjhdCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9zdGF0CitibG9jazoKKyAgICAgICAgbGRyICAgICByOCwgW3I0XQkvKiB3YWl0IGZvciBieXBhc3MgdG8gdGFrZSBlZmZlY3QgKi8KKyAgICAgICAgYW5kICAgICByOCwgcjgsICMweDMKKyAgICAgICAgY21wICAgICByOCwgIzB4MQorICAgICAgICBibmUgICAgIGJsb2NrCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI0LCBwbGxfZGl2X2FkZAorCWxkciAgICAgcjgsIHBsbF9kaXZfdmFsCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKyAgICAKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI0LCBjZmczXzBfYWRkcgorICAgICAgICBsZHIgICAgIHI4LCBjZmczXzBfdmFsCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKyAgICAgICAgbGRyICAgICByNCwgY2ZnNF8wX2FkZHIKKyAgICAgICAgbGRyICAgICByOCwgY2ZnNF8wX3ZhbAorICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisgICAgICAgIGxkciAgICAgcjQsIGNmZzFfMF9hZGRyCisgICAgICAgIGxkciAgICAgcjgsIFtyNF0KKyAgICAgICAgb3JyICAgICByOCwgcjgsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisKKwkvKiBzZXR1cCB0byAyeCBsb29wIHRob3VnaCBjb2RlLiAgVGhlIGZpcnN0IGxvb3AgcHJlLWxvYWRzIHRoZSAKKyAgICAgICAgICogaWNhY2hlLCB0aGUgMm5kIGNvbW1pdHMgdGhlIHByY20gY29uZmlnLCBhbmQgbG9ja3MgdGhlIGRwbGwKKyAgICAgICAgICovCisgICAgICAgIG1vdiAgICAgcjQsICMweDEwMDAgICAgICAvKiBzcGluIHNwaW4gc3BpbiAqLworICAgICAgICBtb3YgICAgIHI4LCAjMHg0ICAgICAgICAgLyogZmlyc3QgcGFzcyBjb25kaXRpb24gJiBzZXQgcmVnaXN0ZXJzICovCisgICAgICAgIGNtcCAgICAgcjgsICMweDQKKzI6CisgICAgICAgIGxkcm5lICAgcjgsIFtyM10gICAgICAgICAvKiBEUExMIGxvY2sgY2hlY2sgKi8KKyAgICAgICAgYW5kICAgICByOCwgcjgsICMweDcKKyAgICAgICAgY21wICAgICByOCwgIzB4MgorICAgICAgICBiZXEgICAgIDRmCiszOgorICAgICAgICBzdWJlcSAgIHI4LCByOCwgIzB4MQorICAgICAgICBzdHJlcSAgIHI4LCBbcjBdICAgICAgICAgLyogY29tbWl0IGRpdmlkZXJzICgybmQgdGltZSkgKi8KKyAgICAgICAgbm9wCitsbG9vcDE6CisgICAgICAgIHN1YiAgICAgcjQsIHI0LCAjMHgxICAgIC8qIExvb3AgY3VycmVudGx5IG5lY2Vzc2FyeSBlbHNlIGJhZCBqdW1wcyAqLworICAgICAgICBub3AKKyAgICAgICAgY21wICAgICByNCwgIzB4MAorICAgICAgICBibmUgICAgIGxsb29wMQorICAgICAgICBtb3YgICAgIHI0LCAjMHg0MDAwMAorICAgICAgICBjbXAgICAgIHI4LCAjMHgxCisgICAgICAgIG5vcAorICAgICAgICBzdHJlcSAgIHIyLCBbcjFdICAgICAgICAvKiBsb2NrIGRwbGwgKDJuZCB0aW1lKSAqLworICAgICAgICBub3AKK2xsb29wMjoKKyAgICAgICAgc3ViICAgICByNCwgcjQsICMweDEgICAgLyogbG9vcCBjdXJyZW50bHkgbmVjZXNzYXJ5IGVsc2UgYmFkIGp1bXBzICovCisgICAgICAgIG5vcAorICAgICAgICBjbXAgICAgIHI0LCAjMHgwCisgICAgICAgIGJuZSAgICAgbGxvb3AyCisgICAgICAgIG1vdiAgICAgcjQsICMweDQwMDAwCisgICAgICAgIGNtcCAgICAgcjgsICMweDEKKyAgICAgICAgbm9wCisgICAgICAgIGxkcmVxICAgcjgsIFtyM10gICAgICAgICAvKiBnZXQgbG9jayBjb25kaXRpb24gZm9yIGRwbGwgKi8KKyAgICAgICAgY21wICAgICByOCwgIzB4NCAgICAgICAgIC8qIGZpcnN0IHRpbWUgdGhvdWdoPyAqLworICAgICAgICBibmUgICAgIDJiCisgICAgICAgIG1vdmVxICAgcjgsICMweDIgICAgICAgICAvKiBzZXQgdG8gZHBsbCBjaGVjayBjb25kaXRpb24uICovCisgICAgICAgIGJlcSAgICAgM2IgICAgICAgICAgICAgICAvKiBpZiBjb25kaXRpb24gbm90IHRydWUgYnJhbmNoICovCis0OiAgCisgICAgICAgIGxkciAgICAgcjQsIFtzcF0KKyAgICAgICAgYWRkICAgICBzcCwgc3AsICMweDQgICAgIC8qIHJldHVybiBzdGFjayBzcGFjZSAqLworICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLyAgICAgICAgCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCitjZmczXzBfYWRkcjoKKyAgICAud29yZCAgR1BNQ19DT05GSUczXzAKK2NmZzNfMF92YWw6IAorICAgIC53b3JkICBTTU5BTkRfR1BNQ19DT05GSUczCitjZmc0XzBfYWRkcjoKKyAgICAud29yZCAgR1BNQ19DT05GSUc0XzAKK2NmZzRfMF92YWw6CisgICAgLndvcmQgIFNNTkFORF9HUE1DX0NPTkZJRzQKK2NmZzFfMF9hZGRyOgorICAgIC53b3JkICBHUE1DX0NPTkZJRzFfMAorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfc3RhdDoKKyAgICAud29yZCBDTV9JRExFU1RfQ0tHRU4KK3BsbF9kaXZfYWRkOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMIAorcGxsX2Rpdl92YWw6CisgICAgLndvcmQgRFBMTF9WQUwJLyogRFBMTCBzZXR0aW5nICgzMDBNSHogZGVmYXVsdCkgKi8KKyNlbmRpZiAgICAgICAgICAgIAorCisuZ2xvYmwgcGxhdGZvcm1zZXR1cAorcGxhdGZvcm1zZXR1cDoKKwltb3YgcjMsIHIwICAgICAvKiBzYXZlIHNraXAgaW5mb3JtYXRpb24gKi8KKyNpZmRlZiBDT05GSUdfQVBUSVgKKwlsZHIJcjAsCVJFR19TRFJDX01DRkdfMAorCWxkcglyMSwJVkFMX1NEUkNfTUNGR18wCisJc3RyCXIxLAlbcjBdCisJbGRyCXIwLAlSRUdfU0RSQ19NUl8wCisJbGRyCXIxLAlWQUxfU0RSQ19NUl8wCisJc3RyCXIxLAlbcjBdCisJLyogYSBkZHIgbmVlZHMgZW1yMSBzZXQgaGVyZSAqLworCWxkcglyMCwJUkVHX1NEUkNfU0hBUklORworCWxkcglyMSwJVkFMX1NEUkNfU0hBUklORworCXN0cglyMSwJW3IwXQorICAgICAgIAlsZHIJcjAsCVJFR19TRFJDX1JGUl9DVFJMXzAKKwlsZHIJcjEsCVZBTF9TRFJDX1JGUl9DVFJMXzAKKwlzdHIJcjEsCVtyMF0KKworICAgICAgIC8qIGxpdHRsZSBkZWxheSBhZnRlciBpbml0ICovCisgICAgICAgbW92IHIyLCAjMHgxODAwICAgICAgICAgICAgICAgICAgICAgICAgCisxOiAgICAgICAKKyAgICAgICAgc3VicyByMiwgcjIsICMweDEKKyAgICAgICAgYm5lIDFiCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEFSVElBTF9TUkFNCisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgbW92ICAgICByMCwgICAgIHIzICAgICAgLyogcGFzcyBza2lwIGluZm8gdG8gc19pbml0ICovCisgICAgICAgIGJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisjZW5kaWYKKworCS8qIG1hcCBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCWxkcglyMCwJVkFMX0lOVEhfU0VUVVAKKwltY3IJcDE1LCAwLCByMCwgYzE1LCBjMiwgNAorCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1ZBTF9JTlRIX1NFVFVQOgorCS53b3JkIFBFUklGRVJBTF9QT1JUX0JBU0UKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworCisKKworCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjY0Y2E3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC94LWxvYWQubGRzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBKYW51YXJ5IDIwMDQgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgSDQgZGV2aWNlIAorICogQ29weXJpZ2h0IChjKSAyMDA0IFRleGFzIEluc3RydW1lbnRzIAorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L2FybTExMzYvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjOTQxZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gb21hcDI0MzBzZHAubyAKK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjNTA3OAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL2NvbmZpZy5tawpAQCAtMCwwICsxLDI4IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNAorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIFRJIEg0IGJvYXJkIHdpdGggT01BUDI0MjAgKEFSTTExMzYpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzCisjCisjIEg0IGhhcyAxIGJhbmsgb2YgMzJNQiBvciA2NE1CIG1ERFItU0RSQU0gb24gQ1MwCisjIEg0IGhhcyAxIGJhbmsgb2YgMzJNQiBvciAwME1CIG1ERFItU0RSQU0gb24gQ1MxCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisjIEEwMDAvMDAwMCAoYmFuazEpIEVTMiB3aWxsIGJlIGNvbmZpZ3VyYWJsZQorIyBMaW51eC1LZXJuZWwgaXMgZXhwZWN0ZWQgdG8gYmUgYXQgODAwMCc4MDAwLCBlbnRyeSA4MDAwJzgwMDAKKyMgKG1lbSBiYXNlICsgcmVzZXJ2ZWQpCisKKyMgMjQzMCBoNCBoYXMgc2FtZSBtZW0gY29uZmlndXJhdGlvbiBhcyBoNC4KKworIyBGb3IgdXNlIHdpdGggZXh0ZXJuYWwgb3IgaW50ZXJuYWwgYm9vdHMuCisjIENPTkZJR19QQVJUSUFMX1NSQU0gbXVzdCBiZSBkZWZpbmVkIHRvIHVzZSB0aGlzLgorVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIFVzZWQgd2l0aCBmdWxsIFNSQU0gYm9vdC4KKyMgVGhpcyBpcyBlaXRoZXIgd2l0aCBhIEdQIHN5c3RlbSBvciBhIHNpZ25lZCBib290IGltYWdlLgorIyBlYXNpZXN0LCBhbmQgc2FmZXN0IHdheSB0byBnbyBpZiB5b3UgY2FuLgorIyBDb21tZW50IG91dCAvL0NPTkZJR19QQVJUSUFMX1NSQU0gZm9yIHRoaXMgb25lLgorIworI1RFWFRfQkFTRSA9IDB4NDAyODAwMDAKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvb21hcDI0MzBzZHAuYyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL29tYXAyNDMwc2RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhN2I0MgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL29tYXAyNDMwc2RwLmMKQEAgLTAsMCArMSw3NDYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNQorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAyNDMwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK3N0YXRpYyB2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpOworc3RhdGljIHZvaWQgd2F0Y2hkb2dfaW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIHBlcmlwaGVyYWxfZW5hYmxlKHZvaWQpOworc3RhdGljIHZvaWQgbXV4U2V0dXBBbGwodm9pZCk7CitzdGF0aWMgdTMyICBnZXRfY3B1X3Jldih2b2lkKTsKK3N0YXRpYyB1MzIgIGdldF9kZXZpY2VfdHlwZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHByY21faW5pdCh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSAodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIKKwkJCQkJICAic3VicyAlMCwgJTEsICMxXG4iCisJCQkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIiAobG9vcHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBib2FyZF9pbml0CisgKiBEZXNjcmlwdGlvbjogRWFybHkgaGFyZHdhcmUgaW5pdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9jcHVfcmV2KHZvaWQpCit7CisgICAgICAgIHUzMiB2OworICAgICAgICB2ID0gX19yYXdfcmVhZGwoVEFQX0lEQ09ERV9SRUcpOworICAgICAgICB2ID0gdiA+PiAyODsKKyAgICAgICAgcmV0dXJuKHYrMSk7ICAvKiBjdXJyZW50bHkgMjQyMiBhbmQgMjQyMCBtYXRjaCB1cCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdldF9kZXZpY2VfdHlwZSgpOiB0ZWxsIGlmIEdQL0hTL0VNVS9UU1QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9kZXZpY2VfdHlwZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChERVZJQ0VfTUFTSyk7CisgICAgICAgIHJldHVybihtb2RlID4+PSA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBIZWxwZXIgZnVuY3Rpb24gdG8gd2FpdCBmb3IgdGhlIHN0YXR1cyBvZiBhIHJlZ2lzdGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKyAgICAgICAgdTMyIGkgPSAwLCB2YWw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBtYXRjaF92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgICAgICBpZiAoaT09Ym91bmQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0gd2hpbGUgKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFN1cHBvcnQgZm9yIG11bHRpcGxlIHR5cGUgb2YgbWVtb3J5IHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBDRkdfU0RSQU1fRERSCit2b2lkCitjb25maWdfc2RyYW1fZGRyKHUzMiByZXYpCit7CisJLyogYmFsbCBEMTEsIG1vZGUgMCAqLworCV9fcmF3X3dyaXRlYigweDA4LCAweDQ4MDAwMDMyKTsKKworCS8qIFNEUkNfQ1MwIENvbmZpZ3VyYXRpb24gKi8KKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19SRlJfQ1RSTF9FUzEsIFNEUkNfUkZSX0NUUkwpOworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfQUNUSU1fQ1RSTEFfMF9FUzEsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19BQ1RJTV9DVFJMQl8wX0VTMSwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCS8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKworCisJLyogCisJICogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlcgorCSAqIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5CisJICogU2VyaWFsIG1vZGUKKwkgKiBDQVMgbGF0ZW5jeSA9IDMgCisJICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMzIsIFNEUkNfTVJfMCk7CisKKyAJLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkvKiBEZWxheSBpcyA5MCBkZWdyZWVzICovCisJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCV9fcmF3X3dyaXRlbCgweDAwMDAwMDA4LCBTRFJDX0RMTEFfQ1RSTCk7CS8vIEVTMi54CisJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCV9fcmF3X3dyaXRlbCgweDAwMDAwMDA4LCBTRFJDX0RMTEJfQ1RSTCk7CS8vIEVTMi54CisKK30KKyNlbmRpZiAvLyBDRkdfU0RSQU1fRERSCisKKyNpZmRlZiBDRkdfU0RSQU1fQ09NQk8gCit2b2lkCitjb25maWdfc2RyYW1fY29tYm8odTMyIHJldikKK3sKKworCXUzMiBkbGxjdHJsPTA7CisKKyAgICAgICAgLyogYmFsbCBDMTIsIG1vZGUgMCAqLworICAgICAgICBfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMSk7CisgICAgICAgIC8qIGJhbGwgRDExLCBtb2RlIDAgKi8KKyAgICAgICAgX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzIpOworICAgICAgICAvKiBiYWxsIEIxMywgbW9kZSAwIC0gZm9yIENLRTEgKG5vdCBuZWVkZWQgcmt3IGZvciBjb21ibykgKi8KKyAgICAgICAgX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTMpOworCisgICAgICAgIC8qY29uZmlndXJlIHNkcmMgMzIgYml0IGZvciBDT01CTyBkZHIgc2RyYW0uIElzc3VlIHNvZnQgcmVzZXQgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDAwMTIsIFNEUkNfU1lTQ09ORklHKTsKKyAgICAgICAgd2FpdF9vbl92YWx1ZShCSVQwLCBCSVQwLCBTRFJDX1NUQVRVUywgMTIwMDAwMDApOyAvKiB3YWl0IHRpbGwgcmVzZXQgZG9uZSBzZXQgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIFNEUkNfU1lTQ09ORklHKTsKKworICAgICAgICAvKiBTRFJDVHJpU3RhdGU6IG5vIFRyaXMgKi8KKyAgICAgICAgLyogQ1MwTXV4Q2ZnOiAwMDAgKDMyLWJpdCBTRFJBTSBvbiBEMzEuLjApICovCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkKKwkgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKwllbHNlCisgICAgICAgCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKworICAgICAgICAvKiBDUzAgU0RSQyBNZW1vcnkgQ29uZmlndXJhdGlvbiwgKi8KKyAgICAgICAgLyogRERSLVNEUkFNLCBFeHRlcm5hbCBTRFJBTSBpcyB4MzJiaXQsICovCisgICAgICAgIC8qIENvbmZpZ3VyZSB0byBNVVg5OiAxeDhNYngzMiAgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfQ09NQk9fTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJCisJLyogVGhpcyBpcyByZXFkIG9ubHkgZm9yIEVTMSAqLworCWlmIChyZXYgPT0gQ1BVXzI0MlhfRVMxKQorICAgICAgICAJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19SRlJfQ1RSTF9FUzEsIFNEUkNfUkZSX0NUUkwpOworCisgICAgICAgIC8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlkZWxheSg1MDAwKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisKKyAgICAgICAgLyogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlciAqLworICAgICAgICAvKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeSAqLworICAgICAgICAvKiBTZXJpYWwgbW9kZSAqLworICAgICAgICAvKiBDQVMgbGF0ZW5jeSA9IDMgICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMCk7CisKKyAgICAgICAgLyogQ1MxIFNEUkMgTWVtb3J5IENvbmZpZ3VyYXRpb24sICovCisgICAgICAgIC8qIEREUi1TRFJBTSwgRXh0ZXJuYWwgU0RSQU0gaXMgeDMyYml0LCAqLworICAgICAgICAvKiBDb25maWd1cmUgdG8gTVVYOTogMXg4TWJ4MzIgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfQ09NQk9fTURDRkdfMF9ERFIsIFNEUkNfTUNGR18xKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQV8wXzEwME1IeiwgU0RSQ19BQ1RJTV9DVFJMQV8xKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzEpOworCS8qIFRoaXMgaXMgcmVxZCBvbmx5IGZvciBFUzEgKi8KKwlpZiAocmV2ID09IENQVV8yNDJYX0VTMSkKKyAgICAgICAgCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxLCAweDY4MDA5MGQ0KTsKKworICAgICAgICAvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX05PUCwgMHg2ODAwOTBkOCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCAweDY4MDA5MGQ4KTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgMHg2ODAwOTBkOCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIDB4NjgwMDkwZDgpOworCisgICAgICAgIC8qIENTMSBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKwkvKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeSAqLworICAgICAgICAvKiBTZXJpYWwgbW9kZSAqLworICAgICAgICAvKiBDQVMgbGF0ZW5jeSA9IDMgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjJfU0RSQ19NUl8wX0REUiwgMHg2ODAwOTBiNCk7CisKKyAgICAgICAgLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICAgICAgLyogRGVsYXkgaXMgOTAgZGVncmVlcyAqLworCisJaWYgKHJldiA9PSBDUFVfMjQyWF9FUzEpCisJCWRsbGN0cmwgPSAoQklUMHxCSVQzKTsKKwllbHNlCisJCWRsbGN0cmwgPSBCSVQwOwkJCisKKyAgICAgICAgaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzA2LCBTRFJDX0RMTEFfQ1RSTCk7CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQV9DVFJMKTsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDYsIFNEUkNfRExMQl9DVFJMKTsgLyogbG9hZCBjdHIgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExCX0NUUkwpOyAvKiBsb2NrIGFuZCBnbyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExBX0NUUkwpOyAgIC8vIEVTMi54CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICYgfihMT0FERExMfGRsbGN0cmwpLCBTRFJDX0RMTEFfQ1RSTCk7ICAgLy8gRVMyLngKKyAgICAgICAgICAgICAgIC8vIF9fcmF3X3dyaXRlbCgweDAwMDA5ODA4LCBTRFJDX0RMTEFfQ1RSTCk7ICAgLy8gRVMyLngKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQl9DVFJMKTsgICAvLyBFUzIueCA/CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICYgfihMT0FERExMfGRsbGN0cmwpLCBTRFJDX0RMTEJfQ1RSTCk7ICAgLy8gRVMyLngKKyAgICAgICAgICAgICAgICAvL19fcmF3X3dyaXRlbCgweDAwMDA5ODA4LCBTRFJDX0RMTEJfQ1RSTCk7ICAgLy8gRVMyLngKKyAgICAgICAgfQorfQorCisjZW5kaWYgLy8gQ0ZHX1NEUkFNX0NPTUJPCisKKyNpZmRlZiBDRkdfMjQzMFNEUkFNX0REUgordm9pZAorY29uZmlnXzI0MzBzZHJhbV9kZHIodTMyIHJldikKK3sKKwl1MzIgZGxsc3RhdCwgZGxsY3RybDsKKworICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwMDAxMiwgU0RSQ19TWVNDT05GSUcpOworICAgICAgICB3YWl0X29uX3ZhbHVlKEJJVDAsIEJJVDAsIFNEUkNfU1RBVFVTLCAxMjAwMDAwMCk7IC8qIHdhaXQgdGlsbCByZXNldCBkb25lIHNldCAqLworICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgU0RSQ19TWVNDT05GSUcpOworCisJLyogQ2hpcC1sZXZlbCBzaGFyZWQgaW50ZXJmYWNlIG1hbmFnZW1lbnQgKi8KKwkvKiBTRFJDVHJpU3RhdGU6IG5vIFRyaXMgKi8KKwkvKiBDUzBNdXhDZmc6IDAwMCAoMzItYml0IFNEUkFNIG9uIEQzMS4uMCkgKi8KKwkvKiBDUzFNdXhDZmc6IDAwMCAoMzItYml0IFNEUkFNIG9uIEQzMS4uMCkgKi8KKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwkvKiBDUzAgU0RSQyBNZW1vcnkgQ29uZmlndXJhdGlvbiwgKi8KKwkvKiBERFItU0RSQU0sIEV4dGVybmFsIFNEUkFNIGlzIHgzMmJpdCwgKi8KKwkvKiBDb25maWd1cmUgdG8gTVVYMTQ6IDMyTWJ4MzIgKi8KKwlfX3Jhd193cml0ZWwoU0RQXzI0MzBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCV9fcmF3X3dyaXRlbChTRFBfMjQzMF9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19SRlJfQ1RSTCwgU0RSQ19SRlJfQ1RSTCk7CisKKwkvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlkZWxheSg1MDAwKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisgCisJLyogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlciAqLworCS8qIEJ1cnN0IGxlbmd0aCA9IDIgLSBTRFIgbWVtb3J5ICovCisJLyogU2VyaWFsIG1vZGUgKi8KKwkvKiBDQVMgbGF0ZW5jeSA9IDMgICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8wKTsKKworCS8qIFNldCB1cCBTRFJDIERMTCB2YWx1ZXMgZm9yIDI0MzAgRERSICovCisJZGxsY3RybCA9IChTRFBfMjQzMF9TRFJDX0RMTEFCX0NUUkwgJiB+QklUMik7IC8qIHNldCB0YXJnZXQgY3RybCB2YWwgKi8KKwlfX3Jhd193cml0ZWwoZGxsY3RybCwgU0RSQ19ETExBX0NUUkwpOwkvKiBzZXQgbG9jayBtb2RlICovCisJX19yYXdfd3JpdGVsKGRsbGN0cmwsIFNEUkNfRExMQl9DVFJMKTsJLyogc2V0IGxvY2sgbW9kZSAqLworCWRlbGF5KDB4MTAwMCk7IC8qIHRpbWUgdG8gdHJhY2sgdG8gY2VudGVyICovCQorCWRsbHN0YXQgPSBfX3Jhd19yZWFkbChTRFJDX0RMTEFfU1RBVFVTKSAmIDB4RkYwMDsgLyogZ2V0IHN0YXR1cyAqLworCWRsbGN0cmwgPSAoZGxsY3RybCAmIDB4MDBGRikgfCBkbGxzdGF0IHwgQklUMjsgLyogYnVpbGQgdW5sb2NrIHZhbHVlICovCisJX19yYXdfd3JpdGVsKGRsbGN0cmwsIFNEUkNfRExMQV9DVFJMKTsJLyogc2V0IHVubG9jayBtb2RlICovCisJX19yYXdfd3JpdGVsKGRsbGN0cmwsIFNEUkNfRExMQl9DVFJMKTsJLyogc2V0IHVubG9jayBtb2RlICovCit9CisjZW5kaWYgLy8gQ0ZHXzI0MzBTRFJBTV9ERFIKKworI2lmZGVmIENGR19TRFJBTV9TVEFDS0VEIAordm9pZAorY29uZmlnX3NkcmFtX3N0YWNrZWQodTMyIHJldikKK3sKKworCS8qIFBpbiBNdXhpbmcgZm9yIFNEUkMgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMSk7CS8qIG11eCBtb2RlIDAgKENTMSkgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMyk7CS8qIG11eCBtb2RlIDAgKENLRTEpICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzIpOwkvKiBjb25uZWN0IHNkcmNfYTEyICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzEpOwkvKiBjb25uZWN0IHNkcmNfYTEzICovCisKKwkvKiBjb25maWd1cmUgc2RyYyAzMiBiaXQgZm9yIENPTUJPIGRkciBzZHJhbSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDEwLCBTRFJDX1NZU0NPTkZJRyk7CS8qIG5vIGlkbGUgYWNrIGFuZCBSRVNFVCBlbmFibGUgKi8KKwlkZWxheSgyMDAwMDApOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDEwLCBTRFJDX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgbW9kZSAqLworCisJLyogU0RSQ19TSEFSSU5HICovCisJLyogVS1ib290IGlzIHdyaXRpbmcgMHgwMDAwMDEwMCB0aG91Z2ggKEg0XzI0MjBfU0RSQ19TSEFSSU5HICkgKi8KKwkvL19fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCV9fcmF3X3dyaXRlbCgweDAwMDA0OTAwLCBTRFJDX1NIQVJJTkcpOworCisJLyogU0RSQ19DUzAgQ29uZmlndXJhdGlvbiAqLworCS8qIE5vbmUgZm9yIEVTMi4xICovCisKKwkvKiAgU0RSQ19DUzEgQ29uZmlndXJhdGlvbiAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAwLCBTRFJDX0NTX0NGRyk7CS8qIFJlbWFwIENTMSB0byAweDgwMDAwMDAwICovCisKKwkvKiBEaXNhYmxlIHBvd2VyIGRvd24gb2YgQ0tFICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwODUsIFNEUkNfUE9XRVIpOworCisJX19yYXdfd3JpdGVsKDB4MDFBMDIwMTksIFNEUkNfTUNGR18xKTsJLyogU0RSQ19NQ0ZHMSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDNERDAzLCBTRFJDX1JGUl9DVFJMMSk7CS8qIFNEUkNfUkZSX0NUUkwxICovCisJX19yYXdfd3JpdGVsKDB4OTJEREM0ODUsIFNEUkNfQUNUSU1fQ1RSTEFfMSk7CS8qIFNEUkNfQUNUSU1fQ1RSTEEwICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMTQsIFNEUkNfQUNUSU1fQ1RSTEJfMSk7CS8qIFNEUkNfQUNUSU1fQ1RSTEIwICovCisKKwkvKk1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIDB4NjgwMDkwRDgpOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAxLCAweDY4MDA5MEQ4KTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMiwgMHg2ODAwOTBEOCk7CisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDIsIDB4NjgwMDkwRDgpOworCisJLyogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlciAqLworCS8qIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5ICovCisJLyogU2VyaWFsIG1vZGUgKi8KKwkvKiBDQVMgbGF0ZW5jeSA9IDMgICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMzIsIDB4NjgwMDkwQjQpOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDIwLCAweDY4MDA5MEJDKTsJLyogd2Vhay1zdHJlbmd0aCBkcml2ZXIgKi8KKworIAkvKiBTRFJDIERMTEEgY29udHJvbCByZWdpc3RlciAqLworCS8qIERlbGF5IGlzIDkwIGRlZ3JlZXMgKi8KKwlpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKSB7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQV9DVFJMKTsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExCX0NUUkwpOworCX0KKwllbHNlIHsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMzEwOCwgU0RSQ19ETExBX0NUUkwpOwkvLyBFUzIueAorCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDAzMTA4LCBTRFJDX0RMTEJfQ1RSTCk7CS8vIEVTMi54CisJfQorfQorI2VuZGlmIC8vIENGR19TRFJBTV9TVEFDS0VECisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa19zcGVlZCAtIGRldGVybWluZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZAorICogIGJhc2VkIG9uIGtub3duIDMya0h6IGNsb2NrIGFuZCBncHRpbWVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X29zY19jbGtfc3BlZWQodTMyICpzaGlmdCkKK3sKKyNkZWZpbmUgR1BUX0VOICAoKDA8PDIpfEJJVDF8QklUMCkgICAgICAvKiBlbmFibGUgc3lzX2NsayBOTy1wcmVzY2FsZSAvMSAqLworI2RlZmluZSBHUFRfQ1RSIE9NQVAyNFhYX0dQVDIrVENSUiAgICAgIC8qIHJlYWQgY291bnRlciBhZGRyZXNzICovCisgICAgICAgIHUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgdmFsOworCXVuc2lnbmVkIGludCB2LCBpZl9jbGtzPTAsIGZ1bmNfY2xrcz0wIDsKKworCisKKyAgICAgICAgaWYoX19yYXdfcmVhZGwoUFJDTV9DTEtTUkNfQ1RSTCkgJiBCSVQ3KXsgICAgLyogaWYgY3VycmVudGx5IC8yICovCisgICAgICAgICAgICAgICAgKnNoaWZ0ID0gMTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgKnNoaWZ0ID0gMDsKKyAgICAgICAgfQorCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTDJfQ09SRSkgfCAweDQ7ICAgICAgLyogbWFzayBmb3Igc3lzX2NsayB1c2UgKi8KKwlfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUwyX0NPUkUpOyAgICAgICAgICAgIC8qIHRpbWVyMiBzb3VyY2UgdG8gc3lzX2NsayAqLworCV9fcmF3X3dyaXRlbChCSVQ0LCBDTV9JQ0xLRU4xX0NPUkUpOyAgICAgICAgICAgLyogdGltZXIyIGludGVyZmFjZSBjbG9jayBvbiAqLworCV9fcmF3X3dyaXRlbChCSVQ0LCBDTV9GQ0xLRU4xX0NPUkUpOyAgICAgICAgICAgLyogdGltZXIyIGZ1bmN0aW9uIGNsb2NrIG9uICovCisJLyogRW5hYmxlIEdQMiB0aW1lci4qLworCWlmX2Nsa3MgfD0gQklUNDsKKwlmdW5jX2Nsa3MgfD0gQklUNDsKKwl2ID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOMV9DT1JFKSB8IGlmX2Nsa3M7CS8qIEludGVyZmFjZSBjbG9ja3Mgb24gKi8KKwlfX3Jhd193cml0ZWwodixDTV9JQ0xLRU4xX0NPUkUgKTsKKwl2ID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOMV9DT1JFKSB8IGZ1bmNfY2xrczsgLyogRnVuY3Rpb25hbCBDbG9ja3Mgb24gKi8KKwlfX3Jhd193cml0ZWwodiwgQ01fRkNMS0VOMV9DT1JFKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKDAsIE9NQVAyNFhYX0dQVDIrVExEUik7ICAgICAgICAgICAvKiBzdGFydCBjb3VudGluZyBhdCAwICovCisgICAgICAgIF9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAyNFhYX0dQVDIrVENMUik7ICAgICAgLyogZW5hYmxlIGNsb2NrICovCisgICAgICAgIC8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8gICAgICAgICAgICAgICAgICAgICAgLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKyAgICAgICAgLyogZGV0ZXJtaW5lIHN5c19jbGsgdmlhIGdhdWdpbmcgKi8KKyAgICAgICAgc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOyAgICAgICAgICAgICAvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyovCisgICAgICAgIHdoaWxlKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOyAgICAgICAgICAgLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworICAgICAgICBjc3RhcnQgPSBfX3Jhd19yZWFkbChHUFRfQ1RSKTsgICAgICAgICAgICAgICAgIC8qIGdldCBzdGFydCBzeXNfY2xrIGNvdW50ICovCisgICAgICAgIHdoaWxlKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgKHN0YXJ0KzIwKSk7ICAgICAgLyogd2FpdCBmb3IgNDAgY3ljbGVzICovCisgICAgICAgIGNlbmQgPSBfX3Jhd19yZWFkbChHUFRfQ1RSKTsgICAgICAgICAgICAgICAgICAgLyogZ2V0IGVuZCBzeXNfY2xrIGNvdW50ICovCisgICAgICAgIGNkaWZmID0gY2VuZCAtIGNzdGFydDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKyAgICAgICAgLyogYmFzZWQgb24gbnVtYmVyIG9mIHRpY2tzIGFzc2lnbiBzcGVlZCAqLworICAgICAgICBpZihjZGlmZiA+ICgxOTAwMCA+PiAqc2hpZnQpKQorICAgICAgICAgICAgICAgIHJldHVybihTMzhfNE0pOworICAgICAgICBlbHNlIGlmIChjZGlmZiA+ICgxNTIwMCA+PiAqc2hpZnQpKQorICAgICAgICAgICAgICAgIHJldHVybihTMjZNKTsKKyAgICAgICAgZWxzZSBpZiAoY2RpZmYgPiAoMTMwMDAgPj4gKnNoaWZ0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4oUzI0TSk7CisgICAgICAgIGVsc2UgaWYgKGNkaWZmID4gKDkwMDAgPj4gKnNoaWZ0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4oUzE5XzJNKTsKKyAgICAgICAgZWxzZSBpZiAoY2RpZmYgPiAoNzYwMCA+PiAqc2hpZnQpKQorICAgICAgICAgICAgICAgIHJldHVybihTMTNNKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybihTMTJNKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHJjbV9pbml0KCkgLSBpbml0cyBjbG9ja3MgZm9yIFBSQ00gYXMgZGVmaW5lZCBpbiBjbG9ja3MuaCAoY29uZmlnIElJIGRlZmF1bHQpLgorICogICAtLSBjYWxsZWQgZnJvbSBTUkFNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorcHJjbV9pbml0KCkKK3sKKwl1MzIgZGl2LCBzcGVlZCwgdmFsLCBkaXZfYnlfMjsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSQ01fQ0xLU1JDX0NUUkwpICYgfihCSVQxIHwgQklUMCk7CisjaWYgZGVmaW5lZChPTUFQMjQzMF9TUVVBUkVfQ0xPQ0tfSU5QVVQpCisJX19yYXdfd3JpdGVsKHZhbCwgUFJDTV9DTEtTUkNfQ1RSTCk7CisjZWxzZQorCV9fcmF3X3dyaXRlbCgodmFsIHwgQklUMCksIFBSQ01fQ0xLU1JDX0NUUkwpOworI2VuZGlmCisJc3BlZWQgPSBnZXRfb3NjX2Nsa19zcGVlZCgmZGl2X2J5XzIpOworICAgICAgICBpZigoc3BlZWQgPiBTMTlfMk0pICYmICghZGl2X2J5XzIpKXsgLyogaWYgZmFzdCAmJiAvMiBvZmYsIGVuYWJsZSBpdCAqLworICAgICAgICAgICAgICAgIHZhbCA9IH4oQklUNnxCSVQ3KSAmIF9fcmF3X3JlYWRsKFBSQ01fQ0xLU1JDX0NUUkwpOworICAgICAgICAgICAgICAgIHZhbCB8PSAoMHgyIDw8IDYpOyAvKiBkaXZpZGUgYnkgMiBpZiAoMjQsMjYsMzguNCkgLT4gKDEyLzEzLzE5LjIpICAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCh2YWwsIFBSQ01fQ0xLU1JDX0NUUkwpOworICAgICAgICB9CisKKwlfX3Jhd193cml0ZWwoMCwgQ01fRkNMS0VOMV9DT1JFKTsJLyogc3RvcCBhbGwgY2xvY2tzIHRvIHJlZHVjZSByaW5naW5nICovCisJX19yYXdfd3JpdGVsKDAsIENNX0ZDTEtFTjJfQ09SRSk7CS8qIG1heSBub3QgYmUgbmVjZXNzYXJ5ICovCisJX19yYXdfd3JpdGVsKDAsIENNX0lDTEtFTjFfQ09SRSk7CisJX19yYXdfd3JpdGVsKDAsIENNX0lDTEtFTjJfQ09SRSk7CisKKwkvKkRQTEwgaW50byBsb3cgcG93ZXIgYnlwYXNzIChvdGhlcnMgb2ZmKSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAxLCBDTV9DTEtFTl9QTEwpOworCisJX19yYXdfd3JpdGVsKERQTExfT1VULCBDTV9DTEtTRUwyX1BMTCk7IC8qIHNldCBEUExMIG91dCAqLworICAgICAgICBfX3Jhd193cml0ZWwoTVBVX0RJViwgQ01fQ0xLU0VMX01QVSk7ICAgLyogc2V0IE1QVSBkaXZpZGVyICovCisgICAgICAgIF9fcmF3X3dyaXRlbChEU1BfRElWLCBDTV9DTEtTRUxfRFNQKTsgICAvKiBzZXQgZHNwIGFuZCBpdmEgZGl2aWRlcnMgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEdGWF9ESVYsIENNX0NMS1NFTF9HRlgpOyAgIC8qIHNldCBnZnggZGl2aWRlcnMgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKE1ETV9ESVYsIENNX0NMS1NFTF9NRE0pOyAgIC8qIHNldCBtZG0gZGl2aWRlcnMgKi8KKworCWRpdiA9IEJVU19ESVY7CisJX19yYXdfd3JpdGVsKGRpdiwgQ01fQ0xLU0VMMV9DT1JFKTsvKiBzZXQgTDMvTDQvVVNCL0Rpc3BsYXkvU1NpIGRpdmlkZXJzICovCisJZGVsYXkoMTAwMCk7CisKKwkvKjEzTUh6IGFwbGwgc3JjLCBQUkNNICd4JyBEUExMIHJhdGUgKi8KKwlfX3Jhd193cml0ZWwoRFBMTF9WQUwsIENNX0NMS1NFTDFfUExMKTsKKworCS8qVmFsaWQgdGhlIGNvbmZpZ3VyYXRpb24gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMSwgUFJDTV9DTEtDRkdfQ1RSTCk7CisJZGVsYXkoMTAwMCk7CisKKwkvKiBzZXQgdXAgQVBMTFNfQ0xLSU4gcGVyIGNyeXN0YWwgKi8KKwlpZiAoc3BlZWQgPiBTMTlfMk0pCisgICAgICAgICAgICAgICAgc3BlZWQgPj49IDE7ICAgIC8qIGlmIGZhc3Qgc2hpZnQgdG8gLzIgcmFuZ2UgKi8KKyAgICAgICAgdmFsID0gKDB4MiA8PCAyMyk7ICAgICAgLyogZGVmYXVsdCB0byAxM01oeiBmb3IgMjQzMGMgKi8KKyAgICAgICAgaWYgKHNwZWVkID09IFMxMk0pCisgICAgICAgICAgICAgICAgdmFsID0gKDB4MyA8PCAyMyk7CisgICAgICAgIGVsc2UgaWYgKHNwZWVkID09IFMxOV8yTSkKKyAgICAgICAgICAgICAgICB2YWwgPSAoMHgwIDw8IDIzKTsKKyAgICAgICAgdmFsIHw9ICh+KEJJVDIzfEJJVDI0fEJJVDI1KSAmIF9fcmF3X3JlYWRsKENNX0NMS1NFTDFfUExMKSk7CisgICAgICAgIF9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTDFfUExMKTsKKworICAgICAgICBfX3Jhd193cml0ZWwoRFBMTF9MT0NLfEFQTExfTE9DSywgQ01fQ0xLRU5fUExMKTsgICAvKiBlbmFibGUgYXBsbCAqLworICAgICAgICB3YWl0X29uX3ZhbHVlKEJJVDgsIEJJVDgsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsvKiB3YWl0IGZvciBhcGxsIGxvY2sgKi8KKworICAgICAgICBkZWxheSgyMDAwMDApOworfQorCit2b2lkIFNFQ19nZW5lcmljKHZvaWQpCit7CisvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKyNkZWZpbmUgVU5MT0NLXzIgMHgwMDAwMDAwMAorI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNICsgMHg2OCk7IC8qIFJFUV9JTkZPX1BFUk1JU1NJT05fMSBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNICsgMHg1MCk7ICAvKiBSRUFEX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNICsgMHg1OCk7ICAvKiBXUklURV9QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSArIDB4NjApOyAvKiBBRERSX01BVENIXzEgTCovCisKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fR1BNQ19CQVNFX0FERFJfQVJNICsgMHg0OCk7IC8qIFJFUV9JTkZPX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX0dQTUNfQkFTRV9BRERSX0FSTSArIDB4NTApOyAvKiBSRUFEX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX0dQTUNfQkFTRV9BRERSX0FSTSArIDB4NTgpOyAvKiBXUklURV9QRVJNSVNTSU9OXzAgTCovCisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX09DTV9SQU1fQkFTRV9BRERSX0FSTSArIDB4NDgpOyAvKiBSRVFfSU5GT19QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0gKyAweDUwKTsgLyogUkVBRF9QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0gKyAweDU4KTsgLyogV1JJVEVfUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNICsgMHg4MCk7ICAvKiBBRERSX01BVENIXzIgTCovCisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg0OCk7IC8qIFJFUV9JTkZPX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4NTApOyAvKiBSRUFEX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4NTgpOyAvKiBXUklURV9QRVJNSVNTSU9OXzAgTCovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB0cnlfdW5sb2NrX3NyYW0oKQorICogRGVzY3JpcHRpb246IElmIGNoaXAgaXMgR1AgdHlwZSwgdW5sb2NrIHRoZSBTUkFNIGZvciBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHJ5X3VubG9ja19zcmFtKHZvaWQpCit7CisgICAgICAgIGludCBtb2RlOworCisgICAgICAgIC8qIGlmIEdQIGRldmljZSB1bmxvY2sgZGV2aWNlIFNSQU0gZm9yIGdlbmVyYWwgdXNlICovCisgICAgICAgIG1vZGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKworICAgICAgICBpZiAoKG1vZGUgPT0gR1BfREVWSUNFKSB8fCAobW9kZSA9PSBIU19ERVZJQ0UpIHx8IChtb2RlID09IEVNVV9ERVZJQ0UpCisgICAgICAgICAgICB8fCAobW9kZSA9PSBUU1RfREVWSUNFKSkgeworICAgICAgICAgICAgICAgIC8qIFNlY3VyZSBvciBFbXVsYXRpb24gZGV2aWNlIC0gSFMvRS9UICovCisgICAgICAgICAgICAgICAgU0VDX2dlbmVyaWMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzX2luaXQKKyAqIERlc2NyaXB0aW9uOiBEb2VzIGVhcmx5IHN5c3RlbSBpbml0IG9mIG11eGluZyBhbmQgY2xvY2tzLgorICogLSBDYWxsZWQgYXQgdGltZSB3aGVuIG9ubHkgc3RhY2sgaXMgYXZhaWxhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBzX2luaXQoaW50IHNraXApCit7CisgICAgICAgIHUzMiAgIHJldjsKKworICAgICAgICByZXYgPSBnZXRfY3B1X3JldigpOworCisgICAgICAgIHdhdGNoZG9nX2luaXQoKTsKKwl0cnlfdW5sb2NrX3NyYW0oKTsgICAKKyAgICAgICAgbXV4U2V0dXBBbGwoKTsKKyAgICAgICAgZGVsYXkoMTAwKTsKKwlwcmNtX2luaXQoKTsKKworI2lmZGVmIENGR19TRFJBTV9ERFIKKyAgICAgICAgY29uZmlnX3NkcmFtX2RkcihyZXYpOworI2VsaWYgZGVmaW5lZChDRkdfU0RSQU1fQ09NQk8pCisgICAgICAgIGNvbmZpZ19zZHJhbV9jb21ibyhyZXYpOworI2VsaWYgZGVmaW5lZChDRkdfMjQzMFNEUkFNX0REUikKKyAgICAgICAgY29uZmlnXzI0MzBzZHJhbV9kZHIocmV2KTsKKyNlbGlmIGRlZmluZWQoQ0ZHX1NEUkFNX1NUQUNLRUQpCisgICAgICAgIGNvbmZpZ19zZHJhbV9zdGFja2VkKHJldik7CisjZWxzZQorI2Vycm9yIFNEUkFNIHR5cGUgbm90IHN1cHBvcnRlZAorI2VuZGlmCisKKyAgICAgICAgZGVsYXkoMjAwMDApOworICAgICAgICBwZXJpcGhlcmFsX2VuYWJsZSgpOworICAgICAgICByZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBtaXNjX2luaXRfcgorICogRGVzY3JpcHRpb246IEluaXQgZXRoZXJuZXQgKGRvbmUgaGVyZSBzbyB1ZGVsYXkgd29ya3MpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisjZGVmaW5lIEdQIChCSVQ4fEJJVDkpCisKKwkvKiBUaGVyZSBhcmUgNCB3YXRjaCBkb2dzLiAgMSBzZWN1cmUsIGFuZCAzIGdlbmVyYWwgcHVycG9zZS4KKwkgKiBJIHdvdWxkIGV4cGVjdCB0aGF0IHRoZSBST00gdGFrZXMgY2FyZSBvZiB0aGUgc2VjdXJlIG9uZSwKKwkgKiBidXQgd2Ugd2lsbCB0cnkgYWxzby4gIE9mIHRoZSAzIEdQIG9uZXMsIDEgY2FuIHJlc2V0IHVzCisJICogZGlyZWN0bHksIHRoZSBvdGhlciAyIG9ubHkgZ2VuZXJhdGUgTVBVIGludGVycnVwdHMuCisJICovCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEgLFdEMl9CQVNFK1dTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syICxXRDJfQkFTRStXU1BSKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKwlkbyB7CisJCXBlbmRpbmcgPSBfX3Jhd19yZWFkbCh3ZF9iYXNlK1dXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkcmFtX2luaXQKKyAqIERlc2NyaXB0aW9uOiBzZXRzIHVib290cyBpZGVhIG9mIHNkcmFtIHNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogcGVyaXBoZXJhbF9lbmFibGUKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUgdGhlIGNsa3MgJiBwb3dlciBmb3IgcGVyaWZzIChHUFQyLCBVQVJUMSwuLi4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGVyaXBoZXJhbF9lbmFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdiwgaWZfY2xrcz0wLCBpZl9jbGtzMiA9IDAsIGZ1bmNfY2xrcz0wLCBmdW5jX2Nsa3MyID0gMDsKKworCS8qIEVuYWJsZSBHUDIgdGltZXIuKi8KKwlpZl9jbGtzIHw9IEJJVDQ7CisJZnVuY19jbGtzIHw9IEJJVDQ7CisJdiA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTDJfQ09SRSkgfCAweDQ7CS8qIFN5c19jbGsgaW5wdXQgT01BUDI0WFhfR1BUMiAqLworCV9fcmF3X3dyaXRlbCh2LCBDTV9DTEtTRUwyX0NPUkUpOworCV9fcmF3X3dyaXRlbCgweDEsIENNX0NMS1NFTF9XS1VQKTsKKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrICovCisJZnVuY19jbGtzIHw9IEJJVDIxOworCWlmX2Nsa3MgfD0gQklUMjE7CisjZW5kaWYKKwl2ID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOMV9DT1JFKSB8IGlmX2Nsa3M7CS8qIEludGVyZmFjZSBjbG9ja3Mgb24gKi8KKwlfX3Jhd193cml0ZWwodixDTV9JQ0xLRU4xX0NPUkUgKTsKKwl2ID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOMl9DT1JFKSB8IGlmX2Nsa3MyOyAgICAvKiBJbnRlcmZhY2UgY2xvY2tzIG9uICovCisgICAgICAgIF9fcmF3X3dyaXRlbCh2LCBDTV9JQ0xLRU4yX0NPUkUpOworCXYgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU4xX0NPUkUpIHwgZnVuY19jbGtzOyAvKiBGdW5jdGlvbmFsIENsb2NrcyBvbiAqLworCV9fcmF3X3dyaXRlbCh2LCBDTV9GQ0xLRU4xX0NPUkUpOworCXYgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU4yX0NPUkUpIHwgZnVuY19jbGtzMjsgIC8qIEZ1bmN0aW9uYWwgQ2xvY2tzIG9uICovCisgICAgICAgIF9fcmF3X3dyaXRlbCh2LCBDTV9GQ0xLRU4yX0NPUkUpOworCWRlbGF5KDEwMDApOworCit9CisKKy8qIERvIHBpbiBtdXhpbmcgZm9yIGFsbCB0aGUgZGV2aWNlcyB1c2VkIGluIFgtTG9hZGVyICovCisjZGVmaW5lIE1VWF9WQUwoT0ZGU0VULFZBTFVFKVwKKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWIoVkFMVUUsIE9NQVAyNFhYX0NUUkxfQkFTRSArIE9GRlNFVCk7CitzdGF0aWMgdm9pZCBtdXhTZXR1cEFsbCh2b2lkKQoreworCS8qIFVBUlQgMSovCisJTVVYX1ZBTCgweDAwQjEsIDB4MUIpICAgICAgICAvKiB1YXJ0MV9jdHMtIEVOLCBISSwgMywgLT5ncGlvXzMyICovCisJTVVYX1ZBTCgweDAwQjIsIDB4MUIpICAgICAgICAvKiB1YXJ0MV9ydHMtIEVOLCBISSwgMywgLT5ncGlvXzggKi8KKwlNVVhfVkFMKDB4MDBCMywgMHgxQikgICAgICAgIC8qIHVhcnQxX3R4LSBFTiwgSEksIDMsIC0+Z3Bpb185ICovCisJTVVYX1ZBTCgweDAwQjQsIDB4MUIpICAgICAgICAvKiB1YXJ0MV9yeC0gRU4sIEhJLCAzLCAtPmdwaW9fMTAgKi8KKwlNVVhfVkFMKDB4MDEwNywgMHgwMSkgICAgICAgIC8qIHNzaTFfZGF0X3R4LSBEaXMsIDEsIC0+dWFydDFfdHggKi8KKwlNVVhfVkFMKDB4MDEwOCwgMHgwMSkgICAgICAgIC8qIHNzaTFfZmxhZ190eC0gRGlzLCAxLCAtPnVhcnQxX3J0cyAqLworCU1VWF9WQUwoMHgwMTA5LCAweDAxKSAgICAgICAgLyogc3NpMV9yZHlfdHgtIERpcywgMSwgLT51YXJ0MV9jdHMgKi8KKwlNVVhfVkFMKDB4MDEwQSwgMHgwMSkgICAgICAgIC8qIHNzaTFfZGF0X3J4LSBEaXMsIDEsIC0+dWFydDFfcnggKi8KKworCS8qIE11eCBzZXR0aW5ncyBmb3IgU0RSQyAqLworCU1VWF9WQUwoMHgwMDU0LCAweDFCKSAgICAgICAgLyogc2RyY19hMTQgLSBFTiwgSEksIDMsIC0+Z3Bpb18wICovCisJTVVYX1ZBTCgweDAwNTUsIDB4MUIpICAgICAgICAvKiBzZHJjX2ExMyAtIEVOLCBISSwgMywgLT5ncGlvXzEgKi8KKwlNVVhfVkFMKDB4MDA1NiwgMHgwMCkgICAgICAgIC8qIHNkcmNfYTEyIC0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwNDYsIDB4MDApICAgICAgICAvKiBzZHJjX25jczEgLSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDA0OCwgMHgwMCkgICAgICAgIC8qIHNkcmNfY2tlMSAtIERpcywgMCAqLworCS8qIEdQTUMgKi8KKwlNVVhfVkFMKDB4MDAzMCwgMHgwMCkgICAgICAgIC8qIGdwbWNfY2xrIC0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwMzIsIDB4MDApICAgICAgICAvKiBncG1jX25jczEtIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDMzLCAweDAwKSAgICAgICAgLyogZ3BtY19uY3MyLSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDAzNCwgMHgwMykgICAgICAgIC8qIGdwbWNfbmNzMy0gRGlzLCAzLCAtPmdwaW9fMjQgKi8KKwlNVVhfVkFMKDB4MDAzNSwgMHgwMykgICAgICAgIC8qIGdwbWNfbmNzNC0gRGlzLCAzLCAtPmdwaW9fMjUgKi8KKwlNVVhfVkFMKDB4MDAzNiwgMHgwMCkgICAgICAgIC8qIGdwbWNfbmNzNS0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwMzcsIDB4MDMpICAgICAgICAvKiBncG1jX25jczYtIERpcywgMywgLT5ncGlvXzI3ICovCisJTVVYX1ZBTCgweDAwMzgsIDB4MDApICAgICAgICAvKiBncG1jX25jczctIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDQwLCAweDE4KSAgICAgICAgLyogZ3BtY193YWl0MS0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwNDEsIDB4MTgpICAgICAgICAvKiBncG1jX3dhaXQyLSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDA0MiwgMHgxQikgICAgICAgIC8qIGdwbWNfd2FpdDMtIEVOLCBISSwgMywgLT5ncGlvXzM1ICovCisJTVVYX1ZBTCgweDAwODUsIDB4MUIpICAgICAgICAvKiBncG1jX2ExMC0gRU4sIEhJLCAzLCAtPmdwaW9fMyAqLworfQorCitpbnQgbmFuZF9pbml0KHZvaWQpCit7CisJdTMyCXJldjsKKworCS8qIEdQTUMgQ29uZmlndXJhdGlvbiAqLworCXJldiAgPSBnZXRfY3B1X3JldigpOworCisJLyogZ2xvYmFsIHNldHRpbmdzICovCisJX19yYXdfd3JpdGVsKDB4MTAsIEdQTUNfU1lTQ09ORklHKTsJLyogc21hcnQgaWRsZSAqLworCV9fcmF3X3dyaXRlbCgweDAsIEdQTUNfSVJRRU5BQkxFKTsJLyogaXNyJ3Mgc291cmNlcyBtYXNrZWQgKi8KKwlfX3Jhd193cml0ZWwoMCwgR1BNQ19USU1FT1VUX0NPTlRST0wpOy8qIHRpbWVvdXQgZGlzYWJsZSAqLworI2lmZGVmIENGR19OQU5ECisJX19yYXdfd3JpdGVsKDB4MDAxLCBHUE1DX0NPTkZJRyk7CS8qIHNldCBuV1AsIGRpc2FibGUgbGltaXRlZCBhZGRyICovCisjZW5kaWYKKworCS8qIFNldCB0aGUgR1BNQyBWYWxzIC4gRm9yIE5BTkQgYm9vdCBvbiAyNDMwU0RQLCBOQU5EIGlzIG1hcHBlZCBhdCBDUzAKKyAgICAgICAgICogICwgTk9SIGF0IENTMSBhbmQgTVBEQiBhdCBDUzUuIEFuZCBvbmVOQU5EIGJvb3QsIHdlIG1hcCBvbmVOQU5EIGF0IENTMC4KKwkgKiAgV2UgY29uZmlndXJlIG9ubHkgR1BNQyBDUzAgd2l0aCByZXF1aXJlZCB2YWx1ZXMuIENvbmZpZ2lyaW5nIG90aGVyIGRldmljZXMgCisJICogIGF0IG90aGVyIENTIGluIGRvbmUgaW4gdS1ib290IGFueXdheS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBib3RoZXIgZG9pbmcgaXQgaGVyZS4KKyAgICAgICAgICovCisJX19yYXdfd3JpdGVsKDAsIEdQTUNfQ09ORklHN18wKTsKKwlzZGVsYXkoMTAwMCk7CisKKyNpZmRlZiBDRkdfTkFORAorCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxXzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHMiwgR1BNQ19DT05GSUcyXzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczXzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0XzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHNSwgR1BNQ19DT05GSUc1XzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2XzApOworCisjZWxzZSAvKiBDRkdfT05FTkFORCAqLworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMV8wKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzJfMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczXzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNF8wKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzVfMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2XzApOworI2VuZGlmCisKKwkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworCV9fcmF3X3dyaXRlbCgoICgoT01BUDI0WFhfR1BNQ19DUzBfU0laRSAmIDB4Rik8PDgpIHwKKwkJICAgICAoKE9NQVAyNFhYX0dQTUNfQ1MwX01BUD4+MjQpICYgMHgzRikgfAorCQkgICAgICgxPDw2KSApLCBHUE1DX0NPTkZJRzdfMCk7CisJc2RlbGF5KDIwMDApOworI2lmZGVmIENGR19OQU5ECisgCWlmIChuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisjZWxzZQorCWlmIChvbmVuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorCQlwcmludGYoIk9uZU5BTkQgVW5zdXBwb3J0ZWQgIVxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorCisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyogb3B0aW9uYWxseSBkbyBzb21ldGhpbmcgbGlrZSBibGlua2luZyBMRUQgKi8KK3ZvaWQgYm9hcmRfaGFuZyAodm9pZCkKK3sgd2hpbGUgKDApIHt9O30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMjFkN2UKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA1CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAyNDMwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLyAKKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBQUkNNX0NMS0NGR19DVFJMIC0gYWRkciBvZiB2YWxpZCByZWcKKyAqICBSMSA9IENNX0NMS0VOX1BMTCAtIGFkZHIgZHBsbCBjdGxyIHJlZworICogIFIyID0gZHBsbCB2YWx1ZQorICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN1YiAgICAgc3AsIHNwLCAjMHg0IC8qIGdldCBzb21lIHN0YWNrIHNwYWNlICovCisgICAgICAgIHN0ciAgICAgcjQsIFtzcF0gICAgIC8qIHNhdmUgcjQncyB2YWx1ZSAqLworCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByOCwgcGxsX2N0bF9hZGQKKyAgICAgICAgbW92ICAgICByNCwgIzB4MgorICAgICAgICBzdHIgICAgIHI0LCBbcjhdCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9zdGF0CitibG9jazoKKyAgICAgICAgbGRyICAgICByOCwgW3I0XQkvKiB3YWl0IGZvciBieXBhc3MgdG8gdGFrZSBlZmZlY3QgKi8KKyAgICAgICAgYW5kICAgICByOCwgcjgsICMweDMKKyAgICAgICAgY21wICAgICByOCwgIzB4MQorICAgICAgICBibmUgICAgIGJsb2NrCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI0LCBwbGxfZGl2X2FkZAorCWxkciAgICAgcjgsIHBsbF9kaXZfdmFsCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKyAgICAKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI0LCBmbGFzaF9jZmczX2FkZHIKKyAgICAgICAgbGRyICAgICByOCwgZmxhc2hfY2ZnM192YWwKKyAgICAgICAgc3RyICAgICByOCwgW3I0XQorICAgICAgICBsZHIgICAgIHI0LCBmbGFzaF9jZmc0X2FkZHIKKyAgICAgICAgbGRyICAgICByOCwgZmxhc2hfY2ZnNF92YWwKKyAgICAgICAgc3RyICAgICByOCwgW3I0XQorICAgICAgICBsZHIgICAgIHI0LCBmbGFzaF9jZmcxX2FkZHIKKyAgICAgICAgbGRyICAgICByOCwgW3I0XQorICAgICAgICBvcnIgICAgIHI4LCByOCwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKworCS8qIHNldHVwIHRvIDJ4IGxvb3AgdGhvdWdoIGNvZGUuICBUaGUgZmlyc3QgbG9vcCBwcmUtbG9hZHMgdGhlIAorICAgICAgICAgKiBpY2FjaGUsIHRoZSAybmQgY29tbWl0cyB0aGUgcHJjbSBjb25maWcsIGFuZCBsb2NrcyB0aGUgZHBsbAorICAgICAgICAgKi8KKyAgICAgICAgbW92ICAgICByNCwgIzB4MTAwMCAgICAgIC8qIHNwaW4gc3BpbiBzcGluICovCisgICAgICAgIG1vdiAgICAgcjgsICMweDQgICAgICAgICAvKiBmaXJzdCBwYXNzIGNvbmRpdGlvbiAmIHNldCByZWdpc3RlcnMgKi8KKyAgICAgICAgY21wICAgICByOCwgIzB4NAorMjoKKyAgICAgICAgbGRybmUgICByOCwgW3IzXSAgICAgICAgIC8qIERQTEwgbG9jayBjaGVjayAqLworICAgICAgICBhbmQgICAgIHI4LCByOCwgIzB4NworICAgICAgICBjbXAgICAgIHI4LCAjMHgyCisgICAgICAgIGJlcSAgICAgNGYKKzM6CisgICAgICAgIHN1YmVxICAgcjgsIHI4LCAjMHgxCisgICAgICAgIHN0cmVxICAgcjgsIFtyMF0gICAgICAgICAvKiBjb21taXQgZGl2aWRlcnMgKDJuZCB0aW1lKSAqLworICAgICAgICBub3AKK2xsb29wMToKKyAgICAgICAgc3ViICAgICByNCwgcjQsICMweDEgICAgLyogTG9vcCBjdXJyZW50bHkgbmVjZXNzYXJ5IGVsc2UgYmFkIGp1bXBzICovCisgICAgICAgIG5vcAorICAgICAgICBjbXAgICAgIHI0LCAjMHgwCisgICAgICAgIGJuZSAgICAgbGxvb3AxCisgICAgICAgIG1vdiAgICAgcjQsICMweDQwMDAwCisgICAgICAgIGNtcCAgICAgcjgsICMweDEKKyAgICAgICAgbm9wCisgICAgICAgIHN0cmVxICAgcjIsIFtyMV0gICAgICAgIC8qIGxvY2sgZHBsbCAoMm5kIHRpbWUpICovCisgICAgICAgIG5vcAorbGxvb3AyOgorICAgICAgICBzdWIgICAgIHI0LCByNCwgIzB4MSAgICAvKiBsb29wIGN1cnJlbnRseSBuZWNlc3NhcnkgZWxzZSBiYWQganVtcHMgKi8KKyAgICAgICAgbm9wCisgICAgICAgIGNtcCAgICAgcjQsICMweDAKKyAgICAgICAgYm5lICAgICBsbG9vcDIKKyAgICAgICAgbW92ICAgICByNCwgIzB4NDAwMDAKKyAgICAgICAgY21wICAgICByOCwgIzB4MQorICAgICAgICBub3AKKyAgICAgICAgbGRyZXEgICByOCwgW3IzXSAgICAgICAgIC8qIGdldCBsb2NrIGNvbmRpdGlvbiBmb3IgZHBsbCAqLworICAgICAgICBjbXAgICAgIHI4LCAjMHg0ICAgICAgICAgLyogZmlyc3QgdGltZSB0aG91Z2g/ICovCisgICAgICAgIGJuZSAgICAgMmIKKyAgICAgICAgbW92ZXEgICByOCwgIzB4MiAgICAgICAgIC8qIHNldCB0byBkcGxsIGNoZWNrIGNvbmRpdGlvbi4gKi8KKyAgICAgICAgYmVxICAgICAzYiAgICAgICAgICAgICAgIC8qIGlmIGNvbmRpdGlvbiBub3QgdHJ1ZSBicmFuY2ggKi8KKzQ6ICAKKyAgICAgICAgbGRyICAgICByNCwgW3NwXQorICAgICAgICBhZGQgICAgIHNwLCBzcCwgIzB4NCAgICAgLyogcmV0dXJuIHN0YWNrIHNwYWNlICovCisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovICAgICAgICAKKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKyNpZmRlZiBDRkdfT05FTkFORAorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkIEdQTUNfQ09ORklHM18wIAorZmxhc2hfY2ZnM192YWw6IAorICAgIC53b3JkICBPTkVOQU5EX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIEdQTUNfQ09ORklHNF8wCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgT05FTkFORF9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCBHUE1DX0NPTkZJRzFfMAorI2Vsc2UKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCBHUE1DX0NPTkZJRzNfMCAKK2ZsYXNoX2NmZzNfdmFsOiAKKyAgICAud29yZCAgU01OQU5EX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIEdQTUNfQ09ORklHNF8wCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgU01OQU5EX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIEdQTUNfQ09ORklHMV8wCisjZW5kaWYKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX3N0YXQ6CisgICAgLndvcmQgQ01fSURMRVNUX0NLR0VOCitwbGxfZGl2X2FkZDoKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTCAKK3BsbF9kaXZfdmFsOgorICAgIC53b3JkIERQTExfVkFMCS8qIERQTEwgc2V0dGluZyAoMzAwTUh6IGRlZmF1bHQpICovCisKKy5nbG9ibCBwbGF0Zm9ybXNldHVwCitwbGF0Zm9ybXNldHVwOgorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisgICAgICAgIGJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBtYXAgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKwlsZHIJcjAsCVZBTF9JTlRIX1NFVFVQCisJbWNyCXAxNSwgMCwgcjAsIGMxNSwgYzIsIDQKKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitWQUxfSU5USF9TRVRVUDoKKwkud29yZCBQRVJJRkVSQUxfUE9SVF9CQVNFCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMmU4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC94LWxvYWQubGRzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBKYW51YXJ5IDIwMDQgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgSDQgZGV2aWNlIAorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgVGV4YXMgSW5zdHJ1bWVudHMgCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvYXJtMTEzNi9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDc4YjhhMwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworT0JKUwk6PSBvbWFwMzQzMHNkcC5vCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNmFkNmM1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9jb25maWcubWsKQEAgLTAsMCArMSwyMiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBTRFAzNDMwIGJvYXJkIHVzZXMgT01BUDM0MzAgKEFSTS1Db3J0ZXhBOCkgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgU0RQMzQzMCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgMTI4TUIgbUREUi1TRFJBTSBvbiBDUzAKKyMgU0RQMzQzMCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgMDBNQiBtRERSLVNEUkFNIG9uIENTMQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorIyBBMDAwJzAwMDAgKGJhbmsxKSAtIHJlLW1hcHBhYmxlIGJlbG93IENTMQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwODgwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9vbWFwMzQzMHNkcC5jIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9vbWFwMzQzMHNkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmOWZlZGIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL29tYXAzNDMwc2RwLmMKQEAgLTAsMCArMSw3NDQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYtMjAwOAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisgICAgICAgIHVuc2lnbmVkIGludCBtOworICAgICAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGZzZWw7CisgICAgICAgIHVuc2lnbmVkIGludCBtMjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworI2RlZmluZSBNQVhfU0lMX0lOREVYCTMKKworLyogRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsb3dsZXZlbF9pbml0LlMgKi8KK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogYm9hcmRfaW5pdAorICogRGVzY3JpcHRpb246IEVhcmx5IGhhcmR3YXJlIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBnZXRfZGV2aWNlX3R5cGUoKTogdGVsbCBpZiBHUC9IUy9FTVUvVFNUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoREVWSUNFX01BU0spOworICAgICAgICByZXR1cm4obW9kZSA+Pj0gOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwl1MzIgY3B1aWQ9MDsKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIiAoY3B1aWQpKTsKKwlpZigoY3B1aWQgICYgMHhmKSA9PSAweDApCisJCXJldHVybiBDUFVfMzQzMF9FUzE7CisJZWxzZQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMyOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNwdV9pc18zNDEwKHZvaWQpIC0gcmV0dXJucyB0cnVlIGZvciAzNDEwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGNwdV9pc18zNDEwKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpZihnZXRfY3B1X3JldigpIDwgQ1BVXzM0MzBfRVMyKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHJlYWQgc2NhbGFiaWxpdHkgc3RhdHVzIGFuZCByZXR1cm4gMSBmb3IgMzQxMCovCisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMpOworCQkvKiBDaGVjayB3aGV0aGVyIE1QVSBmcmVxdWVuY3kgaXMgc2V0IHRvIDI2NiBNSHogd2hpY2gKKwkJICogaXMgbm9taW5hbCBmb3IgMzQxMC4gSWYgeWVzIHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkJICovCisJCWlmICgoKHN0YXR1cyA+PiA4KSAmIDB4MykgPT0gMHgyKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzcjMyIC0gY2xlYXIgJiBzZXQgYSB2YWx1ZSBpbiBhIGJpdCByYW5nZSBmb3IgYSAzMiBiaXQgYWRkcmVzcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgdG1wLCBtc2sgPSAwOworCW1zayA9IDEgPDwgbnVtX2JpdHM7CisJLS1tc2s7CisJdG1wID0gX19yYXdfcmVhZGwoYWRkcikgJiB+KG1zayA8PCBzdGFydF9iaXQpOworCXRtcCB8PSAgdmFsdWUgPDwgc3RhcnRfYml0OworCV9fcmF3X3dyaXRlbCh0bXAsIGFkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YWl0X29uX3ZhbHVlKCkgLSBjb21tb24gcm91dGluZSB0byBhbGxvdyB3YWl0aW5nIGZvciBjaGFuZ2VzIGluCisgKiAgIHZvbGF0aWxlIHJlZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHdhaXRfb25fdmFsdWUodTMyIHJlYWRfYml0X21hc2ssIHUzMiBtYXRjaF92YWx1ZSwgdTMyIHJlYWRfYWRkciwgdTMyIGJvdW5kKQoreworCXUzMiBpID0gMCwgdmFsOworCWRvIHsKKwkJKytpOworCQl2YWwgPSBfX3Jhd19yZWFkbChyZWFkX2FkZHIpICYgcmVhZF9iaXRfbWFzazsKKwkJaWYgKHZhbCA9PSBtYXRjaF92YWx1ZSkKKwkJCXJldHVybiAoMSk7CisJCWlmIChpID09IGJvdW5kKQorCQkJcmV0dXJuICgwKTsKKwl9IHdoaWxlICgxKTsKK30KKworI2lmZGVmIENGR18zNDMwU0RSQU1fRERSCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjb25maWdfMzQzMHNkcmFtX2RkcigpIC0gSW5pdCBERFIgb24gMzQzMFNEUCBkZXYgYm9hcmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjb25maWdfMzQzMHNkcmFtX2Rkcih2b2lkKQoreworCS8qIHJlc2V0IHNkcmMgY29udHJvbGxlciAqLworCV9fcmF3X3dyaXRlbChTT0ZUUkVTRVQsIFNEUkNfU1lTQ09ORklHKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIEJJVDAsIFNEUkNfU1RBVFVTLCAxMjAwMDAwMCk7CisJX19yYXdfd3JpdGVsKDAsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qIHNldHVwIHNkcmMgdG8gYmFsbCBtdXggKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCS8qIHNldCBtZGNmZyAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCisJLyogc2V0IHRpbWluZyAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19SRlJfQ1RSTCwgU0RSQ19SRlJfQ1RSTCk7CisKKwkvKiBpbml0IHNlcXVlbmNlIGZvciBtRERSL21TRFIgdXNpbmcgbWFudWFsIGNvbW1hbmRzIChERFIgaXMgZGlmZmVyZW50KSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlkZWxheSg1MDAwKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisKKwkvKiBzZXQgbXIwICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01SXzBfRERSLCBTRFJDX01SXzApOworCisJLyogc2V0IHVwIGRsbCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEFfQ1RSTCk7CisJZGVsYXkoMHgyMDAwKTsJLyogZ2l2ZSB0aW1lIHRvIGxvY2sgKi8KKworfQorI2VuZGlmIC8vIENGR18zNDMwU0RSQU1fRERSCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa19zcGVlZCAtIGRldGVybWluZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZAorICogIGJhc2VkIG9uIGtub3duIDMya0h6IGNsb2NrIGFuZCBncHRpbWVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X29zY19jbGtfc3BlZWQodm9pZCkKK3sKKwl1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSTV9DTEtTUkNfQ1RSTCk7CisJLyogSWYgU1lTX0NMSyBpcyBiZWluZyBkaXZpZGVkIGJ5IDIsIHJlbW92ZSBmb3Igbm93ICovCisJdmFsID0gKHZhbCAmICh+QklUNykpIHwgQklUNjsKKwlfX3Jhd193cml0ZWwodmFsLCBQUk1fQ0xLU1JDX0NUUkwpOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa2luX3NlbCgpIC0gcmV0dXJucyB0aGUgc3lzX2Nsa2luX3NlbCBmaWVsZCB2YWx1ZSBiYXNlZCBvbiAKKyAqICAgLS0gaW5wdXQgb3NjaWxsYXRvciBjbG9jayBmcmVxdWVuY3kuCisgKiAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBnZXRfc3lzX2Nsa2luX3NlbCh1MzIgb3NjX2NsaywgdTMyICpzeXNfY2xraW5fc2VsKQoreworCWlmKG9zY19jbGsgPT0gUzM4XzRNKQorCQkqc3lzX2Nsa2luX3NlbD0gIDQ7CisJZWxzZSBpZihvc2NfY2xrID09IFMyNk0pCisJCSpzeXNfY2xraW5fc2VsID0gMzsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzE5XzJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDI7CisJZWxzZSBpZihvc2NfY2xrID09IFMxM00pCisJCSpzeXNfY2xraW5fc2VsID0gMTsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEyTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwcmNtX2luaXQoKSAtIGluaXRzIGNsb2NrcyBmb3IgUFJDTSBhcyBkZWZpbmVkIGluIGNsb2Nrcy5oCisgKiAgIC0tIGNhbGxlZCBmcm9tIFNSQU0sIG9yIEZsYXNoICh1c2luZyB0ZW1wIFNSQU0gc3RhY2spLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgb3NjX2Nsaz0wLCBzeXNfY2xraW5fc2VsOworCWRwbGxfcGFyYW0gKmRwbGxfcGFyYW1fcDsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJb3NjX2NsayA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwob3NjX2NsaywgJnN5c19jbGtpbl9zZWwpOworCisJc3IzMihQUk1fQ0xLU0VMLCAwLCAzLCBzeXNfY2xraW5fc2VsKTsgLyogc2V0IGlucHV0IGNyeXN0YWwgc3BlZWQgKi8KKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZS8yICovCisJaWYoc3lzX2Nsa2luX3NlbCA+IDIpIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDIpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbC8yOworCX0gZWxzZSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAxKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWw7CisJfQorCisJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDAsIDIsIDApOy8qIEJ5cGFzcyBtb2RlOiBUMiBpbnB1dHMgYSBzcXVhcmUgY2xvY2sgKi8KKworCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCSAqIHNpbGljb24gcmV2aXNpb24uIFRoZSBjbGtfaW5kZXggdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGdldAorCSAqIHRoZSB2YWx1ZXMgZm9yIHRoYXQgaW5wdXQgc3lzY2xrIGZyb20gdGhlIERQTEwgcGFyYW0gdGFibGUKKwkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUgCisJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuIAorCSAqLworCWlmKGNwdV9pc18zNDEwKCkpCisJCXNpbF9pbmRleCA9IDI7CisJZWxzZSB7CisJCWlmKGdldF9jcHVfcmV2KCkgPT0gQ1BVXzM0MzBfRVMxKQorCQkJc2lsX2luZGV4ID0gMDsKKwkJZWxzZSBpZihnZXRfY3B1X3JldigpID09IENQVV8zNDMwX0VTMikKKwkJCXNpbF9pbmRleCA9IDE7CisJfQkKKworCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9XX1BPV0VSX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X2NvcmVfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIE1BWF9TSUxfSU5ERVgqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCS8qIENPUkUgRFBMTCAqLworCS8qIHNyMzIoQ01fQ0xLU0VMMl9FTVUpIHNldCBvdmVycmlkZSB0byB3b3JrIHdoZW4gYXNsZWVwICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCQkvKiBGb3IgMzQzMCBFUzEuMCBFcnJhdGEgMS41MCwgZGVmYXVsdCB2YWx1ZSBkaXJlY3RseSBkb2VzbnQKKwkJICAgd29yay4gd3JpdGUgYW5vdGhlciB2YWx1ZSBhbmQgdGhlbiBkZWZhdWx0IHZhbHVlLiAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIgKyAxKTsJLyogbTN4MiAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOwkJLyogbTN4MiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCAyLCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogU2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBTZXQgTSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CQkJLyogOTZNIFNyYyAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiBFUzEgb25seSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAwLCAzLCBHRlhfRElWKTsJCS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIFBFUiAgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgY2xrX2luZGV4OworCS8qIFBFUiBEUExMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJLyogc2V0IE0zICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIHNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBzZXQgbSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIHNldCBuICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOy8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgTUFYX1NJTF9JTkRFWCpjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBTZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIFNldCBNICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7IC8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgTUFYX1NJTF9JTkRFWCpjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogSVZBIERQTEwgKHNldCB0byAxMioyMD0yNDBNSHopICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIHNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIHNldCBNICovCisgIAlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIHNldCBOICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsJLyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRyeV91bmxvY2tfbWVtb3J5KHZvaWQpCit7CisJaW50IG1vZGU7CisKKwkvKiBpZiBHUCBkZXZpY2UgdW5sb2NrIGRldmljZSBTUkFNIGZvciBnZW5lcmFsIHVzZSAqLworCS8qIHNlY3VyZSBjb2RlIGJyZWFrcyBmb3IgU2VjdXJlL0VtdWxhdGlvbiBkZXZpY2UgLSBIUy9FL1QqLworCW1vZGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKwlpZiAobW9kZSA9PSBHUF9ERVZJQ0UpIHsKKwkJc2VjdXJlX3VubG9jaygpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzX2luaXQKKyAqIERlc2NyaXB0aW9uOiBEb2VzIGVhcmx5IHN5c3RlbSBpbml0IG9mIG11eGluZyBhbmQgY2xvY2tzLgorICogLSBDYWxsZWQgYXQgdGltZSB3aGVuIG9ubHkgc3RhY2sgaXMgYXZhaWxhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworI2lmZGVmIENPTkZJR18zNDMwX0FTXzM0MTAKKwkvKiBzZXR1cCB0aGUgc2NhbGFiaWxpdHkgY29udHJvbCByZWdpc3RlciBmb3IgCisJICogMzQzMCB0byB3b3JrIGluIDM0MTAgbW9kZQorCSAqLworCV9fcmF3X3dyaXRlbCgweDVBQkYsQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX09DUCk7CisjZW5kaWYKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKwlkZWxheSgxMDApOworCXByY21faW5pdCgpOworCXBlcl9jbG9ja3NfZW5hYmxlKCk7CisJY29uZmlnXzM0MzBzZHJhbV9kZHIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG1pc2NfaW5pdF9yCisgKiBEZXNjcmlwdGlvbjogSW5pdCBldGhlcm5ldCAoZG9uZSBoZXJlIHNvIHVkZWxheSB3b3JrcykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRyYW1faW5pdAorICogRGVzY3JpcHRpb246IHNldHMgdWJvb3RzIGlkZWEgb2Ygc2RyYW0gc2l6ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisvLy8vI2lmZGVmIENPTkZJR19TRVJJQUwzCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAxMSwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTl9QRVIsIDExLCAxLCAweDEpOworLy8vLyNlbHNlCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisvLy8vI2VuZGlmCisjZW5kaWYKKwlkZWxheSgxMDAwKTsKK30KKworLyogU2V0IE1VWCBmb3IgVUFSVCwgR1BNQywgU0RSQywgR1BJTyAqLworCisvKgorICogSUVOICAtIElucHV0IEVuYWJsZQorICogSURJUyAtIElucHV0IERpc2FibGUKKyAqIFBURCAgLSBQdWxsIHR5cGUgRG93bgorICogUFRVICAtIFB1bGwgdHlwZSBVcAorICogRElTICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgaW5hY3RpdmUKKyAqIEVOICAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGFjdGl2ZQorICogTTAgICAtIE1vZGUgMAorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICovCisjZGVmaW5lIE1VWF9ERUZBVUxUKClcCisJLypTRFJDKi9cCisJTVVYX1ZBTChDUChTRFJDX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENCovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19DTEsqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMzKi9cCisJLypHUE1DKi9cCisJTVVYX1ZBTChDUChHUE1DX0ExKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTIpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EzKi9cCisJTVVYX1ZBTChDUChHUE1DX0E0KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTUpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E3KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTcqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTgpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0ExMCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENCovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDYqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDkqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MwKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MzKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNCBsYWIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQ1M1IGxhYiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M2KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0xKSkgLypzeXNfbmRtYXJlcTEgbGFiKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLCAgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTEpKSAvKkdQTUNfSU9fRElSIGxhYiovXAorCU1VWF9WQUwoQ1AoR1BNQ19DTEspLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0NMSyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05BRFZfQUxFKi9cCisJTVVYX1ZBTChDUChHUE1DX05PRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTk9FKi9cCisJTVVYX1ZBTChDUChHUE1DX05XRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkJFMF9DTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQkUxIGxhYiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XUCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQwKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qZ3BtY19uV2FpdCBsYWIqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDMpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qZ3BtY19uV2FpdCBsYWIqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTgpLCAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qRFNTX0RBVEExOCovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypEU1NfREFUQTE5Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkRTU19EQVRBMjAqL1wKKwlNVVhfVkFMKENQKENBTV9YQ0xLQiksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qQ0FNX1hDTEtCKi9cCisJTVVYX1ZBTChDUChDQU1fV0VOKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTY3Ki9cCisJTVVYX1ZBTChDUChVQVJUMV9UWCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1RYKi9cCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfQ1RTKSwgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypVQVJUMV9DVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1JYKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfUlgqL1wKKwlNVVhfVkFMKENQKE1DQlNQMV9EWCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNTgqL1wKKwlNVVhfVkFMKENQKFNZU18zMkspLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU1lTXzMySyovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzIgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT180ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QzKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzUgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDQpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNiAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT183ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q2KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzggKi9cCisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMSksICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKnN5c19jbGtvdXQyIGxhYiovXAorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypzeXNfY2xrb3V0MiBsYWIqL1wKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19uVFJTVCovXAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RDSyovXAorCU1VWF9WQUwoQ1AoSlRBR19UTVMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RNUyovXAorCU1VWF9WQUwoQ1AoSlRBR19UREkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RESSovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTAqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUxKi9cCisJTVVYX1ZBTChDUChFVEtfQ0xLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTIqL1wKKwlNVVhfVkFMKENQKEVUS19DVEwpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMyovXAorCU1VWF9WQUwoQ1AoRVRLX0QwICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTUqL1wKKwlNVVhfVkFMKENQKEVUS19EMiApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDExKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjUqL1wKKwlNVVhfVkFMKENQKEVUS19EMTIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI3Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjgqL1wKKwlNVVhfVkFMKENQKEVUS19EMTUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOSovXAorCU1VWF9WQUwoQ1AoVUFSVDNfQ1RTX1JDVFgpLCAoSUVOICB8IFBURCB8IEVOICB8IE0wKSkgLypVQVJUM19DVFNfUkNUWCAqL1wKKwlNVVhfVkFMKENQKFVBUlQzX1JUU19TRCksICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDNfUlRTX1NEICovXAorCU1VWF9WQUwoQ1AoVUFSVDNfUlhfSVJSWCApLCAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUM19SWF9JUlJYKi9cCisJTVVYX1ZBTChDUChVQVJUM19UWF9JUlRYICksIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQzX1RYX0lSVFgqL1wKKwlNVVhfVkFMKENQKHNkcmNfY2tlMCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qc2RyY19ja2UwICovXAorCU1VWF9WQUwoQ1Aoc2RyY19ja2UxKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE03KSkgLypzZHJjX2NrZTEgbm90IHVzZWQqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNldF9tdXhjb25mX3JlZ3MKKyAqIERlc2NyaXB0aW9uOiBTZXR0aW5nIHVwIHRoZSBjb25maWd1cmF0aW9uIE11eCByZWdpc3RlcnMKKyAqICAgICAgICAgICAgICBzcGVjaWZpYyB0byB0aGUgaGFyZHdhcmUuIE1hbnkgcGlucyBuZWVkCisgKiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQgZnJvbSBwcm90ZWN0IHRvIHByaW1hcnkgbW9kZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwlNVVhfREVGQVVMVCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbmFuZCtfaW5pdAorICogRGVzY3JpcHRpb246IFNldCB1cCBuYW5kIGZvciBuYW5kIGFuZCBqZmZzMiBjb21tYW5kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBuYW5kX2luaXQodm9pZCkKK3sKKwkvKiBnbG9iYWwgc2V0dGluZ3MgKi8KKwlfX3Jhd193cml0ZWwoMHgxMCwgR1BNQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlICovCisJX19yYXdfd3JpdGVsKDB4MCwgR1BNQ19JUlFFTkFCTEUpOwkvKiBpc3IncyBzb3VyY2VzIG1hc2tlZCAqLworCV9fcmF3X3dyaXRlbCgwLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7LyogdGltZW91dCBkaXNhYmxlICovCisjaWZkZWYgQ0ZHX05BTkQKKwlfX3Jhd193cml0ZWwoMHgwMDEsIEdQTUNfQ09ORklHKTsJLyogc2V0IG5XUCwgZGlzYWJsZSBsaW1pdGVkIGFkZHIgKi8KKyNlbmRpZgorCisJLyogc2V0dXAgQ1MwIGZvciBNaWNyb24gTkFORCwgbGVhdmUgb3RoZXIgQ1MncyB0byB1LWJvb3QgKi8KKwlfX3Jhd193cml0ZWwoMCAsIEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCk7CisJZGVsYXkoMTAwMCk7CisKKyNpZmRlZiBDRkdfTkFORAorCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworCisjZWxzZSAvKiBDRkdfT05FTkFORCAqLworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMiwgR1BNQ19DT05GSUcyICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNSwgR1BNQ19DT05GSUc1ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworI2VuZGlmCisKKwkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworCV9fcmF3X3dyaXRlbCgoICgoT01BUDM0WFhfR1BNQ19DUzBfU0laRSAmIDB4Rik8PDgpIHwKKwkJICAgICAoKE9NQVAzNFhYX0dQTUNfQ1MwX01BUD4+MjQpICYgMHgzRikgfAorCQkgICAgICgxPDw2KSApLCAgKEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCkpOworCWRlbGF5KDIwMDApOworCisjaWZkZWYgQ0ZHX05BTkQKKyAJaWYgKG5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisJCXByaW50ZigiVW5zdXBwb3J0ZWQgQ2hpcCFcbiIpOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKyNlbHNlCisJaWYgKG9uZW5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisJCXByaW50ZigiT25lTkFORCBVbnN1cHBvcnRlZCAhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyogb3B0aW9uYWxseSBkbyBzb21ldGhpbmcgbGlrZSBibGlua2luZyBMRUQgKi8KK3ZvaWQgYm9hcmRfaGFuZyAodm9pZCkKK3sgd2hpbGUgKDApIHt9O30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ODY5MjcwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworI2lmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLyAKKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLiAgCisqICAgSXQgY291bGQgYmUgcmVtb3ZlZCBpdHMgaXMga2VwdCBmb3IgY29tcGF0YWJpbHkgd2l0aCB1LWJvb3QuCisgKgorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gQ01fQ0xLRU5fUExMLWJ5cGFzcyB2YWx1ZQorICogIFIxID0gQ01fQ0xLU0VMMV9QTEwtbSwgbiwgYW5kIGRpdmlkZXIgdmFsdWVzCisgKiAgUjIgPSBDTV9DTEtTRUxfQ09SRS1kaXZpZGVyIHZhbHVlcworICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoKKyAqICBOb3RlOiBJZiBjb3JlIHVubG9ja3MvcmVsb2NrcyBhbmQgU0RSQU0gaXMgcnVubmluZyBmYXN0IGFscmVhZHkgaXQgZ2V0cworICogICAgICAgIGNvbmZ1c2VkLiAgQSByZXNldCBvZiB0aGUgY29udHJvbGxlciBnZXRzIGl0IGJhY2suICBUYWtpbmcgYXdheSBpdHMKKyAqICAgICAgICBMMyB3aGVuIGl0cyBub3QgaW4gc2VsZiByZWZyZXNoIHNlZW1zIGJhZCBmb3IgaXQuICBOb3JtYWxseSwgdGhpcyBjb2RlCisgKiAgICAgICAgcnVucyBmcm9tIGZsYXNoIGJlZm9yZSBTRFIgaXMgaW5pdCBzbyB0aGF0IHNob3VsZCBiZSBvay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAorLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNCAgLyogZ2Z4ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNCAKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgIAorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDUgIC8qIGVtdSAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDUgCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgIAorCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzVfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIFtyNV0KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbG9jayBEUExMMyBhbmQgd2FpdCBhIGJpdCAqLworICAgICAgICBvcnIgICAgIHIwLCByMCwgIzB4NyAgIC8qIHNldCB1cCBmb3IgbG9jayBtb2RlICovICAgICAKKyAgICAgICAgc3RyICAgICByMCwgW3I0XSAgICAgICAvKiBsb2NrICovCisgICAgICAgIG5vcCAgICAgICAgICAgICAgICAgICAgLyogQVJNIHNsb3cgYXQgdGhpcyBwb2ludCB3b3JraW5nIGF0IHN5c19jbGsgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKK3dhaXQyOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBibmUgICAgIHdhaXQyICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIGxkbWZkIHNwISwge3I0LXI2fQorICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLyAgICAgICAgCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzEpCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzMpCitmbGFzaF9jZmczX3ZhbDogCisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzQpCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc0CitmbGFzaF9jZmc1X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc1CitmbGFzaF9jZmc1X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNSkKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX2Rpdl9hZGQxOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMIAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkgCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApIAorcGxsX2Rpdl9hZGQ1OgorICAgIC53b3JkIENNX0NMS1NFTDFfRU1VCitwbGxfZGl2X3ZhbDU6CisgICAgLndvcmQgQ0xTRUwxX0VNVV9WQUwKKworI2VuZGlmCisKKy5nbG9ibCBsb3dsZXZlbF9pbml0Citsb3dsZXZlbF9pbml0OgorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisJYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKy8qIERQTEwoMS00KSBQQVJBTSBUQUJMRVMgKi8KKy8qIEVhY2ggb2YgdGhlIHRhYmxlcyBoYXMgTSwgTiwgRlJFUVNFTCwgTTIgdmFsdWVzIGRlZmluZWQgZm9yIG5vbWluYWwKKyAqIE9QUCAoMS4yVikuIFRoZSBmaWVsZHMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIGRwbGxfcGFyYW0gc3RydWN0KGNsb2NrLmMpLiAKKyAqIFRoZSB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBzeXNjbGsgYW5kIGZvciBFUzEgYW5kIEVTMi4KKyAqLworCittcHVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZFLDB4MDcsMHgwNSwweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBLDB4MDUsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDA1LDB4MDcsMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RCwweDBDLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDFGNCwweDBDLDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxMEEsMHgwQywweDAzLDB4MDEKKyAKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxNzksMHgxMiwweDA0LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEsMHgxNywweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MTcsMHgwMywweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdELDB4MTksMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBLDB4MEMsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDBDLDB4MDcsMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUZBLDB4MzIsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxLDB4MkYsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDJGLDB4MDMsMHgwMQorCisKKy5nbG9ibCBnZXRfbXB1X2RwbGxfcGFyYW0KK2dldF9tcHVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIG1wdV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitpdmFfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdELDB4MDUsMHgwNywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0LDB4MDUsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDA1LDB4MDcsMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQSwweDBDLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDE2OCwweDBDLDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxMEEsMHgwQywweDAzLDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA4MiwweDA5LDB4MDcsMHgwMQorLyogRVMyICovCisud29yZCAweDBFMSwweDBCLDB4MDYsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgxNywweDAzLDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QsMHgwQywweDA3LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQsMHgwQywweDA3LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MDg1LDB4MEMsMHgwNywweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YsMHgzMCwweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEsMHgxNywweDA2LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MkYsMHgwMywweDAxCisKKworLmdsb2JsIGdldF9pdmFfZHBsbF9wYXJhbQorZ2V0X2l2YV9kcGxsX3BhcmFtOgorCWFkciByMCwgaXZhX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIENvcmUgRFBMTCB0YXJnZXRzIGZvciBMMyBhdCAxNjYgJiBMMTMzICovCitjb3JlX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCBNXzEyX0VTMSxNXzEyX0VTMSxGU0xfMTJfRVMxLE0yXzEyX0VTMQorLyogRVMyICovCisud29yZCBNXzEyLE5fMTIsRlNFTF8xMixNMl8xMgorLyogMzQxMCAqLworLndvcmQgTV8xMixOXzEyLEZTRUxfMTIsTTJfMTIKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8xM19FUzEsTl8xM19FUzEsRlNMXzEzX0VTMSxNMl8xM19FUzEKKy8qIEVTMiAqLworLndvcmQgTV8xMyxOXzEzLEZTRUxfMTMsTTJfMTMKKy8qIDM0MTAgKi8KKy53b3JkIE1fMTMsTl8xMyxGU0VMXzEzLE0yXzEzCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8xOXAyX0VTMSxOXzE5cDJfRVMxLEZTTF8xOXAyX0VTMSxNMl8xOXAyX0VTMQorLyogRVMyICovCisud29yZCBNXzE5cDIsTl8xOXAyLEZTRUxfMTlwMixNMl8xOXAyCisvKiAzNDEwICovCisud29yZCBNXzE5cDIsTl8xOXAyLEZTRUxfMTlwMixNMl8xOXAyCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMjZfRVMxLE5fMjZfRVMxLEZTTF8yNl9FUzEsTTJfMjZfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMjYsTl8yNixGU0VMXzI2LE0yXzI2CisvKiAzNDEwICovCisud29yZCBNXzI2LE5fMjYsRlNFTF8yNixNMl8yNgorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMzhwNF9FUzEsTl8zOHA0X0VTMSxGU0xfMzhwNF9FUzEsTTJfMzhwNF9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8zOHA0LE5fMzhwNCxGU0VMXzM4cDQsTTJfMzhwNAorLyogMzQxMCAqLworLndvcmQgTV8zOHA0LE5fMzhwNCxGU0VMXzM4cDQsTTJfMzhwNAorCisuZ2xvYmwgZ2V0X2NvcmVfZHBsbF9wYXJhbQorZ2V0X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGNvcmVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogUEVSIERQTEwgdmFsdWVzIGFyZSBzYW1lIGZvciBib3RoIEVTMSBhbmQgRVMyICovCitwZXJfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisud29yZCAweEQ4LDB4MDUsMHgwNywweDA5CisKKy8qIDEzTUh6ICovCisud29yZCAweDFCMCwweDBDLDB4MDMsMHgwOQorCisvKiAxOS4yTUh6ICovCisud29yZCAweEUxLDB4MDksMHgwNywweDA5CisKKy8qIDI2TUh6ICovCisud29yZCAweEQ4LDB4MEMsMHgwNywweDA5CisKKy8qIDM4LjRNSHogKi8KKy53b3JkIDB4RTEsMHgxMywweDA3LDB4MDkKKworLmdsb2JsIGdldF9wZXJfZHBsbF9wYXJhbQorZ2V0X3Blcl9kcGxsX3BhcmFtOgorCWFkciByMCwgcGVyX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDAyZjc0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci94LWxvYWQubGRzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBOb3ZlbWJlciAyMDA2IC0gQ2hhbmdlZCB0byBzdXBwb3J0IDM0MzBzZHAgZGV2aWNlIAorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMgCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvb21hcDMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1Y2UxNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gb21hcDM0MzBzZHAubyAKK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhZDZjNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL2NvbmZpZy5tawpAQCAtMCwwICsxLDIyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIFNEUDM0MzAgYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cworIworIyBTRFAzNDMwIGhhcyAxIGJhbmsgb2YgMzJNQiBvciAxMjhNQiBtRERSLVNEUkFNIG9uIENTMAorIyBTRFAzNDMwIGhhcyAxIGJhbmsgb2YgMzJNQiBvciAwME1CIG1ERFItU0RSQU0gb24gQ1MxCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisjIEEwMDAnMDAwMCAoYmFuazEpIC0gcmUtbWFwcGFibGUgYmVsb3cgQ1MxCisKKyMgRm9yIHVzZSBpZiB5b3Ugd2FudCBYLUxvYWRlciB0byByZWxvY2F0ZSBmcm9tIFNSQU0gdG8gRERSCisjVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCitURVhUX0JBU0UgPSAweDQwMjA4ODAwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9vbWFwMzQzMHNkcC5jIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvb21hcDM0MzBzZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjA5YWFmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvb21hcDM0MzBzZHAuYwpAQCAtMCwwICsxLDc3NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+CisjaW5jbHVkZSA8ZmF0Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKy8qIFVzZWQgdG8gaW5kZXggaW50byBEUExMIHBhcmFtZXRlciB0YWJsZXMgKi8KK3N0cnVjdCBkcGxsX3BhcmFtIHsKKyAgICAgICAgdW5zaWduZWQgaW50IG07CisgICAgICAgIHVuc2lnbmVkIGludCBuOworICAgICAgICB1bnNpZ25lZCBpbnQgZnNlbDsKKyAgICAgICAgdW5zaWduZWQgaW50IG0yOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBsbF9wYXJhbSBkcGxsX3BhcmFtOworCisjZGVmaW5lIE1BWF9TSUxfSU5ERVgJMworCisvKiBGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIGxvd2xldmVsX2luaXQuUyAqLworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfbXB1X2RwbGxfcGFyYW0oKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9jb3JlX2RwbGxfcGFyYW0oKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkZWxheQorICogRGVzY3JpcHRpb246IHNwaW5uaW5nIGRlbGF5IHRvIHVzZSBiZWZvcmUgdWRlbGF5IHdvcmtzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIihsb29wcykpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGJvYXJkX2luaXQKKyAqIERlc2NyaXB0aW9uOiBFYXJseSBoYXJkd2FyZSBpbml0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGJvYXJkX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZ2V0X2RldmljZV90eXBlKCk6IHRlbGwgaWYgR1AvSFMvRU1VL1RTVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2RldmljZV90eXBlKHZvaWQpCit7CisgICAgICAgIGludCBtb2RlOworICAgICAgICBtb2RlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpICYgKERFVklDRV9NQVNLKTsKKyAgICAgICAgcmV0dXJuKG1vZGUgPj49IDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9jcHVfcmV2KHZvaWQpCit7CisJdTMyIGNwdWlkPTA7CisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisJaWYoKGNwdWlkICAmIDB4ZikgPT0gMHgwKQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMxOworCWVsc2UKKwkJcmV0dXJuIENQVV8zNDMwX0VTMjsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBjcHVfaXNfMzQxMCh2b2lkKQoreworCWludCBzdGF0dXM7CisJaWYoZ2V0X2NwdV9yZXYoKSA8IENQVV8zNDMwX0VTMikgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiByZWFkIHNjYWxhYmlsaXR5IHN0YXR1cyBhbmQgcmV0dXJuIDEgZm9yIDM0MTAqLworCQlzdGF0dXMgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NDQUxBQkxFX09NQVBfU1RBVFVTKTsKKwkJLyogQ2hlY2sgd2hldGhlciBNUFUgZnJlcXVlbmN5IGlzIHNldCB0byAyNjYgTUh6IHdoaWNoCisJCSAqIGlzIG5vbWluYWwgZm9yIDM0MTAuIElmIHllcyByZXR1cm4gdHJ1ZSBlbHNlIGZhbHNlCisJCSAqLworCQlpZiAoKChzdGF0dXMgPj4gOCkgJiAweDMpID09IDB4MikKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3IzMiAtIGNsZWFyICYgc2V0IGEgdmFsdWUgaW4gYSBiaXQgcmFuZ2UgZm9yIGEgMzIgYml0IGFkZHJlc3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpCit7CisJdTMyIHRtcCwgbXNrID0gMDsKKwltc2sgPSAxIDw8IG51bV9iaXRzOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FpdF9vbl92YWx1ZSgpIC0gY29tbW9uIHJvdXRpbmUgdG8gYWxsb3cgd2FpdGluZyBmb3IgY2hhbmdlcyBpbgorICogICB2b2xhdGlsZSByZWdzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKyNpZmRlZiBDRkdfMzQzMFNEUkFNX0REUgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY29uZmlnXzM0MzBzZHJhbV9kZHIoKSAtIEluaXQgRERSIG9uIDM0MzBTRFAgZGV2IGJvYXJkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY29uZmlnXzM0MzBzZHJhbV9kZHIodm9pZCkKK3sKKwkvKiByZXNldCBzZHJjIGNvbnRyb2xsZXIgKi8KKwlfX3Jhd193cml0ZWwoU09GVFJFU0VULCBTRFJDX1NZU0NPTkZJRyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCBCSVQwLCBTRFJDX1NUQVRVUywgMTIwMDAwMDApOworCV9fcmF3X3dyaXRlbCgwLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKiBzZXR1cCBzZHJjIHRvIGJhbGwgbXV4ICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwkvKiBzZXQgbWRjZmcgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKworCS8qIHNldCB0aW1pbmcgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfUkZSX0NUUkwsIFNEUkNfUkZSX0NUUkwpOworCisJLyogaW5pdCBzZXF1ZW5jZSBmb3IgbUREUi9tU0RSIHVzaW5nIG1hbnVhbCBjb21tYW5kcyAoRERSIGlzIGRpZmZlcmVudCkgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJZGVsYXkoNTAwMCk7CisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCisJLyogc2V0IG1yMCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8wKTsKKworCS8qIHNldCB1cCBkbGwgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExBX0NUUkwpOworCWRlbGF5KDB4MjAwMCk7CS8qIGdpdmUgdGltZSB0byBsb2NrICovCisKK30KKyNlbmRpZiAvLyBDRkdfMzQzMFNEUkFNX0REUgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtfc3BlZWQgLSBkZXRlcm1pbmUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQKKyAqICBiYXNlZCBvbiBrbm93biAzMmtIeiBjbG9jayBhbmQgZ3B0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCS8qIElmIFNZU19DTEsgaXMgYmVpbmcgZGl2aWRlZCBieSAyLCByZW1vdmUgZm9yIG5vdyAqLworCXZhbCA9ICh2YWwgJiAofkJJVDcpKSB8IEJJVDY7CisJX19yYXdfd3JpdGVsKHZhbCwgUFJNX0NMS1NSQ19DVFJMKTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtpbl9zZWwoKSAtIHJldHVybnMgdGhlIHN5c19jbGtpbl9zZWwgZmllbGQgdmFsdWUgYmFzZWQgb24KKyAqICAgLS0gaW5wdXQgb3NjaWxsYXRvciBjbG9jayBmcmVxdWVuY3kuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBnZXRfc3lzX2Nsa2luX3NlbCh1MzIgb3NjX2NsaywgdTMyICpzeXNfY2xraW5fc2VsKQoreworCWlmKG9zY19jbGsgPT0gUzM4XzRNKQorCQkqc3lzX2Nsa2luX3NlbD0gIDQ7CisJZWxzZSBpZihvc2NfY2xrID09IFMyNk0pCisJCSpzeXNfY2xraW5fc2VsID0gMzsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzE5XzJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDI7CisJZWxzZSBpZihvc2NfY2xrID09IFMxM00pCisJCSpzeXNfY2xraW5fc2VsID0gMTsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEyTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwcmNtX2luaXQoKSAtIGluaXRzIGNsb2NrcyBmb3IgUFJDTSBhcyBkZWZpbmVkIGluIGNsb2Nrcy5oCisgKiAgIC0tIGNhbGxlZCBmcm9tIFNSQU0sIG9yIEZsYXNoICh1c2luZyB0ZW1wIFNSQU0gc3RhY2spLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgb3NjX2Nsaz0wLCBzeXNfY2xraW5fc2VsOworCWRwbGxfcGFyYW0gKmRwbGxfcGFyYW1fcDsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJb3NjX2NsayA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwob3NjX2NsaywgJnN5c19jbGtpbl9zZWwpOworCisJc3IzMihQUk1fQ0xLU0VMLCAwLCAzLCBzeXNfY2xraW5fc2VsKTsgLyogc2V0IGlucHV0IGNyeXN0YWwgc3BlZWQgKi8KKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZS8yICovCisJaWYoc3lzX2Nsa2luX3NlbCA+IDIpIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDIpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbC8yOworCX0gZWxzZSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAxKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWw7CisJfQorCisJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZQorCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LgorCSAqLworCWlmKGNwdV9pc18zNDEwKCkpCisJCXNpbF9pbmRleCA9IDI7CisJZWxzZSB7CisJCWlmKGdldF9jcHVfcmV2KCkgPT0gQ1BVXzM0MzBfRVMxKQorCQkJc2lsX2luZGV4ID0gMDsKKwkJZWxzZSBpZihnZXRfY3B1X3JldigpID09IENQVV8zNDMwX0VTMikKKwkJCXNpbF9pbmRleCA9IDE7CisJfQkKKworCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9XX1BPV0VSX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X2NvcmVfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIE1BWF9TSUxfSU5ERVgqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCS8qIENPUkUgRFBMTCAqLworCS8qIHNyMzIoQ01fQ0xLU0VMMl9FTVUpIHNldCBvdmVycmlkZSB0byB3b3JrIHdoZW4gYXNsZWVwICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOwkvKiBtM3gyICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDIsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBTZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIFNldCBNICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogU2V0IE4gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsJCQkvKiA5Nk0gU3JjICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKwlzcjMyKENNX0NMS1NFTF9HRlgsIDAsIDMsIEdGWF9ESVYpOwkJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gUEVSICBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBjbGtfaW5kZXg7CisJLyogUEVSIERQTEwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJLyogc2V0IE01ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA1LCBQRVJfTTRYMik7CS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkvKiBzZXQgTTMgKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogc2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIHNldCBtICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogc2V0IG4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMjAsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7LyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOwkvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBNQVhfU0lMX0lOREVYKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIFNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogU2V0IE0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogU2V0IE4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsgLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfaXZhX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBNQVhfU0lMX0lOREVYKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBJVkEgRFBMTCAoc2V0IHRvIDEyKjIwPTI0ME1IeikgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogc2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogc2V0IE0gKi8KKyAgCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogc2V0IE4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOwkvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIFNldCB1cCBHUFRpbWVycyB0byBzeXNfY2xrIHNvdXJjZSBvbmx5ICovCisgCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgOCwgMHhmZik7CisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMCwgMSwgMSk7CisKKwlkZWxheSg1MDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZWN1cmVfdW5sb2NrCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgc2VjdXJpdHkgcmVnaXN0ZXJzIGZvciBhY2Nlc3MKKyAqIChHUCBEZXZpY2Ugb25seSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwlpbnQgbW9kZTsKKworCS8qIGlmIEdQIGRldmljZSB1bmxvY2sgZGV2aWNlIFNSQU0gZm9yIGdlbmVyYWwgdXNlICovCisJLyogc2VjdXJlIGNvZGUgYnJlYWtzIGZvciBTZWN1cmUvRW11bGF0aW9uIGRldmljZSAtIEhTL0UvVCovCisJbW9kZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCWlmIChtb2RlID09IEdQX0RFVklDRSkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNfaW5pdAorICogRGVzY3JpcHRpb246IERvZXMgZWFybHkgc3lzdGVtIGluaXQgb2YgbXV4aW5nIGFuZCBjbG9ja3MuCisgKiAtIENhbGxlZCBhdCB0aW1lIHdoZW4gb25seSBzdGFjayBpcyBhdmFpbGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBzX2luaXQodm9pZCkKK3sKKwl3YXRjaGRvZ19pbml0KCk7CisjaWZkZWYgQ09ORklHXzM0MzBfQVNfMzQxMAorCS8qIHNldHVwIHRoZSBzY2FsYWJpbGl0eSBjb250cm9sIHJlZ2lzdGVyIGZvciAKKwkgKiAzNDMwIHRvIHdvcmsgaW4gMzQxMCBtb2RlCisJICovCisJX19yYXdfd3JpdGVsKDB4NUFCRixDT05UUk9MX1NDQUxBQkxFX09NQVBfT0NQKTsKKyNlbmRpZgorCXRyeV91bmxvY2tfbWVtb3J5KCk7CisJc2V0X211eGNvbmZfcmVncygpOworCWRlbGF5KDEwMCk7CisJcHJjbV9pbml0KCk7CisJcGVyX2Nsb2Nrc19lbmFibGUoKTsKKwljb25maWdfMzQzMHNkcmFtX2RkcigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbWlzY19pbml0X3IKKyAqIERlc2NyaXB0aW9uOiBJbml0IGV0aGVybmV0IChkb25lIGhlcmUgc28gdWRlbGF5IHdvcmtzKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKwlkbyB7CisJCXBlbmRpbmcgPSBfX3Jhd19yZWFkbCh3ZF9iYXNlICsgV1dQUyk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YXRjaGRvZ19pbml0CisgKiBEZXNjcmlwdGlvbjogU2h1dCBkb3duIHdhdGNoIGRvZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCS8qIFRoZXJlIGFyZSAzIHdhdGNoIGRvZ3MgV0QxPVNlY3VyZSwgV0QyPU1QVSwgV0QzPUlWQS4gV0QxIGlzCisJICogZWl0aGVyIHRha2VuIGNhcmUgb2YgYnkgUk9NIChIUy9FTVUpIG9yIG5vdCBhY2Nlc3NpYmxlIChHUCkuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgV0QyLU1QVSBvciB0YWtlIGEgUFJDTSByZXNldC4gIFdEMworCSAqIHNob3VsZCBub3QgYmUgcnVubmluZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBQUkNNIHJlc2V0LgorCSAqLworCXNyMzIoQ01fRkNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXNyMzIoQ01fSUNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXdhaXRfb25fdmFsdWUoQklUNSwgMHgyMCwgQ01fSURMRVNUX1dLVVAsIDUpOyAvKiBzb21lIGlzc3VlIGhlcmUgKi8KKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxLCBXRDJfQkFTRSArIFdTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syLCBXRDJfQkFTRSArIFdTUFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZHJhbV9pbml0CisgKiBEZXNjcmlwdGlvbjogc2V0cyB1Ym9vdHMgaWRlYSBvZiBzZHJhbSBzaXplCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkcmFtX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogcGVyaXBoZXJhbF9lbmFibGUKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUgdGhlIGNsa3MgJiBwb3dlciBmb3IgcGVyaWZzIChHUFQyLCBVQVJUMSwuLi4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwZXJfY2xvY2tzX2VuYWJsZSh2b2lkKQoreworCS8qIEVuYWJsZSBHUDIgdGltZXIuICovCisJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCAxLCAweDEpOyAvKiBHUFQyID0gc3lzIGNsayAqLworCXNyMzIoQ01fSUNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogSUNLZW4gR1BUMiAqLworCXNyMzIoQ01fRkNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogRkNLZW4gR1BUMiAqLworCisjaWZkZWYgQ0ZHX05TMTY1NTAKKwkvKiBFbmFibGUgVUFSVDEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKyNlbmRpZgorCWRlbGF5KDEwMDApOworfQorCisvKiBTZXQgTVVYIGZvciBVQVJULCBHUE1DLCBTRFJDLCBHUElPICovCisKKyNkZWZpbmUgCU1VWF9WQUwoT0ZGU0VULFZBTFVFKVwKKwkJX19yYXdfd3JpdGV3KChWQUxVRSksIE9NQVAzNFhYX0NUUkxfQkFTRSArIChPRkZTRVQpKTsKKworI2RlZmluZQkJQ1AoeCkJKENPTlRST0xfUEFEQ09ORl8jI3gpCisvKgorICogSUVOICAtIElucHV0IEVuYWJsZQorICogSURJUyAtIElucHV0IERpc2FibGUKKyAqIFBURCAgLSBQdWxsIHR5cGUgRG93bgorICogUFRVICAtIFB1bGwgdHlwZSBVcAorICogRElTICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgaW5hY3RpdmUKKyAqIEVOICAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGFjdGl2ZQorICogTTAgICAtIE1vZGUgMAorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICovCisjZGVmaW5lIE1VWF9ERUZBVUxUKClcCisJTVVYX1ZBTChDUChTRFJDX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENCovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19DTEsqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMzKi9cCisJTVVYX1ZBTChDUChHUE1DX0ExKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTIpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EzKi9cCisJTVVYX1ZBTChDUChHUE1DX0E0KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTUpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E3KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTcqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTgpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0ExMCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENCovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDYqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDkqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MwKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MzKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M2Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNyovXAorCU1VWF9WQUwoQ1AoR1BNQ19DTEspLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0NMSyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05BRFZfQUxFKi9cCisJTVVYX1ZBTChDUChHUE1DX05PRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTk9FKi9cCisJTVVYX1ZBTChDUChHUE1DX05XRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkJFMF9DTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182MSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XUCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQwKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT182NCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMyksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzY1Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fODgqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184OSovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzkwKi9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIxKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOTEqL1wKKwlNVVhfVkFMKENQKENBTV9XRU4pLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNjcqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1RYKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfVFgqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1JUUyksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfUlRTKi9cCisJTVVYX1ZBTChDUChVQVJUMV9DVFMpLCAgICAgIChJRU4gfCBQVFUgfCBESVMgfCBNMCkpIC8qVUFSVDFfQ1RTKi9cCisJTVVYX1ZBTChDUChVQVJUMV9SWCksICAgICAgIChJRU4gfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfUlgqL1wKKwlNVVhfVkFMKENQKE1DQlNQMV9EWCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNTgqL1wKKwlNVVhfVkFMKENQKFNZU18zMkspLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU1lTXzMySyovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzIgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT180ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QzKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzUgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDQpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNiAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT183ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q2KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzggKi9cCisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMiksICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTQpKSAvKkdQSU9fMTg2Ki9cCisJTVVYX1ZBTChDUChKVEFHX25UUlNUKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfblRSU1QqL1wKKwlNVVhfVkFMKENQKEpUQUdfVENLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UQ0sqL1wKKwlNVVhfVkFMKENQKEpUQUdfVE1TKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UTVMqL1wKKwlNVVhfVkFMKENQKEpUQUdfVERJKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UREkqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUwKi9cCisJTVVYX1ZBTChDUChKVEFHX0VNVTEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfRU1VMSovXAorCU1VWF9WQUwoQ1AoRVRLX0NMSyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzEyKi9cCisJTVVYX1ZBTChDUChFVEtfQ1RMKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTMqL1wKKwlNVVhfVkFMKENQKEVUS19EMCApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE1Ki9cCisJTVVYX1ZBTChDUChFVEtfRDIgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTYqL1wKKwlNVVhfVkFMKENQKEVUS19EMTApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI1Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjYqL1wKKwlNVVhfVkFMKENQKEVUS19EMTMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNyovXAorCU1VWF9WQUwoQ1AoRVRLX0QxNCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI4Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2V0X211eGNvbmZfcmVncworICogRGVzY3JpcHRpb246IFNldHRpbmcgdXAgdGhlIGNvbmZpZ3VyYXRpb24gTXV4IHJlZ2lzdGVycworICogICAgICAgICAgICAgIHNwZWNpZmljIHRvIHRoZSBoYXJkd2FyZS4gTWFueSBwaW5zIG5lZWQKKyAqICAgICAgICAgICAgICB0byBiZSBtb3ZlZCBmcm9tIHByb3RlY3QgdG8gcHJpbWFyeSBtb2RlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc2V0X211eGNvbmZfcmVncyh2b2lkKQoreworCU1VWF9ERUZBVUxUKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBuYW5kK19pbml0CisgKiBEZXNjcmlwdGlvbjogU2V0IHVwIG5hbmQgZm9yIG5hbmQgYW5kIGpmZnMyIGNvbW1hbmRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG5hbmRfaW5pdCh2b2lkKQoreworCS8qIGdsb2JhbCBzZXR0aW5ncyAqLworCV9fcmF3X3dyaXRlbCgweDEwLCBHUE1DX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBHUE1DX0lSUUVOQUJMRSk7CS8qIGlzcidzIHNvdXJjZXMgbWFza2VkICovCisJX19yYXdfd3JpdGVsKDAsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsvKiB0aW1lb3V0IGRpc2FibGUgKi8KKyNpZmRlZiBDRkdfTkFORAorCV9fcmF3X3dyaXRlbCgweDAwMSwgR1BNQ19DT05GSUcpOwkvKiBzZXQgbldQLCBkaXNhYmxlIGxpbWl0ZWQgYWRkciAqLworI2VuZGlmCisKKwkvKiBTZXQgdGhlIEdQTUMgVmFscyAuIEZvciBOQU5EIGJvb3Qgb24gMzQzMFNEUCwgTkFORCBpcyBtYXBwZWQgYXQgQ1MwCisgICAgICAgICAqICAsIE5PUiBhdCBDUzEgYW5kIE1QREIgYXQgQ1MzLiBBbmQgb25lTkFORCBib290LCB3ZSBtYXAgb25lTkFORCBhdCBDUzAuCisJICogIFdlIGNvbmZpZ3VyZSBvbmx5IEdQTUMgQ1MwIHdpdGggcmVxdWlyZWQgdmFsdWVzLiBDb25maWdpcmluZyBvdGhlciBkZXZpY2VzCisJICogIGF0IG90aGVyIENTIGluIGRvbmUgaW4gdS1ib290IGFueXdheS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBib3RoZXIgZG9pbmcgaXQgaGVyZS4KKyAgICAgICAgICovCisJX19yYXdfd3JpdGVsKDAgLCBHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApOworCWRlbGF5KDEwMDApOworCisjaWZkZWYgQ0ZHX05BTkQKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKworI2Vsc2UgLyogQ0ZHX09ORU5BTkQgKi8KKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKyNlbmRpZgorCisJLyogRW5hYmxlIHRoZSBHUE1DIE1hcHBpbmcgKi8KKwlfX3Jhd193cml0ZWwoKCAoKE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgJiAweEYpPDw4KSB8CisJCSAgICAgKChPTUFQMzRYWF9HUE1DX0NTMF9NQVA+PjI0KSAmIDB4M0YpIHwKKwkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKwlkZWxheSgyMDAwKTsKKyNpZiBkZWZpbmVkKENGR19OQU5EKQorIAlpZiAobmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKwkJcHJpbnRmKCJVbnN1cHBvcnRlZCBDaGlwIVxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorI2VsaWYgZGVmaW5lZChDRkdfT05FTkFORCkKKwlpZiAob25lbmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKwkJcHJpbnRmKCJPbmVOQU5EIFVuc3VwcG9ydGVkICFcbiIpOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisjaWZkZWYgQ0ZHX0NNRF9GQVQKK3R5cGVkZWYgaW50IChtbWNfYm9vdF9hZGRyKSAodm9pZCk7CitpbnQgbW1jX2Jvb3Qodm9pZCkKK3sKKyAgICAgICBsb25nIHNpemUsIGk7CisgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBDRkdfTE9BREFERFI7CisgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKKyAgICAgICBjaGFyIGJ1ZlsxMl07CisgICAgICAgYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MgPSBOVUxMOworICAgICAgIGludCBkZXYgPSAwOworICAgICAgIGludCBwYXJ0ID0gMTsKKyAgICAgICBjaGFyICplcDsKKyAgICAgICB1bnNpZ25lZCBjaGFyIHJldCA9IDA7CisKKyAgICAgICBwcmludGYoIlN0YXJ0aW5nIFgtbG9hZGVyIG9uIE1NQyBcbiIpOworCisgICAgICAgcmV0ID0gbW1jX2luaXQoMSk7CisgICAgICAgaWYocmV0ID09IDApeworICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBNTUMgaW5pdCBmYWlsZWQgXG4iKTsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKworICAgICAgIGRldl9kZXNjID0gbW1jX2dldF9kZXYoMCk7CisgICAgICAgZmF0X3JlZ2lzdGVyX2RldmljZShkZXZfZGVzYywgMSk7CisgICAgICAgc2l6ZSA9IGZpbGVfZmF0X3JlYWQoInUtYm9vdC5iaW4iLCAodW5zaWduZWQgY2hhciAqKW9mZnNldCwgMCk7CisgICAgICAgaWYgKHNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKyAgICAgICBwcmludGYoIlxuJWxkIEJ5dGVzIFJlYWQgZnJvbSBNTUMgXG4iLCBzaXplKTsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgT1MgQm9vdGxvYWRlciBmcm9tIE1NQy4uLlxuIik7CisKKyAgICAgICAoKG1tY19ib290X2FkZHIgKikgQ0ZHX0xPQURBRERSKSAoKTsKKworICAgICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8qIG9wdGlvbmFsbHkgZG8gc29tZXRoaW5nIGxpa2UgYmxpbmtpbmcgTEVEICovCit2b2lkIGJvYXJkX2hhbmcgKHZvaWQpCit7IHdoaWxlICgwKSB7fTt9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODY5MjcwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8gCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogTk9URTogMzQzMCBYLWxvYWRlciBjdXJyZW50bHkgZG9lcyBub3QgdXNlIHRoaXMgY29kZS4gIAorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3RtZmQgc3AhLCB7cjQtcjZ9CisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI0LCBwbGxfY3RsX2FkZAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdCit3YWl0MToKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYmVxICAgICB3YWl0MSAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDEKKyAgICAgICAgc3RyICAgICByMSwgW3I1XSAgICAgICAgICAvKiBzZXQgbSwgbiwgbTIgKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQyCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgLyogc2V0IGwzL2w0Ly4uIGRpdmlkZXJzKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQzICAvKiB3a3VwICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsMyAgLyogcnNtIHZhbCAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIAorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQgCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAKKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1IAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAKKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLyAgICAgCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8gICAgICAgIAorCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworLyogVGhlIE5vciBoYXMgdG8gYmUgaW4gdGhlIEZsYXNoIEJhc2UgQ1MwIGZvciB0aGlzIGNvbmRpdGlvbiB0byBoYXBwZW4gKi8KK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUcxKQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkICAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUczKQorZmxhc2hfY2ZnM192YWw6IAorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc0KQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzUpCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTCAKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpIAorcGxsX2Rpdl9hZGQ0OgorICAgIC53b3JkIENNX0NMS1NFTF9HRlgKK3BsbF9kaXZfdmFsNDoKKyAgICAud29yZCAoR0ZYX0RJViA8PCAwKSAKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisKKyNlbmRpZgorCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworCWJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4gCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRSwweDA3LDB4MDUsMHgwMQorLyogRVMyICovCisud29yZCAweDBGQSwweDA1LDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwNSwweDA3LDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QsMHgwQywweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxRjQsMHgwQywweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTBBLDB4MEMsMHgwMywweDAxCisgCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5LDB4MTIsMHgwNCwweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxLDB4MTcsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDE3LDB4MDMsMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3RCwweDE5LDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDBGQSwweDBDLDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwQywweDA3LDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQSwweDMyLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDI3MSwweDJGLDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgyRiwweDAzLDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RCwweDA1LDB4MDcsMHgwMQorLyogRVMyICovCisud29yZCAweDBCNCwweDA1LDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwNSwweDA3LDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkEsMHgwQywweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNjgsMHgwQywweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTBBLDB4MEMsMHgwMywweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIsMHgwOSwweDA3LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEsMHgwQiwweDA2LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MTcsMHgwMywweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdELDB4MEMsMHgwNywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0LDB4MEMsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDBDLDB4MDcsMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTNGLDB4MzAsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxLDB4MTcsMHgwNiwweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDJGLDB4MDMsMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBDb3JlIERQTEwgdGFyZ2V0cyBmb3IgTDMgYXQgMTY2ICYgTDEzMyAqLworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8xMl9FUzEsTV8xMl9FUzEsRlNMXzEyX0VTMSxNMl8xMl9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8xMixOXzEyLEZTRUxfMTIsTTJfMTIKKy8qIDM0MTAgKi8KKy53b3JkIE1fMTIsTl8xMixGU0VMXzEyLE0yXzEyCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMTNfRVMxLE5fMTNfRVMxLEZTTF8xM19FUzEsTTJfMTNfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMTMsTl8xMyxGU0VMXzEzLE0yXzEzCisvKiAzNDEwICovCisud29yZCBNXzEzLE5fMTMsRlNFTF8xMyxNMl8xMworCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMTlwMl9FUzEsTl8xOXAyX0VTMSxGU0xfMTlwMl9FUzEsTTJfMTlwMl9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8xOXAyLE5fMTlwMixGU0VMXzE5cDIsTTJfMTlwMgorLyogMzQxMCAqLworLndvcmQgTV8xOXAyLE5fMTlwMixGU0VMXzE5cDIsTTJfMTlwMgorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCBNXzI2X0VTMSxOXzI2X0VTMSxGU0xfMjZfRVMxLE0yXzI2X0VTMQorLyogRVMyICovCisud29yZCBNXzI2LE5fMjYsRlNFTF8yNixNMl8yNgorLyogMzQxMCAqLworLndvcmQgTV8yNixOXzI2LEZTRUxfMjYsTTJfMjYKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCBNXzM4cDRfRVMxLE5fMzhwNF9FUzEsRlNMXzM4cDRfRVMxLE0yXzM4cDRfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMzhwNCxOXzM4cDQsRlNFTF8zOHA0LE0yXzM4cDQKKy8qIDM0MTAgKi8KKy53b3JkIE1fMzhwNCxOXzM4cDQsRlNFTF8zOHA0LE0yXzM4cDQKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOCwweDA1LDB4MDcsMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAsMHgwQywweDAzLDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMSwweDA5LDB4MDcsMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOCwweDBDLDB4MDcsMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxLDB4MTMsMHgwNywweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC94LWxvYWQubGRzIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDAyZjc0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAveC1sb2FkLmxkcwpAQCAtMCwwICsxLDU0IEBACisvKgorICogTm92ZW1iZXIgMjAwNiAtIENoYW5nZWQgdG8gc3VwcG9ydCAzNDMwc2RwIGRldmljZSAKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzIAorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzOTljNWIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IG9tYXAzZXZtLm8gCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE0NWVjMjIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9jb25maWcubWsKQEAgLTAsMCArMSwxOSBAQAorIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBPTUFQM0VWTSBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzIworIworIyBPTUFQM0VWTSBoYXMgMSBiYW5rIG9mIDEyOE1CIG1QT1AtU0RSQU0gb24gQ1MwCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisKKyMgRm9yIHVzZSBpZiB5b3Ugd2FudCBYLUxvYWRlciB0byByZWxvY2F0ZSBmcm9tIFNSQU0gdG8gRERSCisjVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCitURVhUX0JBU0UgPSAweDQwMjAwODAwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9vbWFwM2V2bS5jIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vb21hcDNldm0uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZDdiOTk0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vb21hcDNldm0uYwpAQCAtMCwwICsxLDEyMzkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisgICAgICAgIHVuc2lnbmVkIGludCBtOworICAgICAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGZzZWw7CisgICAgICAgIHVuc2lnbmVkIGludCBtMjsKK307CisKK3N0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0geworCXVuc2lnbmVkIGludCBzeXNfY2xrOworCXVuc2lnbmVkIGludCBtOworCXVuc2lnbmVkIGludCBuOworCXVuc2lnbmVkIGludCBtMjsKKwl1bnNpZ25lZCBpbnQgbTM7CisJdW5zaWduZWQgaW50IG00OworCXVuc2lnbmVkIGludCBtNTsKKwl1bnNpZ25lZCBpbnQgbTY7CisJdW5zaWduZWQgaW50IG0yZGl2OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBsbF9wYXJhbSBkcGxsX3BhcmFtOworCisjZGVmaW5lIE1BWF9TSUxfSU5ERVgJMworCisvKiBGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIGxvd2xldmVsX2luaXQuUyAqLworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF8zNnhfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworZXh0ZXJuIGludCBtbWNfaW5pdChpbnQgdmVyYm9zZSk7CitleHRlcm4gYmxvY2tfZGV2X2Rlc2NfdCAqbW1jX2dldF9kZXYoaW50IGRldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkZWxheQorICogRGVzY3JpcHRpb246IHNwaW5uaW5nIGRlbGF5IHRvIHVzZSBiZWZvcmUgdWRlbGF5IHdvcmtzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIihsb29wcykpOworfQorCit2b2lkIHVkZWxheSAodW5zaWduZWQgbG9uZyB1c2VjcykgeworCWRlbGF5KHVzZWNzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBib2FyZF9pbml0CisgKiBEZXNjcmlwdGlvbjogRWFybHkgaGFyZHdhcmUgaW5pdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdldF9kZXZpY2VfdHlwZSgpOiB0ZWxsIGlmIEdQL0hTL0VNVS9UU1QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9kZXZpY2VfdHlwZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChERVZJQ0VfTUFTSyk7CisgICAgICAgIHJldHVybihtb2RlID4+PSA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkgLSByZXR1cm4gU1lTX0JPT1RbNDowXQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfc3lzYm9vdF92YWx1ZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChTWVNCT09UX01BU0spOworICAgICAgICByZXR1cm4gbW9kZTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBnZXRfbWVtX3R5cGUodm9pZCkgLSByZXR1cm5zIHRoZSBraW5kIG9mIG1lbW9yeSBjb25uZWN0ZWQKKyAqIHRvIEdQTUMgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIGJvb3QgZm9ybS4gVXNlcyBTWVMgQk9PVCBzZXR0aW5ncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9tZW1fdHlwZSh2b2lkKQoreworICAgICAgICB1MzIgICBtZW1fdHlwZSA9IGdldF9zeXNib290X3ZhbHVlKCk7CisgICAgICAgIHN3aXRjaCAobWVtX3R5cGUpeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIGNhc2UgMjI6ICAgIHJldHVybiBHUE1DX09ORU5BTkQ7CisKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgIGNhc2UgMjc6ICAgIHJldHVybiBHUE1DX05BTkQ7CisKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNhc2UgNjogICAgIHJldHVybiBNTUNfT05FTkFORDsKKworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgY2FzZSAyNjogICAgcmV0dXJuIEdQTUNfTURPQzsKKworICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICBjYXNlIDI0OglyZXR1cm4gTU1DX05BTkQ7CisKKyAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICBkZWZhdWx0OiAgICByZXR1cm4gR1BNQ19OT1I7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfY3B1X3Jldih2b2lkKQoreworCXUzMiBjcHVpZD0wOworCS8qIE9uIEVTMS4wIHRoZSBJRENPREUgcmVnaXN0ZXIgaXMgbm90IGV4cG9zZWQgb24gTDQKKwkgKiBzbyB1c2luZyBDUFUgSUQgdG8gZGlmZmVyZW50aWF0ZQorCSAqIGJldHdlZW4gRVMyLjAgYW5kIEVTMS4wLgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChjcHVpZCkpOworCWlmKChjcHVpZCAgJiAweGYpID09IDB4MCkKKwkJcmV0dXJuIENQVV8zNDMwX0VTMTsKKwllbHNlCisJCXJldHVybiBDUFVfMzQzMF9FUzI7CisKK30KKwordTMyIGlzX2NwdV9mYW1pbHkodm9pZCkKK3sKKwl1MzIgY3B1aWQgPSAwLCBjcHVfZmFtaWx5ID0gMDsKKwl1MTYgaGF3a2V5ZTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiKGNwdWlkKSk7CisJaWYgKChjcHVpZCAmIDB4ZikgPT0gMHgwKSB7CisJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisJfSBlbHNlIHsKKwkJY3B1aWQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9DT05UUk9MX0lEKTsKKwkJaGF3a2V5ZSAgPSAoY3B1aWQgPj4gSEFXS0VZRV9TSElGVCkgJiAweGZmZmY7CisKKwkJc3dpdGNoIChoYXdrZXllKSB7CisJCQljYXNlIEhBV0tFWUVfT01BUDM0WFg6CisJCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSEFXS0VZRV9BTTM1WFg6CisJCQkJY3B1X2ZhbWlseSA9IENQVV9BTTM1WFg7CisJCQkJYnJlYWs7CisJCQljYXNlIEhBV0tFWUVfT01BUDM2WFg6CisJCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzZYWDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gY3B1X2ZhbWlseTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNwdV9pc18zNDEwKHZvaWQpIC0gcmV0dXJucyB0cnVlIGZvciAzNDEwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGNwdV9pc18zNDEwKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpZihnZXRfY3B1X3JldigpIDwgQ1BVXzM0MzBfRVMyKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHJlYWQgc2NhbGFiaWxpdHkgc3RhdHVzIGFuZCByZXR1cm4gMSBmb3IgMzQxMCovCisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMpOworCQkvKiBDaGVjayB3aGV0aGVyIE1QVSBmcmVxdWVuY3kgaXMgc2V0IHRvIDI2NiBNSHogd2hpY2gKKwkJICogaXMgbm9taW5hbCBmb3IgMzQxMC4gSWYgeWVzIHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkJICovCisJCWlmICgoKHN0YXR1cyA+PiA4KSAmIDB4MykgPT0gMHgyKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzcjMyIC0gY2xlYXIgJiBzZXQgYSB2YWx1ZSBpbiBhIGJpdCByYW5nZSBmb3IgYSAzMiBiaXQgYWRkcmVzcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgdG1wLCBtc2sgPSAwOworCW1zayA9IDEgPDwgbnVtX2JpdHM7CisJLS1tc2s7CisJdG1wID0gX19yYXdfcmVhZGwoYWRkcikgJiB+KG1zayA8PCBzdGFydF9iaXQpOworCXRtcCB8PSAgdmFsdWUgPDwgc3RhcnRfYml0OworCV9fcmF3X3dyaXRlbCh0bXAsIGFkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YWl0X29uX3ZhbHVlKCkgLSBjb21tb24gcm91dGluZSB0byBhbGxvdyB3YWl0aW5nIGZvciBjaGFuZ2VzIGluCisgKiAgIHZvbGF0aWxlIHJlZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHdhaXRfb25fdmFsdWUodTMyIHJlYWRfYml0X21hc2ssIHUzMiBtYXRjaF92YWx1ZSwgdTMyIHJlYWRfYWRkciwgdTMyIGJvdW5kKQoreworCXUzMiBpID0gMCwgdmFsOworCWRvIHsKKwkJKytpOworCQl2YWwgPSBfX3Jhd19yZWFkbChyZWFkX2FkZHIpICYgcmVhZF9iaXRfbWFzazsKKwkJaWYgKHZhbCA9PSBtYXRjaF92YWx1ZSkKKwkJCXJldHVybiAoMSk7CisJCWlmIChpID09IGJvdW5kKQorCQkJcmV0dXJuICgwKTsKKwl9IHdoaWxlICgxKTsKK30KKworI2lmZGVmIENGR19PTUFQRVZNX0REUgorI2lmZGVmIENPTkZJR19ERFJfMjU2TUJfU1RBQ0tFRAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtYWtlX2NzMV9jb250aWd1b3VzKCkgLSBmb3IgZXMyIGFuZCBhYm92ZSByZW1hcCBjczEgYmVoaW5kIGNzMCB0byBhbGxvdworICogIGNvbW1hbmQgbGluZSBtZW09eHl6IHVzZSBhbGwgbWVtb3J5IHdpdGggb3V0IGRpc2NvbnRpbnVvdXMgc3VwcG9ydAorICogIGNvbXBpbGVkIGluLiAgQ291bGQgZG8gaXQgYXQgdGhlIEFUQUcsIGJ1dCB0aGVyZSByZWFsbHkgaXMgdHdvIGJhbmtzLi4uCisgKiBDYWxsZWQgYXMgcGFydCBvZiAybmQgcGhhc2UgRERSIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG1ha2VfY3MxX2NvbnRpZ3VvdXModm9pZCkKK3sKKwl1MzIgc2l6ZSwgYV9hZGRfbG93LCBhX2FkZF9oaWdoOworCisJc2l6ZSA9IGdldF9zZHJfY3Nfc2l6ZShTRFJDX0NTMF9PU0VUKTsKKwlzaXplIC89IFNaXzMyTTsgICAgICAgICAvKiBmaW5kIHNpemUgdG8gb2Zmc2V0IENTMSAqLworCWFfYWRkX2hpZ2ggPSAoc2l6ZSAmIDMpIDw8IDg7ICAgLyogc2V0IHVwIGxvdyBmaWVsZCAqLworCWFfYWRkX2xvdyA9IChzaXplICYgMHgzQykgPj4gMjsgLyogc2V0IHVwIGhpZ2ggZmllbGQgKi8KKwlfX3Jhd193cml0ZWwoKGFfYWRkX2hpZ2ggfCBhX2FkZF9sb3cpLCBTRFJDX0NTX0NGRyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NzMF9zaXplKCkgLSBnZXQgc2l6ZSBvZiBjaGlwIHNlbGVjdCAwLzEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X3Nkcl9jc19zaXplKHUzMiBvZmZzZXQpCit7CisJdTMyIHNpemU7CisKKwkvKiBnZXQgcmFtIHNpemUgZmllbGQgKi8KKwlzaXplID0gX19yYXdfcmVhZGwoU0RSQ19NQ0ZHXzAgKyBvZmZzZXQpID4+IDg7CisJc2l6ZSAmPSAweDNGRjsgICAgICAgICAgLyogcmVtb3ZlIHVud2FudGVkIGJpdHMgKi8KKwlzaXplICo9IFNaXzJNOyAgICAgICAgICAvKiBmaW5kIHNpemUgaW4gTUIgKi8KKwlyZXR1cm4gc2l6ZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjb25maWdfMzQzMHNkcmFtX2RkcigpIC0gSW5pdCBERFIgb24gMzQzMFNEUCBkZXYgYm9hcmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjb25maWdfMzQzMHNkcmFtX2Rkcih2b2lkKQoreworCisjaWZuZGVmIENPTkZJR19ERFJfMjU2TUJfU1RBQ0tFRAorCS8qIHJlc2V0IHNkcmMgY29udHJvbGxlciAqLworCV9fcmF3X3dyaXRlbChTT0ZUUkVTRVQsIFNEUkNfU1lTQ09ORklHKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIEJJVDAsIFNEUkNfU1RBVFVTLCAxMjAwMDAwMCk7CisJX19yYXdfd3JpdGVsKDAsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qIHNldHVwIHNkcmMgdG8gYmFsbCBtdXggKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCS8qIHNldCBtZGNmZyAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCisJLyogc2V0IHRpbWluZyAqLworCWlmIChpc19jcHVfZmFtaWx5KCkgPT0gQ1BVX09NQVAzNlhYKSB7CisJCV9fcmF3X3dyaXRlbChIWU5JWF9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJCV9fcmF3X3dyaXRlbChIWU5JWF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisKKwl9IGVsc2UgeworCQlpZiAoKGdldF9tZW1fdHlwZSgpID09IEdQTUNfT05FTkFORCkgfHwgKGdldF9tZW1fdHlwZSgpID09IE1NQ19PTkVOQU5EKSl7CisJCQlfX3Jhd193cml0ZWwoSU5GSU5FT05fU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCQkJX19yYXdfd3JpdGVsKElORklORU9OX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwkJfQorCQlpZiAoKGdldF9tZW1fdHlwZSgpID09IEdQTUNfTkFORCkgfHwoZ2V0X21lbV90eXBlKCkgPT0gTU1DX05BTkQpKXsKKwkJCV9fcmF3X3dyaXRlbChNSUNST05fU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCQkJX19yYXdfd3JpdGVsKE1JQ1JPTl9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJCX0KKwkgfQorCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1JGUl9DVFJMLCBTRFJDX1JGUl9DVFJMKTsKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfUE9XRVJfUE9QLCBTRFJDX1BPV0VSKTsKKworCS8qIGluaXQgc2VxdWVuY2UgZm9yIG1ERFIvbVNEUiB1c2luZyBtYW51YWwgY29tbWFuZHMgKEREUiBpcyBkaWZmZXJlbnQpICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCWRlbGF5KDUwMDApOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKworCS8qIHNldCBtcjAgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMCk7CisKKwkvKiBzZXQgdXAgZGxsICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQV9DVFJMKTsKKwlkZWxheSgweDIwMDApOwkvKiBnaXZlIHRpbWUgdG8gbG9jayAqLworI2Vsc2UKKyAgICAgICAvKiByZXNldCBzZHJjIGNvbnRyb2xsZXIgKi8KKyAgICAgICAgIF9fcmF3X3dyaXRlbChTT0ZUUkVTRVQsIFNEUkNfU1lTQ09ORklHKTsKKyAgICAgICAgIHdhaXRfb25fdmFsdWUoQklUMCwgQklUMCwgU0RSQ19TVEFUVVMsIDEyMDAwMDAwKTsKKyAgICAgICAgIF9fcmF3X3dyaXRlbCgwLCBTRFJDX1NZU0NPTkZJRyk7CisKKyAgICAgICAgIC8qIHNldHVwIHNkcmMgdG8gYmFsbCBtdXggKi8KKyAgICAgICAgIF9fcmF3X3dyaXRlbChTRFBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisgICAgICAgICAvKiBTRFJDX01DRkcwIHJlZ2lzdGVyICovCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwODApID0gMHgwMjU4NDA5OTsvL2Zyb20gTWljcm9uCisKKwkgaWYgKGlzX2NwdV9mYW1pbHkoKSA9PSBDUFVfT01BUDM2WFgpIHsKKwkJIC8qIFNEUkNfQUNUSU1fQ1RSTEEwIHJlZ2lzdGVyICovCisJCSAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwOWMpID0gMHg5MmUxYzRjNjsvLyBmb3IgMjAwTQorCQkgLyogU0RSQ19BQ1RJTV9DVFJMQjAgcmVnaXN0ZXIgKi8KKwkJICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDBhMCkgPSAweDAwMDIxMTFjOworCSB9IGVsc2UgeworCQkgLyogU0RSQ19BQ1RJTV9DVFJMQTAgcmVnaXN0ZXIgKi8KKwkJICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDA5YykgPSAweGFhOWRiNGM2Oy8vIGZvciAxNjZNIGZyb20gcmt3CisJCSAvKiBTRFJDX0FDVElNX0NUUkxCMCByZWdpc3RlciAqLworCQkgKCoodW5zaWduZWQgaW50KikweDZEMDAwMGEwKSA9IDB4MDAwMTE1MTc7CisJIH0KKworCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwYTQpID0weDAwMDREQzAxOworCisgICAgICAgICAvKiBEaXNibGUgUG93ZXIgRG93biBvZiBDS0UgY3V6IG9mIDEgQ0tFIG9uIGNvbWJvIHBhcnQgKi8KKyAgICAgICAgICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDA3MCkgPSAweDAwMDAwMDgxOworCisgICAgICAgICAvKiBTRFJDX01hbnVhbCBjb21tYW5kIHJlZ2lzdGVyICovCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwYTgpID0gMHgwMDAwMDAwMDsgLy8gTk9QIGNvbW1hbmQKKyAgICAgICAgIGRlbGF5KDUwMDApOworICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMGE4KSA9IDB4MDAwMDAwMDE7IC8vIFByZWNoYXJnZSBjb21tYW5kCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwYTgpID0gMHgwMDAwMDAwMjsgLy8gQXV0by1yZWZyZXNoIGNvbW1hbmQKKyAgICAgICAgICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDBhOCkgPSAweDAwMDAwMDAyOyAvLyBBdXRvLXJlZnJlc2ggY29tbWFuZAorCisgICAgICAgICAvKiBTRFJDIE1SMCByZWdpc3RlciAqLworICAgICAgICAgKCooaW50KikweDZEMDAwMDg0KSA9IDB4MDAwMDAwMzI7IC8vIEJ1cnN0IGxlbmd0aCA9NAorICAgICAgICAgLy8gQ0FTIGxhdGVuY3kgPSAzCisgICAgICAgICAvLyBXcml0ZSBCdXJzdCA9IFJlYWQgQnVyc3QKKyAgICAgICAgIC8vIFNlcmlhbCBNb2RlCisKKyAgICAgICAgIC8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwNjApID0gMHgwMDAwQTsKKyAgICAgICAgIGRlbGF5KDB4MjAwMDApOyAvLyBzb21lIGRlbGF5CisKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0REUl8yNTZNQl9TVEFDS0VECisJbWFrZV9jczFfY29udGlndW91cygpOworCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCArIFNEUkNfQ1MxX09TRVQpOworCV9fcmF3X3dyaXRlbChNSUNST05fU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzEpOworCV9fcmF3X3dyaXRlbChNSUNST05fU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzEpOworCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1JGUl9DVFJMLCBTRFJDX1JGUl9DVFJMICsgU0RSQ19DUzFfT1NFVCk7CisJLyogaW5pdCBzZXF1ZW5jZSBmb3IgbUREUi9tU0RSIHVzaW5nIG1hbnVhbCBjb21tYW5kcyAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wICsgU0RSQ19DUzFfT1NFVCk7CisJZGVsYXkoNTAwMCk7ICAgLyogc3VwcG9zZWQgdG8gYmUgMTAwdXMgcGVyIGRlc2lnbiBzcGVjIGZvciBtZGRyL21zZHIgKi8KKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCArIFNEUkNfQ1MxX09TRVQpOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzAgKyBTRFJDX0NTMV9PU0VUKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wICsgU0RSQ19DUzFfT1NFVCk7CisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01SXzBfRERSLCBTRFJDX01SXzAgKyBTRFJDX0NTMV9PU0VUKTsKKyNlbmRpZgorfQorI2VuZGlmIC8qIENGR19PTUFQRVZNX0REUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtfc3BlZWQgLSBkZXRlcm1pbmUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQKKyAqICBiYXNlZCBvbiBrbm93biAzMmtIeiBjbG9jayBhbmQgZ3B0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCBjZGl2LCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCisJaWYgKHZhbCAmIEJJVDcpCisJCWNkaXYgPSAyOworCWVsc2UgaWYgKHZhbCAmIEJJVDYpCisJCWNkaXYgPSAxOworCWVsc2UKKwkJLyoKKwkJICogU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUhCisJCSAqIFRCRDogQWRkIGEgV0FSTigpL0JVRygpCisJCSAqICAgICAgRm9yIG5vdywgYXNzdW1lIGRpdmlkZXIgYXMgMS4KKwkJICovCisJCWNkaXYgPSAxOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCWlmIChjZGl2ID09IDIpCisJeworCQljZGlmZiAqPSAyOworCX0KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa2luX3NlbCgpIC0gcmV0dXJucyB0aGUgc3lzX2Nsa2luX3NlbCBmaWVsZCB2YWx1ZSBiYXNlZCBvbgorICogICAtLSBpbnB1dCBvc2NpbGxhdG9yIGNsb2NrIGZyZXF1ZW5jeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGdldF9zeXNfY2xraW5fc2VsKHUzMiBvc2NfY2xrLCB1MzIgKnN5c19jbGtpbl9zZWwpCit7CisJaWYob3NjX2NsayA9PSBTMzhfNE0pCisJCSpzeXNfY2xraW5fc2VsPSAgNDsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzI2TSkKKwkJKnN5c19jbGtpbl9zZWwgPSAzOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTlfMk0pCisJCSpzeXNfY2xraW5fc2VsID0gMjsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEzTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAxOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDA7Cit9CisKKy8qCisgKiBPTUFQMzR4LzM1eCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQgZHBsbDNfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNFgpOwkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIGRwbGw0X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyID0gcHRyICsgY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA1LCBQRVJfTTZYMik7CQkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJCS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkJLyogc2V0IE00ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA1LCBQRVJfTTNYMik7CQkvKiBzZXQgTTMgKi8KKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKFBFUklQSF9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbMjA6MjNdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCkgOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIG1wdV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKE1QVV9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX01QVVs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBwdHItPmZzZWwpOworfQorCitzdGF0aWMgdm9pZCBpdmFfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChJVkEyX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfSVZBMls0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqIE9NQVAzNjMwIHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZCBkcGxsM19pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM2WCk7CQkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIGRwbGw0X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCXN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKnB0cjsKKworCXB0ciA9IChzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICopZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogTTYgKERJVl9EUExMNCk6IENNX0NMS1NFTDFfRU1VWzI0OjI5XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA2LCBwdHItPm02KTsKKworCS8qIE01IChDTEtTRUxfQ0FNKTogQ01fQ0xLU0VMMV9FTVVbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNiwgcHRyLT5tNSk7CisKKwkvKiBNNCAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDYsIHB0ci0+bTQpOworCisJLyogTTMgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1s4OjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNiwgcHRyLT5tMyk7CisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE5XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDEyLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBNMkRJViAoQ0xLU0VMXzk2TSk6IENNX0NMS1NFTF9DT1JFWzEyOjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDEyLCAyLCBwdHItPm0yZGl2KTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIG1wdV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fTVBVX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIGl2YV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwcmNtX2luaXQoKSAtIGluaXRzIGNsb2NrcyBmb3IgUFJDTSBhcyBkZWZpbmVkIGluIGNsb2Nrcy5oCisgKiAgIC0tIGNhbGxlZCBmcm9tIFNSQU0sIG9yIEZsYXNoICh1c2luZyB0ZW1wIFNSQU0gc3RhY2spLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgb3NjX2Nsaz0wLCBzeXNfY2xraW5fc2VsOworCXUzMiBjbGtfaW5kZXgsIHNpbF9pbmRleDsKKworCS8qIEdhdWdlIHRoZSBpbnB1dCBjbG9jayBzcGVlZCBhbmQgZmluZCBvdXQgdGhlIHN5c19jbGtpbl9zZWwKKwkgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBjbG9jay4KKwkgKi8KKwlvc2NfY2xrID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChvc2NfY2xrLCAmc3lzX2Nsa2luX3NlbCk7CisKKwlzcjMyKFBSTV9DTEtTRUwsIDAsIDMsIHN5c19jbGtpbl9zZWwpOyAvKiBzZXQgaW5wdXQgY3J5c3RhbCBzcGVlZCAqLworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlLzIgKi8KKwkvKgorCSAqIE9uIE9NQVAzNjMwLCBERFIgZGF0YSBjb3JydXB0aW9uIGhhcyBiZWVuIG9ic2VydmVkIG9uIE9GRiBtb2RlCisJICogZXhpdCBpZiB0aGUgc3lzIGNsb2NrIHdhcyBsb3dlciB0aGFuIDI2TS4gQXMgYSB3b3JrIGFyb3VuZCwKKwkgKiBPTUFQMzYzMCBpcyBvcGVyYXRlZCBhdCAyNk0gc3lzIGNsb2NrIGFuZCB0aGlzIGludGVybmFsIGRpdmlzaW9uCisJICogaXMgbm90IHBlcmZvcm1lZC4KKwkgKi8KKwlpZigoaXNfY3B1X2ZhbWlseSgpICE9IENQVV9PTUFQMzZYWCkgJiYgKHN5c19jbGtpbl9zZWwgPiAyKSkgeworCQlzcjMyKFBSTV9DTEtTUkNfQ1RSTCwgNiwgMiwgMik7LyogaW5wdXQgY2xvY2sgZGl2aWRlciAqLworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsLzI7CisJfSBlbHNlIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDEpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbDsKKwl9CisKKwlpZiAoaXNfY3B1X2ZhbWlseSgpID09IENQVV9PTUFQMzZYWCkgeworCQlkcGxsM19pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCX0gZWxzZSB7CisJCXNpbF9pbmRleCA9IGdldF9jcHVfcmV2KCkgLSAxOworCisJCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCQkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCQkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUKKwkJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuCisJCSAqLworCisJCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJCWRwbGwzX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKworCQkvKiBMb2NrIE1QVSBEUExMIHRvIHNldCBmcmVxdWVuY3kgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisJfQorCisJLyogU2V0IHVwIEdQVGltZXJzIHRvIHN5c19jbGsgc291cmNlIG9ubHkgKi8KKyAJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCA4LCAweGZmKTsKKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAwLCAxLCAxKTsKKworCWRlbGF5KDUwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNlY3VyZV91bmxvY2sKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCBzZWN1cml0eSByZWdpc3RlcnMgZm9yIGFjY2VzcworICogKEdQIERldmljZSBvbmx5KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZWN1cmVfdW5sb2NrKHZvaWQpCit7CisJLyogUGVybWlzc2lvbiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAtRnVsbCBmbGVkZ2VkIHBlcm1pc3Npb25zIHRvIGFsbCAqLworCSNkZWZpbmUgVU5MT0NLXzEgMHhGRkZGRkZGRgorCSNkZWZpbmUgVU5MT0NLXzIgMHgwMDAwMDAwMAorCSNkZWZpbmUgVU5MT0NLXzMgMHgwMDAwRkZGRgorCS8qIFByb3RlY3Rpb24gTW9kdWxlIFJlZ2lzdGVyIFRhcmdldCBBUEUgKFBNX1JUKSovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRVFfSU5GT19QRVJNSVNTSU9OXzEpOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIFJUX0FERFJfTUFUQ0hfMSk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIE9DTV9BRERSX01BVENIXzIpOworCisJLyogSVZBIENoYW5nZXMgKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBTTVNfUkdfQVRUMCk7IC8qIFNEUkMgcmVnaW9uIDAgcHVibGljICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB0cnlfdW5sb2NrX3NyYW0oKQorICogRGVzY3JpcHRpb246IElmIGNoaXAgaXMgR1AgdHlwZSwgdW5sb2NrIHRoZSBTUkFNIGZvcgorICogIGdlbmVyYWwgdXNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0cnlfdW5sb2NrX21lbW9yeSh2b2lkKQoreworCWludCBtb2RlOworCisJLyogaWYgR1AgZGV2aWNlIHVubG9jayBkZXZpY2UgU1JBTSBmb3IgZ2VuZXJhbCB1c2UgKi8KKwkvKiBzZWN1cmUgY29kZSBicmVha3MgZm9yIFNlY3VyZS9FbXVsYXRpb24gZGV2aWNlIC0gSFMvRS9UKi8KKwltb2RlID0gZ2V0X2RldmljZV90eXBlKCk7CisJaWYgKG1vZGUgPT0gR1BfREVWSUNFKSB7CisJCXNlY3VyZV91bmxvY2soKTsKKwl9CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc19pbml0CisgKiBEZXNjcmlwdGlvbjogRG9lcyBlYXJseSBzeXN0ZW0gaW5pdCBvZiBtdXhpbmcgYW5kIGNsb2Nrcy4KKyAqIC0gQ2FsbGVkIGF0IHRpbWUgd2hlbiBvbmx5IHN0YWNrIGlzIGF2YWlsYWJsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHNfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKyNpZmRlZiBDT05GSUdfMzQzMF9BU18zNDEwCisJLyogc2V0dXAgdGhlIHNjYWxhYmlsaXR5IGNvbnRyb2wgcmVnaXN0ZXIgZm9yCisJICogMzQzMCB0byB3b3JrIGluIDM0MTAgbW9kZQorCSAqLworCV9fcmF3X3dyaXRlbCgweDVBQkYsQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX09DUCk7CisjZW5kaWYKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKwlkZWxheSgxMDApOworCXByY21faW5pdCgpOworCXBlcl9jbG9ja3NfZW5hYmxlKCk7CisJY29uZmlnXzM0MzBzZHJhbV9kZHIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG1pc2NfaW5pdF9yCisgKiBEZXNjcmlwdGlvbjogSW5pdCBldGhlcm5ldCAoZG9uZSBoZXJlIHNvIHVkZWxheSB3b3JrcykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRyYW1faW5pdAorICogRGVzY3JpcHRpb246IHNldHMgdWJvb3RzIGlkZWEgb2Ygc2RyYW0gc2l6ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTUMKKwkvKiBFbmFibGUgTU1DMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKKy8qIFNldCBNVVggZm9yIFVBUlQsIEdQTUMsIFNEUkMsIEdQSU8gKi8KKworLyoKKyAqIElFTiAgLSBJbnB1dCBFbmFibGUKKyAqIElESVMgLSBJbnB1dCBEaXNhYmxlCisgKiBQVEQgIC0gUHVsbCB0eXBlIERvd24KKyAqIFBUVSAgLSBQdWxsIHR5cGUgVXAKKyAqIERJUyAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGluYWN0aXZlCisgKiBFTiAgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBhY3RpdmUKKyAqIE0wICAgLSBNb2RlIDAKKyAqIFRoZSBjb21tZW50ZWQgc3RyaW5nIGdpdmVzIHRoZSBmaW5hbCBtdXggY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwaW4KKyAqLworI2RlZmluZSBNVVhfREVGQVVMVCgpXAorCU1VWF9WQUwoQ1AoU0RSQ19EMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzKi9cCisJTVVYX1ZBTChDUChTRFJDX0Q0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENSovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q3KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDgpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDExKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEzKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxOCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxOSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIxKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIzKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyOCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyOSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QzMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMxKi9cCisJTVVYX1ZBTChDUChTRFJDX0NMSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfQ0xLKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMyKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0ExKi9cCisJTVVYX1ZBTChDUChHUE1DX0EyKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTMpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNCksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E1KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTYpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E4KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTgqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTkpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMTApLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0ExMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QzKi9cCisJTVVYX1ZBTChDUChHUE1DX0Q0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENSovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q3KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDcqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDgpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0QxMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDExKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEzKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDE0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0QxNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDE1Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzApLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzEqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMiksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MyKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M0KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzQqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M1Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzYpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M3KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzcqL1wKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19DTEsqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLCAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQURWX0FMRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OT0UpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05PRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV0UpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQkUwX0NMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05CRTBfQ0xFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTEpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNjEqL1wKKwlNVVhfVkFMKENQKEdQTUNfTldQKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OV1AqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDApLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19XQUlUMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQxKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQyKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTQpKSAvKkdQSU9fNjQqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDMpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT182NSovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzg4Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE5KSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fODkqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMjApLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT185MCovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMSksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzkxKi9cCisJTVVYX1ZBTChDUChDQU1fV0VOKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTY3Ki9cCisJTVVYX1ZBTChDUChVQVJUMV9UWCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1RYKi9cCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfQ1RTKSwgICAgICAoSUVOIHwgUFRVIHwgRElTIHwgTTApKSAvKlVBUlQxX0NUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfUlgpLCAgICAgICAoSUVOIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JYKi9cCisJTVVYX1ZBTChDUChNQ0JTUDFfRFgpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTU4Ki9cCisJTVVYX1ZBTChDUChTWVNfMzJLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNZU18zMksqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzMgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNCAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT181ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184ICovXAorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzE4NiovXAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX25UUlNUKi9cCisJTVVYX1ZBTChDUChKVEFHX1RDSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVENLKi9cCisJTVVYX1ZBTChDUChKVEFHX1RNUyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVE1TKi9cCisJTVVYX1ZBTChDUChKVEFHX1RESSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVERJKi9cCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfRU1VMCovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTEqL1wKKwlNVVhfVkFMKENQKEVUS19DTEspLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMiovXAorCU1VWF9WQUwoQ1AoRVRLX0NUTCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzEzKi9cCisJTVVYX1ZBTChDUChFVEtfRDAgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTQqL1wKKwlNVVhfVkFMKENQKEVUS19EMSApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QyICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjQqL1wKKwlNVVhfVkFMKENQKEVUS19EMTEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjcqL1wKKwlNVVhfVkFMKENQKEVUS19EMTQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxNSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI5Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNldF9tdXhjb25mX3JlZ3MKKyAqIERlc2NyaXB0aW9uOiBTZXR0aW5nIHVwIHRoZSBjb25maWd1cmF0aW9uIE11eCByZWdpc3RlcnMKKyAqICAgICAgICAgICAgICBzcGVjaWZpYyB0byB0aGUgaGFyZHdhcmUuIE1hbnkgcGlucyBuZWVkCisgKiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQgZnJvbSBwcm90ZWN0IHRvIHByaW1hcnkgbW9kZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwlNVVhfREVGQVVMVCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbmFuZCtfaW5pdAorICogRGVzY3JpcHRpb246IFNldCB1cCBuYW5kIGZvciBuYW5kIGFuZCBqZmZzMiBjb21tYW5kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG5hbmRfaW5pdCh2b2lkKQoreworCS8qIGdsb2JhbCBzZXR0aW5ncyAqLworCV9fcmF3X3dyaXRlbCgweDEwLCBHUE1DX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBHUE1DX0lSUUVOQUJMRSk7CS8qIGlzcidzIHNvdXJjZXMgbWFza2VkICovCisJX19yYXdfd3JpdGVsKDAsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsvKiB0aW1lb3V0IGRpc2FibGUgKi8KKworCS8qIFNldCB0aGUgR1BNQyBWYWxzIC4gRm9yIE5BTkQgYm9vdCBvbiAzNDMwU0RQLCBOQU5EIGlzIG1hcHBlZCBhdCBDUzAKKyAgICAgICAgICogICwgTk9SIGF0IENTMSBhbmQgTVBEQiBhdCBDUzMuIEFuZCBvbmVOQU5EIGJvb3QsIHdlIG1hcCBvbmVOQU5EIGF0IENTMC4KKwkgKiAgV2UgY29uZmlndXJlIG9ubHkgR1BNQyBDUzAgd2l0aCByZXF1aXJlZCB2YWx1ZXMuIENvbmZpZ2lyaW5nIG90aGVyIGRldmljZXMKKwkgKiAgYXQgb3RoZXIgQ1MgaW4gZG9uZSBpbiB1LWJvb3QgYW55d2F5LiBTbyB3ZSBkb24ndCBoYXZlIHRvIGJvdGhlciBkb2luZyBpdCBoZXJlLgorICAgICAgICAgKi8KKwlfX3Jhd193cml0ZWwoMCAsIEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCk7CisJZGVsYXkoMTAwMCk7CisKKwlpZiAoKGdldF9tZW1fdHlwZSgpID09IEdQTUNfTkFORCkgfHwgKGdldF9tZW1fdHlwZSgpID09IE1NQ19OQU5EKSl7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHMyArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNiArIEdQTUNfQ09ORklHX0NTMCk7CisKKyAgICAgICAgCS8qIEVuYWJsZSB0aGUgR1BNQyBNYXBwaW5nICovCisgICAgICAgIAlfX3Jhd193cml0ZWwoKCAoKE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgJiAweEYpPDw4KSB8CisgICAgICAgIAkJICAgICAoKE5BTkRfQkFTRV9BRFI+PjI0KSAmIDB4M0YpIHwKKyAgICAgICAgCQkgICAgICgxPDw2KSApLCAgKEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCkpOworICAgICAgICAJZGVsYXkoMjAwMCk7CisKKyAgICAgICAgIAlpZiAobmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKyAgICAgICAgCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKyNlbmRpZgorICAgICAgICAJCXJldHVybiAxOworICAgICAgICAJfQorCisJfQorCisJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX09ORU5BTkQpIHx8IChnZXRfbWVtX3R5cGUoKSA9PSBNTUNfT05FTkFORCkpeworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0ICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworCisgICAgICAgIAkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworICAgICAgICAJX19yYXdfd3JpdGVsKCggKChPTUFQMzRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorICAgICAgICAJCSAgICAgKChPTkVOQU5EX0JBU0U+PjI0KSAmIDB4M0YpIHwKKyAgICAgICAgCQkgICAgICgxPDw2KSApLCAgKEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCkpOworICAgICAgICAJZGVsYXkoMjAwMCk7CisKKyAgICAgICAgCWlmIChvbmVuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorICAgICAgICAJCXByaW50ZigiT25lTkFORCBVbnN1cHBvcnRlZCAhXG4iKTsKKyNlbmRpZgorICAgICAgICAJCXJldHVybiAxOworICAgICAgICAJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCit0eXBlZGVmIGludCAobW1jX2Jvb3RfYWRkcikgKHZvaWQpOworaW50IG1tY19ib290KHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKworICAgICAgIGxvbmcgc2l6ZSA9IDA7CisjaWZkZWYgQ0ZHX0NNRF9GQVQKKyAgICAgICBibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyA9IE5VTEw7CisgICAgICAgdW5zaWduZWQgY2hhciByZXQgPSAwOworCisgICAgICAgcHJpbnRmKCJTdGFydGluZyBYLWxvYWRlciBvbiBNTUNcbiIpOworCisgICAgICAgcmV0ID0gbW1jX2luaXQoMSk7CisgICAgICAgaWYocmV0ID09IDApeworICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBNTUMgaW5pdCBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgZGV2X2Rlc2MgPSBtbWNfZ2V0X2RldigwKTsKKyAgICAgICBmYXRfcmVnaXN0ZXJfZGV2aWNlKGRldl9kZXNjLCAxKTsKKyAgICAgICBzaXplID0gZmlsZV9mYXRfcmVhZCgidS1ib290LmJpbiIsIGJ1ZiwgMCk7CisgICAgICAgaWYgKHNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKyAgICAgICBwcmludGYoIlxuJWxkIEJ5dGVzIFJlYWQgZnJvbSBNTUNcbiIsIHNpemUpOworCisgICAgICAgcHJpbnRmKCJTdGFydGluZyBPUyBCb290bG9hZGVyIGZyb20gTU1DLi4uXG4iKTsKKyNlbmRpZgorICAgICAgIHJldHVybiBzaXplOworfQorCisvKiBvcHRpb25hbGx5IGRvIHNvbWV0aGluZyBsaWtlIGJsaW5raW5nIExFRCAqLwordm9pZCBib2FyZF9oYW5nICh2b2lkKQoreyB3aGlsZSAoMCkge307fQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzNhM2M0OAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL3BsYXRmb3JtLlMKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLgorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLworICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzEpCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzMpCitmbGFzaF9jZmczX3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc1KQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorCisjZW5kaWYKKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRQorLndvcmQgMHgwNworLndvcmQgMHgwNQorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDFGNAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5Cisud29yZCAweDEyCisud29yZCAweDA0Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDE5Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEKKy53b3JkIDB4MzIKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE2OAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDBCCisud29yZCAweDA2Cisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YKKy53b3JkIDB4MzAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MEUKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MTAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNEMKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgyMQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgxMworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyoKKyAqIFRhYmxlcyBmb3IgMzZ4LzM3eCBkZXZpY2VzCisgKgorICogKFBvcHVsYXRlZCBmb3IgMTNNSHogb25seSkKKyAqLworbXB1XzM2eF9kcGxsX3BhcmFtOgorLndvcmQgMzAwLCAxMiwgMCwgMQorLndvcmQgMzAwLCAxMiwgMCwgMQorLndvcmQgMzAwLCAxMiwgMCwgMQorLndvcmQgMzAwLCAxMiwgMCwgMQorCitpdmFfMzZ4X2RwbGxfcGFyYW06Cisud29yZCAxMCwgMCwgMCwgMQorLndvcmQgMTAsIDAsIDAsIDEKKy53b3JkIDEwLCAwLCAwLCAxCisud29yZCAxMCwgMCwgMCwgMQorCitjb3JlXzM2eF9kcGxsX3BhcmFtOgorLndvcmQgMjAwLCAxMiwgMCwgMQorLndvcmQgMjAwLCAxMiwgMCwgMQorLndvcmQgMjAwLCAxMiwgMCwgMQorLndvcmQgMjAwLCAxMiwgMCwgMQorCitwZXJfMzZ4X2RwbGxfcGFyYW06CisvKiAgICBTWVNDTEsgICAgIE0gICAgICBOICAgICAgTTIgICAgICBNMyAgICAgIE00ICAgICBNNSAgICAgIE02ICAgICAgbTJESVYgKi8KKy53b3JkIDI2MDAwLCAgICA0MzIsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQorLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEKKy53b3JkIDI2MDAwLCAgICA0MzIsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCisKKy5nbG9ibCBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtCitnZXRfMzZ4X21wdV9kcGxsX3BhcmFtOgorCWFkcglyMCwgbXB1XzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbQorZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGl2YV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtCitnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGNvcmVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtCitnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtOgorCWFkcglyMCwgcGVyXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDNldm0veC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWYzNTJkMwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIE5vdmVtYmVyIDIwMDYgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgMzQzMHNkcCBkZXZpY2UKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvb21hcDMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkcy5jZmcgYi94LWxvYWRlci9ib2FyZHMuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjM0NTQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZHMuY2ZnCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgTGlzdCBvZiBib2FyZHMKKyMKKyMgU3ludGF4OgorIyAgICAgICAgd2hpdGUtc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZW50cmllczsKKyMgICAgICAgIGVhY2ggZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorIworIyAgICAgICAgVGFyZ2V0bmFtZSAgQXJjaGl0ZWN0dXJlICBDUFUgIEJvYXJkbmFtZSAgVmVuZG9yICBTb0MKKyMKKyMgICAgICAgIFVudXNlZCBmaWVsZHMgY2FuIGJlIHNwZWNpZmllZCBhcyAiLSIsIG9yIG9taXR0ZWQgaWYgdGhleQorIyAgICAgICAgYXJlIHRoZSBsYXN0IGZpZWxkIG9uIHRoZSBsaW5lLgorIworIyAgICAgICAgTGluZXMgc3RhcnRpbmcgd2l0aCAnIycgYXJlIGNvbW1lbnRzLgorIyAgICAgICAgQmxhbmsgbGluZXMgYXJlIGlnbm9yZWQuCisjCisjIFRvIGtlZXAgdGhlIGxpc3Qgc29ydGVkLCB1c2Ugc29tZXRoaW5nIGxpa2UKKyMKKyMgICAgICAgIDouLCQhIHNvcnQgLWYgLWsyLDIgLWszLDMgLWs2LDYgLWs1LDUgLWsxLDEKKyMKKyMgVGFyZ2V0ICAgICAgICAgICAgQVJDSCAgICAgICBTb0MgICAgICAgICAgICAgQm9hcmQgbmFtZSAgICAgICAgVmVuZG9yICAgICAgICAgICAgICAgIFNvQworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RpYW1vbmQgICAgICAgICAgICAgYXJtICAgICAgICBvbWFwMyAgICAgICAgICAgZGlhbW9uZCAgICAgICAgICAgbmVzdAorajQ5ICAgICAgICAgICAgICAgICBhcm0gICAgICAgIG9tYXAzICAgICAgICAgICBqNDkgICAgICAgICAgICAgICBuZXN0CitqNDktdXNiLWxvYWRlciAgICAgIGFybSAgICAgICAgb21hcDMgICAgICAgICAgIGo0OS11c2ItbG9hZGVyICAgIG5lc3QKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NvbW1vbi9NYWtlZmlsZSBiL3gtbG9hZGVyL2NvbW1vbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmY3MmJhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY29tbW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsNTQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliY29tbW9uLmEKKworQU9CSlMJPQorCisjIGNvcmUKK0NPQkpTLXkgKz0gYm9vdG0ubworQ09CSlMteSArPSBtYWluLm8KK0NPQkpTLXkgKz0gY29uc29sZS5vCitDT0JKUy15ICs9IGltYWdlLm8KKworQ09CSlMJOj0gJChzb3J0ICQoQ09CSlMteSkpCitTUkNTCTo9ICQoQU9CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKEFPQkpTKSAkKENPQkpTKSkKKworQ1BQRkxBR1MgKz0gLUkuLgorCithbGw6CSQoTElCKSAkKEFPQkpTKQorCiskKExJQik6ICQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY29tbW9uL2Jvb3RtLmMgYi94LWxvYWRlci9jb21tb24vYm9vdG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJhMjIwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY29tbW9uL2Jvb3RtLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAgR3JhbnQgRXJpY2tzb24gPG1hcmF0aG9uOTZAZ21haWwuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0aGF0IGJvb3QgdGhlIHNlY29uZC1zdGFnZQorICogICAgICBib290IGxvYWRlciBmcm9tIG1lbW9yeSwgaW4gZWl0aGVyIHJhdywgYmluYXJ5IGZvcm1hdCBvcgorICogICAgICBpbiB1LWJvb3QgJ21raW1hZ2UnIGZvcm1hdC4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Ym9vdG0uaD4KKyNpbmNsdWRlIDxpbWFnZS5oPgorCit0eXBlZGVmIHZvaWQgKHNwbCkodm9pZCk7CisKK3N0YXRpYyB2b2lkIGV4ZWModWxvbmcgYWRkcmVzcywgY29uc3QgY2hhciAqd2hhdCkKK3sKKwlwcmludGYoIlxuU3RhcnRpbmcgJXMgLi4uIiwgd2hhdCk7CisKKwkoKHNwbCAqKWFkZHJlc3MpKCk7Cit9CisKK2ludCBib290bShjb25zdCB1aW50OF90ICpidWZmZXIpCit7CisJaW50IHN0YXR1cyA9IEJPT1RNX1NUQVRVU19GQUlMVVJFOworI2lmIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKQorCWNvbnN0IGludCBmb3JtYXQgPSBnZW5pbWdfZ2V0X2Zvcm1hdCgodm9pZCAqKWJ1ZmZlcik7CisJY29uc3QgaW1hZ2VfaGVhZGVyX3QgKiBoZWFkZXIgPSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKilidWZmZXI7CisKKwlzd2l0Y2ggKGZvcm1hdCkgeworCisJY2FzZSBJTUFHRV9GT1JNQVRfTEVHQUNZOgorCQlzdGF0dXMgPSBib290bV9pbWFnZShoZWFkZXIpOworCQlicmVhazsKKworCWNhc2UgSU1BR0VfRk9STUFUX0ZJVDoKKwkJcHJpbnRmKCJVbnN1cHBvcnRlZCBpbWFnZSBmb3JtYXQgRklUICglZClcbiIsIGZvcm1hdCk7CisJCWJyZWFrOworCisJY2FzZSBJTUFHRV9GT1JNQVRfSU5WQUxJRDoKKwlkZWZhdWx0OgorCQlwcmludGYoIlVua25vd24gb3IgaW52YWxpZCBpbWFnZSBmb3JtYXQgKCVkKVxuIiwgZm9ybWF0KTsKKwkJYnJlYWs7CisKKwl9CisjZWxzZQorCXN0YXR1cyA9IGJvb3RtX2JpbmFyeShidWZmZXIpOworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKSAqLworCisJcmV0dXJuIChzdGF0dXMpOworfQorCitpbnQgYm9vdG1fYmluYXJ5KGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlcikKK3sKKwkvKiBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4uICovCisKKwlleGVjKCh1bG9uZylidWZmZXIsICJzZWNvbmQtc3RhZ2UgYm9vdCBsb2FkZXIiKTsKKworCS8qIEhvd2V2ZXIsIGlmIGl0IGRvZXMsIHJldHVybiBmYWlsZWQgc3RhdHVzLiAqLworCisJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkKK2ludCBib290bV9pbWFnZShjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGVhZGVyKQoreworCWNvbnN0IGNoYXIgKiBmYWlsdXJlID0gTlVMTDsKKwljb25zdCBjaGFyICogdHlwZV9uYW1lID0gTlVMTDsKKwl1aW50MzJfdCBsb2FkLCBpbWFnZV9zdGFydCwgaW1hZ2VfbGVuOworCisJLyogRGlzcGxheSB0byBzdGFuZGFyZCBvdXRwdXQgdGhlIGltYWdlIGNvbnRlbnRzLiAqLworCisJaW1hZ2VfcHJpbnRfY29udGVudHMoaGVhZGVyKTsKKworCS8qIFZhbGlkYXRlIHRoZSBpbWFnZSBoZWFkZXIgYW5kIGltYWdlIGRhdGEgQ1JDcyAqLworCisJcHV0cygiICAgVmVyaWZ5aW5nIENoZWNrc3VtIC4uLiAiKTsKKworCXsKKwkJaWYgKCFpbWFnZV9jaGVja19oY3JjKGhlYWRlcikpIHsKKwkJCWZhaWx1cmUgPSAiSGVhZGVyIEludmFsaWRcbiI7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlpZiAoIWltYWdlX2NoZWNrX2RjcmMoaGVhZGVyKSkgeworCQkJZmFpbHVyZSA9ICJEYXRhIEludmFsaWRcbiI7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlwdXRzKCJPS1xuIik7CisKKwkvKiBXZSBPTkxZIHN1cHBvcnQgdW5jb21wcmVzc2VkIEFSTSBVLUJvb3QgZmlybXdhcmUgaW1hZ2VzLiBDaGVjaworCSAqIHRvIG1ha2Ugc3VyZSB0aGF0J3Mgd2hhdCB3ZSBhcmUgZ29pbmcgdG8gYm9vdC4KKwkgKi8KKworCWlmICghaW1hZ2VfY2hlY2tfdHlwZShoZWFkZXIsIElIX1RZUEVfRklSTVdBUkUpKSB7CisJCWZhaWx1cmUgPSAiSW1hZ2UgaXMgbm90IGEgZmlybXdhcmUgaW1hZ2VcbiI7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIWltYWdlX2NoZWNrX29zKGhlYWRlciwgSUhfT1NfVV9CT09UKSkgeworCQlmYWlsdXJlID0gIkltYWdlIGlzIG5vdCB1LWJvb3QgZmlybXdhcmVcbiI7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoaW1hZ2VfZ2V0X2NvbXAoaGVhZGVyKSAhPSBJSF9DT01QX05PTkUpIHsKKwkJZmFpbHVyZSA9ICJJbWFnZSBpcyBjb21wcmVzc2VkXG4iOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCFpbWFnZV9jaGVja190YXJnZXRfYXJjaChoZWFkZXIpKSB7CisJCWZhaWx1cmUgPSAiSW1hZ2UgaXMgbm90IGJ1aWx0IGZvciB0aGlzIHByb2Nlc3NvclxuIjsKKwkJZ290byBmYWlsOworCX0KKworCXR5cGVfbmFtZSA9IGdlbmltZ19nZXRfdHlwZV9uYW1lKGltYWdlX2dldF90eXBlKGhlYWRlcikpOworCisJcHJpbnRmKCIgICBMb2FkaW5nICVzIC4uLiAiLCB0eXBlX25hbWUpOworCisJeworCQlsb2FkID0gaW1hZ2VfZ2V0X2xvYWQoaGVhZGVyKTsKKwkJaW1hZ2Vfc3RhcnQgPSBpbWFnZV9nZXRfZGF0YShoZWFkZXIpOworCQlpbWFnZV9sZW4gPSBpbWFnZV9nZXRfZGF0YV9zaXplKGhlYWRlcik7CisKKwkJbWVtbW92ZV93ZCgodm9pZCAqKWxvYWQsICh2b2lkICopaW1hZ2Vfc3RhcnQsIGltYWdlX2xlbiwgQ0hVTktTWik7CisJfQorCisJcHV0cygiT0tcbiIpOworCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuLiAqLworCisJZXhlYyhsb2FkLCB0eXBlX25hbWUpOworCisJLyogSG93ZXZlciwgaWYgaXQgZG9lcywgcmV0dXJuIGZhaWxlZCBzdGF0dXMuICovCisKKyBmYWlsOgorCXB1dHMoZmFpbHVyZSk7CisKKwlyZXR1cm4gKEJPT1RNX1NUQVRVU19GQUlMVVJFKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NvbW1vbi9jb25zb2xlLmMgYi94LWxvYWRlci9jb21tb24vY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTNjYjcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jb21tb24vY29uc29sZS5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFBhb2xvIFNjYWZmYXJkaSwgQUlSVkVOVCBTQU0gcy5wLmEgLSBSSU1JTkkoSVRBTFkpLCBhcnNlbmlvQHRpbi5pdAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKwordm9pZCBwdXRzKGNvbnN0IGNoYXIgKnMpCit7CisJc2VyaWFsX3B1dHMocyk7Cit9CisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NvbW1vbi9pbWFnZS5jIGIveC1sb2FkZXIvY29tbW9uL2ltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxNmU5NQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NvbW1vbi9pbWFnZS5jCkBAIC0wLDAgKzEsMjU0MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOCBTZW1paGFsZgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA2CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgVVNFX0hPU1RDQworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisKKyNpZmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCisjaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSEFTX0RBVEFGTEFTSAorI2luY2x1ZGUgPGRhdGFmbGFzaC5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTE9HQlVGRkVSCisjaW5jbHVkZSA8bG9nYnVmZi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQorI2luY2x1ZGUgPHJ0Yy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxpbWFnZS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfRklUKSB8fCBkZWZpbmVkIChDT05GSUdfT0ZfTElCRkRUKQorI2luY2x1ZGUgPGZkdC5oPgorI2luY2x1ZGUgPGxpYmZkdC5oPgorI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKyNpbmNsdWRlIDx1LWJvb3QvbWQ1Lmg+CisjaW5jbHVkZSA8c2hhMS5oPgorCitzdGF0aWMgaW50IGZpdF9jaGVja19yYW1kaXNrIChjb25zdCB2b2lkICpmaXQsIGludCBvc19ub2Zmc2V0LAorCQl1aW50OF90IGFyY2gsIGludCB2ZXJpZnkpOworI2VuZGlmCisKKyNlbHNlCisjaW5jbHVkZSAibWtpbWFnZS5oIgorI2luY2x1ZGUgPHUtYm9vdC9tZDUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8aW1hZ2UuaD4KKyNlbmRpZiAvKiAhVVNFX0hPU1RDQyovCisKK3N0YXRpYyB0YWJsZV9lbnRyeV90IHVpbWFnZV9hcmNoW10gPSB7CisJewlJSF9BUkNIX0lOVkFMSUQsCU5VTEwsCQkiSW52YWxpZCBBUkNIIiwJfSwKKwl7CUlIX0FSQ0hfQUxQSEEsCQkiYWxwaGEiLAkiQWxwaGEiLAl9LAorCXsJSUhfQVJDSF9BUk0sCQkiYXJtIiwJCSJBUk0iLAkJfSwKKwl7CUlIX0FSQ0hfSTM4NiwJCSJ4ODYiLAkJIkludGVsIHg4NiIsCX0sCisJewlJSF9BUkNIX0lBNjQsCQkiaWE2NCIsCQkiSUE2NCIsCQl9LAorCXsJSUhfQVJDSF9NNjhLLAkJIm02OGsiLAkJIk02OEsiLAkJfSwKKwl7CUlIX0FSQ0hfTUlDUk9CTEFaRSwJIm1pY3JvYmxhemUiLAkiTWljcm9CbGF6ZSIsCX0sCisJewlJSF9BUkNIX01JUFMsCQkibWlwcyIsCQkiTUlQUyIsCQl9LAorCXsJSUhfQVJDSF9NSVBTNjQsCQkibWlwczY0IiwJIk1JUFMgNjQgQml0IiwJfSwKKwl7CUlIX0FSQ0hfTklPUzIsCQkibmlvczIiLAkiTklPUyBJSSIsCX0sCisJewlJSF9BUkNIX1BQQywJCSJwb3dlcnBjIiwJIlBvd2VyUEMiLAl9LAorCXsJSUhfQVJDSF9QUEMsCQkicHBjIiwJCSJQb3dlclBDIiwJfSwKKwl7CUlIX0FSQ0hfUzM5MCwJCSJzMzkwIiwJCSJJQk0gUzM5MCIsCX0sCisJewlJSF9BUkNIX1NILAkJInNoIiwJCSJTdXBlckgiLAl9LAorCXsJSUhfQVJDSF9TUEFSQywJCSJzcGFyYyIsCSJTUEFSQyIsCX0sCisJewlJSF9BUkNIX1NQQVJDNjQsCSJzcGFyYzY0IiwJIlNQQVJDIDY0IEJpdCIsCX0sCisJewlJSF9BUkNIX0JMQUNLRklOLAkiYmxhY2tmaW4iLAkiQmxhY2tmaW4iLAl9LAorCXsJSUhfQVJDSF9BVlIzMiwJCSJhdnIzMiIsCSJBVlIzMiIsCX0sCisJewktMSwJCQkiIiwJCSIiLAkJfSwKK307CisKK3N0YXRpYyB0YWJsZV9lbnRyeV90IHVpbWFnZV9vc1tdID0geworCXsJSUhfT1NfSU5WQUxJRCwJTlVMTCwJCSJJbnZhbGlkIE9TIiwJCX0sCisJewlJSF9PU19MSU5VWCwJImxpbnV4IiwJIkxpbnV4IiwJCX0sCisjaWYgZGVmaW5lZChDT05GSUdfTFlOWEtESSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorCXsJSUhfT1NfTFlOWE9TLAkibHlueG9zIiwJIkx5bnhPUyIsCQl9LAorI2VuZGlmCisJewlJSF9PU19ORVRCU0QsCSJuZXRic2QiLAkiTmV0QlNEIiwJCX0sCisJewlJSF9PU19SVEVNUywJInJ0ZW1zIiwJIlJURU1TIiwJCX0sCisJewlJSF9PU19VX0JPT1QsCSJ1LWJvb3QiLAkiVS1Cb290IiwJCX0sCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VMRikgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorCXsJSUhfT1NfUU5YLAkicW54IiwJCSJRTlgiLAkJCX0sCisJewlJSF9PU19WWFdPUktTLAkidnh3b3JrcyIsCSJWeFdvcmtzIiwJCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19JTlRFR1JJVFkpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKKwl7CUlIX09TX0lOVEVHUklUWSwiaW50ZWdyaXR5IiwJIklOVEVHUklUWSIsCQl9LAorI2VuZGlmCisjaWZkZWYgVVNFX0hPU1RDQworCXsJSUhfT1NfNF80QlNELAkiNF80YnNkIiwJIjRfNEJTRCIsCQl9LAorCXsJSUhfT1NfREVMTCwJImRlbGwiLAkJIkRlbGwiLAkJCX0sCisJewlJSF9PU19FU0lYLAkiZXNpeCIsCQkiRXNpeCIsCQkJfSwKKwl7CUlIX09TX0ZSRUVCU0QsCSJmcmVlYnNkIiwJIkZyZWVCU0QiLAkJfSwKKwl7CUlIX09TX0lSSVgsCSJpcml4IiwJCSJJcml4IiwJCQl9LAorCXsJSUhfT1NfTkNSLAkibmNyIiwJCSJOQ1IiLAkJCX0sCisJewlJSF9PU19PUEVOQlNELAkib3BlbmJzZCIsCSJPcGVuQlNEIiwJCX0sCisJewlJSF9PU19QU09TLAkicHNvcyIsCQkicFNPUyIsCQkJfSwKKwl7CUlIX09TX1NDTywJInNjbyIsCQkiU0NPIiwJCQl9LAorCXsJSUhfT1NfU09MQVJJUywJInNvbGFyaXMiLAkiU29sYXJpcyIsCQl9LAorCXsJSUhfT1NfU1ZSNCwJInN2cjQiLAkJIlNWUjQiLAkJCX0sCisjZW5kaWYKKwl7CS0xLAkJIiIsCQkiIiwJCQl9LAorfTsKKworc3RhdGljIHRhYmxlX2VudHJ5X3QgdWltYWdlX3R5cGVbXSA9IHsKKwl7CUlIX1RZUEVfSU5WQUxJRCwgICAgTlVMTCwJICAiSW52YWxpZCBJbWFnZSIsCX0sCisJewlJSF9UWVBFX0ZJTEVTWVNURU0sICJmaWxlc3lzdGVtIiwgIkZpbGVzeXN0ZW0gSW1hZ2UiLAl9LAorCXsJSUhfVFlQRV9GSVJNV0FSRSwgICAiZmlybXdhcmUiLAkgICJGaXJtd2FyZSIsCQl9LAorCXsJSUhfVFlQRV9LRVJORUwsCSAgICAia2VybmVsIiwJICAiS2VybmVsIEltYWdlIiwJfSwKKwl7CUlIX1RZUEVfTVVMVEksCSAgICAibXVsdGkiLAkgICJNdWx0aS1GaWxlIEltYWdlIiwJfSwKKwl7CUlIX1RZUEVfUkFNRElTSywgICAgInJhbWRpc2siLAkgICJSQU1EaXNrIEltYWdlIiwJfSwKKwl7CUlIX1RZUEVfU0NSSVBULCAgICAgInNjcmlwdCIsCSAgIlNjcmlwdCIsCQl9LAorCXsJSUhfVFlQRV9TVEFOREFMT05FLCAic3RhbmRhbG9uZSIsICJTdGFuZGFsb25lIFByb2dyYW0iLCB9LAorCXsJSUhfVFlQRV9GTEFURFQsICAgICAiZmxhdF9kdCIsICAgICJGbGF0IERldmljZSBUcmVlIiwJfSwKKwl7CUlIX1RZUEVfS1dCSU1BR0UsICAgImt3YmltYWdlIiwgICAiS2lya3dvb2QgQm9vdCBJbWFnZSIsfSwKKwl7CUlIX1RZUEVfSU1YSU1BR0UsICAgImlteGltYWdlIiwgICAiRnJlZXNjYWxlIGkuTVggQm9vdCBJbWFnZSIsfSwKKwl7CS0xLAkJICAgICIiLAkJICAiIiwJCQl9LAorfTsKKworc3RhdGljIHRhYmxlX2VudHJ5X3QgdWltYWdlX2NvbXBbXSA9IHsKKwl7CUlIX0NPTVBfTk9ORSwJIm5vbmUiLAkJInVuY29tcHJlc3NlZCIsCQl9LAorCXsJSUhfQ09NUF9CWklQMiwJImJ6aXAyIiwJImJ6aXAyIGNvbXByZXNzZWQiLAl9LAorCXsJSUhfQ09NUF9HWklQLAkiZ3ppcCIsCQkiZ3ppcCBjb21wcmVzc2VkIiwJfSwKKwl7CUlIX0NPTVBfTFpNQSwJImx6bWEiLAkJImx6bWEgY29tcHJlc3NlZCIsCX0sCisJewlJSF9DT01QX0xaTywJImx6byIsCQkibHpvIGNvbXByZXNzZWQiLAl9LAorCXsJLTEsCQkiIiwJCSIiLAkJCX0sCit9OworCit1aW50MzJfdCBjcmMzMiAodWludDMyX3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdWludCk7Cit1aW50MzJfdCBjcmMzMl93ZCAodWludDMyX3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdWludCwgdWludCk7CisjaWYgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKSB8fCBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorc3RhdGljIHZvaWQgZ2VuaW1nX3ByaW50X3RpbWUgKHRpbWVfdCB0aW1lc3RhbXApOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExlZ2FjeSBmb3JtYXQgcm91dGluZXMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpbWFnZV9jaGVja19oY3JjIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXVsb25nIGhjcmM7CisJdWxvbmcgbGVuID0gaW1hZ2VfZ2V0X2hlYWRlcl9zaXplICgpOworCWltYWdlX2hlYWRlcl90IGhlYWRlcjsKKworCS8qIENvcHkgaGVhZGVyIHNvIHdlIGNhbiBibGFuayBDUkMgZmllbGQgZm9yIHJlLWNhbGN1bGF0aW9uICovCisJbWVtbW92ZSAoJmhlYWRlciwgKGNoYXIgKiloZHIsIGltYWdlX2dldF9oZWFkZXJfc2l6ZSAoKSk7CisJaW1hZ2Vfc2V0X2hjcmMgKCZoZWFkZXIsIDApOworCisJaGNyYyA9IGNyYzMyICgwLCAodW5zaWduZWQgY2hhciAqKSZoZWFkZXIsIGxlbik7CisKKwlyZXR1cm4gKGhjcmMgPT0gaW1hZ2VfZ2V0X2hjcmMgKGhkcikpOworfQorCitpbnQgaW1hZ2VfY2hlY2tfZGNyYyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwl1bG9uZyBkYXRhID0gaW1hZ2VfZ2V0X2RhdGEgKGhkcik7CisJdWxvbmcgbGVuID0gaW1hZ2VfZ2V0X2RhdGFfc2l6ZSAoaGRyKTsKKwl1bG9uZyBkY3JjID0gY3JjMzJfd2QgKDAsICh1bnNpZ25lZCBjaGFyICopZGF0YSwgbGVuLCBDSFVOS1NaX0NSQzMyKTsKKworCXJldHVybiAoZGNyYyA9PSBpbWFnZV9nZXRfZGNyYyAoaGRyKSk7Cit9CisKKy8qKgorICogaW1hZ2VfbXVsdGlfY291bnQgLSBnZXQgY29tcG9uZW50IChzdWItaW1hZ2UpIGNvdW50CisgKiBAaGRyOiBwb2ludGVyIHRvIHRoZSBoZWFkZXIgb2YgdGhlIG11bHRpIGNvbXBvbmVudCBpbWFnZQorICoKKyAqIGltYWdlX211bHRpX2NvdW50KCkgcmV0dXJucyBudW1iZXIgb2YgY29tcG9uZW50cyBpbiBhIG11bHRpCisgKiBjb21wb25lbnQgaW1hZ2UuCisgKgorICogTm90ZTogbm8gY2hlY2tpbmcgb2YgdGhlIGltYWdlIHR5cGUgaXMgZG9uZSwgY2FsbGVyIG11c3QgcGFzcworICogYSB2YWxpZCBtdWx0aSBjb21wb25lbnQgaW1hZ2UuCisgKgorICogcmV0dXJuczoKKyAqICAgICBudW1iZXIgb2YgY29tcG9uZW50cworICovCit1bG9uZyBpbWFnZV9tdWx0aV9jb3VudCAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwl1bG9uZyBpLCBjb3VudCA9IDA7CisJdWludDMyX3QgKnNpemU7CisKKwkvKiBnZXQgc3RhcnQgb2YgdGhlIGltYWdlIHBheWxvYWQsIHdoaWNoIGluIGNhc2Ugb2YgbXVsdGkKKwkgKiBjb21wb25lbnQgaW1hZ2VzIHRoYXQgcG9pbnRzIHRvIGEgdGFibGUgb2YgY29tcG9uZW50IHNpemVzICovCisJc2l6ZSA9ICh1aW50MzJfdCAqKWltYWdlX2dldF9kYXRhIChoZHIpOworCisJLyogY291bnQgbm9uIGVtcHR5IHNsb3RzICovCisJZm9yIChpID0gMDsgc2l6ZVtpXTsgKytpKQorCQljb3VudCsrOworCisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIGltYWdlX211bHRpX2dldGltZyAtIGdldCBjb21wb25lbnQgZGF0YSBhZGRyZXNzIGFuZCBzaXplCisgKiBAaGRyOiBwb2ludGVyIHRvIHRoZSBoZWFkZXIgb2YgdGhlIG11bHRpIGNvbXBvbmVudCBpbWFnZQorICogQGlkeDogaW5kZXggb2YgdGhlIHJlcXVlc3RlZCBjb21wb25lbnQKKyAqIEBkYXRhOiBwb2ludGVyIHRvIGEgdWxvbmcgdmFyaWFibGUsIHdpbGwgaG9sZCBjb21wb25lbnQgZGF0YSBhZGRyZXNzCisgKiBAbGVuOiBwb2ludGVyIHRvIGEgdWxvbmcgdmFyaWFibGUsIHdpbGwgaG9sZCBjb21wb25lbnQgc2l6ZQorICoKKyAqIGltYWdlX211bHRpX2dldGltZygpIHJldHVybnMgc2l6ZSBhbmQgZGF0YSBhZGRyZXNzIGZvciB0aGUgcmVxdWVzdGVkCisgKiBjb21wb25lbnQgaW4gYSBtdWx0aSBjb21wb25lbnQgaW1hZ2UuCisgKgorICogTm90ZTogbm8gY2hlY2tpbmcgb2YgdGhlIGltYWdlIHR5cGUgaXMgZG9uZSwgY2FsbGVyIG11c3QgcGFzcworICogYSB2YWxpZCBtdWx0aSBjb21wb25lbnQgaW1hZ2UuCisgKgorICogcmV0dXJuczoKKyAqICAgICBkYXRhIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIGNvbXBvbmVudCwgaWYgaWR4IGlzIHZhbGlkCisgKiAgICAgMCBpbiBkYXRhIGFuZCBsZW4sIGlmIGlkeCBpcyBvdXQgb2YgcmFuZ2UKKyAqLwordm9pZCBpbWFnZV9tdWx0aV9nZXRpbWcgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIsIHVsb25nIGlkeCwKKwkJCXVsb25nICpkYXRhLCB1bG9uZyAqbGVuKQoreworCWludCBpOworCXVpbnQzMl90ICpzaXplOworCXVsb25nIG9mZnNldCwgY291bnQsIGltZ19kYXRhOworCisJLyogZ2V0IG51bWJlciBvZiBjb21wb25lbnQgKi8KKwljb3VudCA9IGltYWdlX211bHRpX2NvdW50IChoZHIpOworCisJLyogZ2V0IHN0YXJ0IG9mIHRoZSBpbWFnZSBwYXlsb2FkLCB3aGljaCBpbiBjYXNlIG9mIG11bHRpCisJICogY29tcG9uZW50IGltYWdlcyB0aGF0IHBvaW50cyB0byBhIHRhYmxlIG9mIGNvbXBvbmVudCBzaXplcyAqLworCXNpemUgPSAodWludDMyX3QgKilpbWFnZV9nZXRfZGF0YSAoaGRyKTsKKworCS8qIGdldCBhZGRyZXNzIG9mIHRoZSBwcm9wZXIgY29tcG9uZW50IGRhdGEgc3RhcnQsIHdoaWNoIG1lYW5zCisJICogc2tpcHBpbmcgc2l6ZXMgdGFibGUgKGFkZCAxIGZvciBsYXN0LCBudWxsIGVudHJ5KSAqLworCWltZ19kYXRhID0gaW1hZ2VfZ2V0X2RhdGEgKGhkcikgKyAoY291bnQgKyAxKSAqIHNpemVvZiAodWludDMyX3QpOworCisJaWYgKGlkeCA8IGNvdW50KSB7CisJCSpsZW4gPSB1aW1hZ2VfdG9fY3B1IChzaXplW2lkeF0pOworCQlvZmZzZXQgPSAwOworCisJCS8qIGdvIG92ZXIgYWxsIGluZGljZXMgcHJlY2VkaW5nIHJlcXVlc3RlZCBjb21wb25lbnQgaWR4ICovCisJCWZvciAoaSA9IDA7IGkgPCBpZHg7IGkrKykgeworCQkJLyogYWRkIHVwIGktdGggY29tcG9uZW50IHNpemUsIHJvdW5kaW5nIHVwIHRvIDQgYnl0ZXMgKi8KKwkJCW9mZnNldCArPSAodWltYWdlX3RvX2NwdSAoc2l6ZVtpXSkgKyAzKSAmIH4zIDsKKwkJfQorCisJCS8qIGNhbGN1bGF0ZSBpZHgtdGggY29tcG9uZW50IGRhdGEgYWRkcmVzcyAqLworCQkqZGF0YSA9IGltZ19kYXRhICsgb2Zmc2V0OworCX0gZWxzZSB7CisJCSpsZW4gPSAwOworCQkqZGF0YSA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbWFnZV9wcmludF90eXBlIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCWNvbnN0IGNoYXIgKm9zLCAqYXJjaCwgKnR5cGUsICpjb21wOworCisJb3MgPSBnZW5pbWdfZ2V0X29zX25hbWUgKGltYWdlX2dldF9vcyAoaGRyKSk7CisJYXJjaCA9IGdlbmltZ19nZXRfYXJjaF9uYW1lIChpbWFnZV9nZXRfYXJjaCAoaGRyKSk7CisJdHlwZSA9IGdlbmltZ19nZXRfdHlwZV9uYW1lIChpbWFnZV9nZXRfdHlwZSAoaGRyKSk7CisJY29tcCA9IGdlbmltZ19nZXRfY29tcF9uYW1lIChpbWFnZV9nZXRfY29tcCAoaGRyKSk7CisKKwlwcmludGYgKCIlcyAlcyAlcyAoJXMpXG4iLCBhcmNoLCBvcywgdHlwZSwgY29tcCk7Cit9CisKKy8qKgorICogaW1hZ2VfcHJpbnRfY29udGVudHMgLSBwcmludHMgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgbGVnYWN5IGZvcm1hdCBpbWFnZQorICogQHB0cjogcG9pbnRlciB0byB0aGUgbGVnYWN5IGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBwOiBwb2ludGVyIHRvIHByZWZpeCBzdHJpbmcKKyAqCisgKiBpbWFnZV9wcmludF9jb250ZW50cygpIGZvcm1hdHMgYSBtdWx0aSBsaW5lIGxlZ2FjeSBpbWFnZSBjb250ZW50cyBkZXNjcmlwdGlvbi4KKyAqIFRoZSByb3V0aW5lIHByaW50cyBvdXQgYWxsIGhlYWRlciBmaWVsZHMgZm9sbG93ZWQgYnkgdGhlIHNpemUvb2Zmc2V0IGRhdGEKKyAqIGZvciBNVUxUSS9TQ1JJUFQgaW1hZ2VzLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgbm8gcmV0dXJuZWQgcmVzdWx0cworICovCit2b2lkIGltYWdlX3ByaW50X2NvbnRlbnRzIChjb25zdCB2b2lkICpwdHIpCit7CisJY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkciA9IChjb25zdCBpbWFnZV9oZWFkZXJfdCAqKXB0cjsKKwljb25zdCBjaGFyICpwOworCisjaWZkZWYgVVNFX0hPU1RDQworCXAgPSAiIjsKKyNlbHNlCisJcCA9ICIgICAiOworI2VuZGlmCisKKwlwcmludGYgKCIlc0ltYWdlIE5hbWU6ICAgJS4qc1xuIiwgcCwgSUhfTk1MRU4sIGltYWdlX2dldF9uYW1lIChoZHIpKTsKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCisJcHJpbnRmICgiJXNDcmVhdGVkOiAgICAgICIsIHApOworCWdlbmltZ19wcmludF90aW1lICgodGltZV90KWltYWdlX2dldF90aW1lIChoZHIpKTsKKyNlbmRpZgorCXByaW50ZiAoIiVzSW1hZ2UgVHlwZTogICAiLCBwKTsKKwlpbWFnZV9wcmludF90eXBlIChoZHIpOworCXByaW50ZiAoIiVzRGF0YSBTaXplOiAgICAiLCBwKTsKKwlnZW5pbWdfcHJpbnRfc2l6ZSAoaW1hZ2VfZ2V0X2RhdGFfc2l6ZSAoaGRyKSk7CisJcHJpbnRmICgiJXNMb2FkIEFkZHJlc3M6ICUwOHhcbiIsIHAsIGltYWdlX2dldF9sb2FkIChoZHIpKTsKKwlwcmludGYgKCIlc0VudHJ5IFBvaW50OiAgJTA4eFxuIiwgcCwgaW1hZ2VfZ2V0X2VwIChoZHIpKTsKKworCWlmIChpbWFnZV9jaGVja190eXBlIChoZHIsIElIX1RZUEVfTVVMVEkpIHx8CisJCQlpbWFnZV9jaGVja190eXBlIChoZHIsIElIX1RZUEVfU0NSSVBUKSkgeworCQlpbnQgaTsKKwkJdWxvbmcgZGF0YSwgbGVuOworCQl1bG9uZyBjb3VudCA9IGltYWdlX211bHRpX2NvdW50IChoZHIpOworCisJCXByaW50ZiAoIiVzQ29udGVudHM6XG4iLCBwKTsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWltYWdlX211bHRpX2dldGltZyAoaGRyLCBpLCAmZGF0YSwgJmxlbik7CisKKwkJCXByaW50ZiAoIiVzICAgSW1hZ2UgJWQ6ICIsIHAsIGkpOworCQkJZ2VuaW1nX3ByaW50X3NpemUgKGxlbik7CisKKwkJCWlmIChpbWFnZV9jaGVja190eXBlIChoZHIsIElIX1RZUEVfU0NSSVBUKSAmJiBpID4gMCkgeworCQkJCS8qCisJCQkJICogdGhlIHVzZXIgbWF5IG5lZWQgdG8ga25vdyBvZmZzZXRzCisJCQkJICogaWYgcGxhbm5pbmcgdG8gZG8gc29tZXRoaW5nIHdpdGgKKwkJCQkgKiBtdWx0aXBsZSBmaWxlcworCQkJCSAqLworCQkJCXByaW50ZiAoIiVzICAgIE9mZnNldCA9IDB4JTA4bHhcbiIsIHAsIGRhdGEpOworCQkJfQorCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTaGFyZWQgZHVhbC1mb3JtYXQgcm91dGluZXMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVVNFX0hPU1RDQwordm9pZCBtZW1tb3ZlX3dkICh2b2lkICp0bywgdm9pZCAqZnJvbSwgc2l6ZV90IGxlbiwgdWxvbmcgY2h1bmtzeikKK3sKKwlpZiAodG8gPT0gZnJvbSkKKwkJcmV0dXJuOworCisjaWYgZGVmaW5lZChDT05GSUdfSFdfV0FUQ0hET0cpIHx8IGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorCXdoaWxlIChsZW4gPiAwKSB7CisJCXNpemVfdCB0YWlsID0gKGxlbiA+IGNodW5rc3opID8gY2h1bmtzeiA6IGxlbjsKKwkJV0FUQ0hET0dfUkVTRVQgKCk7CisJCW1lbW1vdmUgKHRvLCBmcm9tLCB0YWlsKTsKKwkJdG8gKz0gdGFpbDsKKwkJZnJvbSArPSB0YWlsOworCQlsZW4gLT0gdGFpbDsKKwl9CisjZWxzZQkvKiAhKENPTkZJR19IV19XQVRDSERPRyB8fCBDT05GSUdfV0FUQ0hET0cpICovCisJbWVtbW92ZSAodG8sIGZyb20sIGxlbik7CisjZW5kaWYJLyogQ09ORklHX0hXX1dBVENIRE9HIHx8IENPTkZJR19XQVRDSERPRyAqLworfQorI2VuZGlmIC8qICFVU0VfSE9TVENDICovCisKK3ZvaWQgZ2VuaW1nX3ByaW50X3NpemUgKHVpbnQzMl90IHNpemUpCit7CisjaWZuZGVmIFVTRV9IT1NUQ0MKKwlwcmludGYgKCIlZCBCeXRlcyA9ICIsIHNpemUpOworCXByaW50X3NpemUgKHNpemUsICJcbiIpOworI2Vsc2UKKwlwcmludGYgKCIlZCBCeXRlcyA9ICUuMmYga0IgPSAlLjJmIE1CXG4iLAorCQkJc2l6ZSwgKGRvdWJsZSlzaXplIC8gMS4wMjRlMywKKwkJCShkb3VibGUpc2l6ZSAvIDEuMDQ4NTc2ZTYpOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCitzdGF0aWMgdm9pZCBnZW5pbWdfcHJpbnRfdGltZSAodGltZV90IHRpbWVzdGFtcCkKK3sKKyNpZm5kZWYgVVNFX0hPU1RDQworCXN0cnVjdCBydGNfdGltZSB0bTsKKworCXRvX3RtICh0aW1lc3RhbXAsICZ0bSk7CisJcHJpbnRmICgiJTRkLSUwMmQtJTAyZCAgJTJkOiUwMmQ6JTAyZCBVVENcbiIsCisJCQl0bS50bV95ZWFyLCB0bS50bV9tb24sIHRtLnRtX21kYXksCisJCQl0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYyk7CisjZWxzZQorCXByaW50ZiAoIiVzIiwgY3RpbWUoJnRpbWVzdGFtcCkpOworI2VuZGlmCit9CisjZW5kaWYgLyogQ09ORklHX1RJTUVTVEFNUCB8fCBDT05GSUdfQ01EX0RBVEUgfHwgVVNFX0hPU1RDQyAqLworCisvKioKKyAqIGdldF90YWJsZV9lbnRyeV9uYW1lIC0gdHJhbnNsYXRlIGVudHJ5IGlkIHRvIGxvbmcgbmFtZQorICogQHRhYmxlOiBwb2ludGVyIHRvIGEgdHJhbnNsYXRpb24gdGFibGUgZm9yIGVudHJpZXMgb2YgYSBzcGVjaWZpYyB0eXBlCisgKiBAbXNnOiBtZXNzYWdlIHRvIGJlIHJldHVybmVkIHdoZW4gdHJhbnNsYXRpb24gZmFpbHMKKyAqIEBpZDogZW50cnkgaWQgdG8gYmUgdHJhbnNsYXRlZAorICoKKyAqIGdldF90YWJsZV9lbnRyeV9uYW1lKCkgd2lsbCBnbyBvdmVyIHRyYW5zbGF0aW9uIHRhYmxlIHRyeWluZyB0byBmaW5kCisgKiBlbnRyeSB0aGF0IG1hdGNoZXMgZ2l2ZW4gaWQuIElmIG1hdGNoaW5nIGVudHJ5IGlzIGZvdW5kLCBpdHMgbG9uZworICogbmFtZSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgbG9uZyBlbnRyeSBuYW1lIGlmIHRyYW5zbGF0aW9uIHN1Y2NlZWRzCisgKiAgICAgbXNnIG90aGVyd2lzZQorICovCitjaGFyICpnZXRfdGFibGVfZW50cnlfbmFtZSAodGFibGVfZW50cnlfdCAqdGFibGUsIGNoYXIgKm1zZywgaW50IGlkKQoreworCWZvciAoOyB0YWJsZS0+aWQgPj0gMDsgKyt0YWJsZSkgeworCQlpZiAodGFibGUtPmlkID09IGlkKQorCQkJcmV0dXJuIHRhYmxlLT5sbmFtZTsKKwl9CisJcmV0dXJuIChtc2cpOworfQorCitjb25zdCBjaGFyICpnZW5pbWdfZ2V0X29zX25hbWUgKHVpbnQ4X3Qgb3MpCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfbmFtZSAodWltYWdlX29zLCAiVW5rbm93biBPUyIsIG9zKSk7Cit9CisKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfYXJjaF9uYW1lICh1aW50OF90IGFyY2gpCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfbmFtZSAodWltYWdlX2FyY2gsICJVbmtub3duIEFyY2hpdGVjdHVyZSIsIGFyY2gpKTsKK30KKworY29uc3QgY2hhciAqZ2VuaW1nX2dldF90eXBlX25hbWUgKHVpbnQ4X3QgdHlwZSkKK3sKKwlyZXR1cm4gKGdldF90YWJsZV9lbnRyeV9uYW1lICh1aW1hZ2VfdHlwZSwgIlVua25vd24gSW1hZ2UiLCB0eXBlKSk7Cit9CisKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfY29tcF9uYW1lICh1aW50OF90IGNvbXApCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfbmFtZSAodWltYWdlX2NvbXAsICJVbmtub3duIENvbXByZXNzaW9uIiwgY29tcCkpOworfQorCisvKioKKyAqIGdldF90YWJsZV9lbnRyeV9pZCAtIHRyYW5zbGF0ZSBzaG9ydCBlbnRyeSBuYW1lIHRvIGlkCisgKiBAdGFibGU6IHBvaW50ZXIgdG8gYSB0cmFuc2xhdGlvbiB0YWJsZSBmb3IgZW50cmllcyBvZiBhIHNwZWNpZmljIHR5cGUKKyAqIEB0YWJsZV9uYW1lOiB0byBiZSB1c2VkIGluIGNhc2Ugb2YgZXJyb3IKKyAqIEBuYW1lOiBlbnRyeSBzaG9ydCBuYW1lIHRvIGJlIHRyYW5zbGF0ZWQKKyAqCisgKiBnZXRfdGFibGVfZW50cnlfaWQoKSB3aWxsIGdvIG92ZXIgdHJhbnNsYXRpb24gdGFibGUgdHJ5aW5nIHRvIGZpbmQKKyAqIGVudHJ5IHRoYXQgbWF0Y2hlcyBnaXZlbiBzaG9ydCBuYW1lLiBJZiBtYXRjaGluZyBlbnRyeSBpcyBmb3VuZCwKKyAqIGl0cyBpZCByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgZW50cnkgaWQgaWYgdHJhbnNsYXRpb24gc3VjY2VlZHMKKyAqICAgICAtMSBvdGhlcndpc2UKKyAqLworaW50IGdldF90YWJsZV9lbnRyeV9pZCAodGFibGVfZW50cnlfdCAqdGFibGUsCisJCWNvbnN0IGNoYXIgKnRhYmxlX25hbWUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdGFibGVfZW50cnlfdCAqdDsKKyNpZmRlZiBVU0VfSE9TVENDCisJaW50IGZpcnN0ID0gMTsKKworCWZvciAodCA9IHRhYmxlOyB0LT5pZCA+PSAwOyArK3QpIHsKKwkJaWYgKHQtPnNuYW1lICYmIHN0cmNhc2VjbXAodC0+c25hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gKHQtPmlkKTsKKwl9CisKKwlmcHJpbnRmIChzdGRlcnIsICJcbkludmFsaWQgJXMgVHlwZSAtIHZhbGlkIG5hbWVzIGFyZSIsIHRhYmxlX25hbWUpOworCWZvciAodCA9IHRhYmxlOyB0LT5pZCA+PSAwOyArK3QpIHsKKwkJaWYgKHQtPnNuYW1lID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJZnByaW50ZiAoc3RkZXJyLCAiJWMgJXMiLCAoZmlyc3QpID8gJzonIDogJywnLCB0LT5zbmFtZSk7CisJCWZpcnN0ID0gMDsKKwl9CisJZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyNlbHNlCisJZm9yICh0ID0gdGFibGU7IHQtPmlkID49IDA7ICsrdCkgeworCQlpZiAodC0+c25hbWUgJiYgc3RyY21wKHQtPnNuYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuICh0LT5pZCk7CisJfQorCWRlYnVnICgiSW52YWxpZCAlcyBUeXBlOiAlc1xuIiwgdGFibGVfbmFtZSwgbmFtZSk7CisjZW5kaWYgLyogVVNFX0hPU1RDQyAqLworCXJldHVybiAoLTEpOworfQorCitpbnQgZ2VuaW1nX2dldF9vc19pZCAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gKGdldF90YWJsZV9lbnRyeV9pZCAodWltYWdlX29zLCAiT1MiLCBuYW1lKSk7Cit9CisKK2ludCBnZW5pbWdfZ2V0X2FyY2hfaWQgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfaWQgKHVpbWFnZV9hcmNoLCAiQ1BVIiwgbmFtZSkpOworfQorCitpbnQgZ2VuaW1nX2dldF90eXBlX2lkIChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X2lkICh1aW1hZ2VfdHlwZSwgIkltYWdlIiwgbmFtZSkpOworfQorCitpbnQgZ2VuaW1nX2dldF9jb21wX2lkIChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X2lkICh1aW1hZ2VfY29tcCwgIkNvbXByZXNzaW9uIiwgbmFtZSkpOworfQorCisjaWZuZGVmIFVTRV9IT1NUQ0MKKy8qKgorICogZ2VuaW1nX2dldF9mb3JtYXQgLSBnZXQgaW1hZ2UgZm9ybWF0IHR5cGUKKyAqIEBpbWdfYWRkcjogaW1hZ2Ugc3RhcnQgYWRkcmVzcworICoKKyAqIGdlbmltZ19nZXRfZm9ybWF0KCkgY2hlY2tzIHdoZXRoZXIgcHJvdmlkZWQgYWRkcmVzcyBwb2ludHMgdG8gYSB2YWxpZAorICogbGVnYWN5IG9yIEZJVCBpbWFnZS4KKyAqCisgKiBOZXcgdUltYWdlIGZvcm1hdCBhbmQgRkRUIGJsb2IgYXJlIGJhc2VkIG9uIGEgbGliZmR0LiBGRFQgYmxvYgorICogbWF5IGJlIHBhc3NlZCBkaXJlY3RseSBvciBlbWJlZGRlZCBpbiBhIEZJVCBpbWFnZS4gSW4gYm90aCBzaXR1YXRpb25zCisgKiBnZW5pbWdfZ2V0X2Zvcm1hdCgpIG11c3QgYmUgYWJsZSB0byBkZWN0ZWN0IGxpYmZkdCBoZWFkZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICBpbWFnZSBmb3JtYXQgdHlwZSBvciBJTUFHRV9GT1JNQVRfSU5WQUxJRCBpZiBubyBpbWFnZSBpcyBwcmVzZW50CisgKi8KK2ludCBnZW5pbWdfZ2V0X2Zvcm1hdCAodm9pZCAqaW1nX2FkZHIpCit7CisJdWxvbmcgZm9ybWF0ID0gSU1BR0VfRk9STUFUX0lOVkFMSUQ7CisJY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcjsKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpIHx8IGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKKwljaGFyICpmaXRfaGRyOworI2VuZGlmCisKKwloZHIgPSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKilpbWdfYWRkcjsKKwlpZiAoaW1hZ2VfY2hlY2tfbWFnaWMoaGRyKSkKKwkJZm9ybWF0ID0gSU1BR0VfRk9STUFUX0xFR0FDWTsKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpIHx8IGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKKwllbHNlIHsKKwkJZml0X2hkciA9IChjaGFyICopaW1nX2FkZHI7CisJCWlmIChmZHRfY2hlY2tfaGVhZGVyIChmaXRfaGRyKSA9PSAwKQorCQkJZm9ybWF0ID0gSU1BR0VfRk9STUFUX0ZJVDsKKwl9CisjZW5kaWYKKworCXJldHVybiBmb3JtYXQ7Cit9CisKKy8qKgorICogZ2VuaW1nX2dldF9pbWFnZSAtIGdldCBpbWFnZSBmcm9tIHNwZWNpYWwgc3RvcmFnZSAoaWYgbmVjZXNzYXJ5KQorICogQGltZ19hZGRyOiBpbWFnZSBzdGFydCBhZGRyZXNzCisgKgorICogZ2VuaW1nX2dldF9pbWFnZSgpIGNoZWNrcyBpZiBwcm92aWRlZCBpbWFnZSBzdGFydCBhZGRkcmVzcyBpcyBsb2NhdGVkCisgKiBpbiBhIGRhdGFmbGFzaCBzdG9yYWdlLiBJZiBzbywgaW1hZ2UgaXMgbW92ZWQgdG8gYSBzeXN0ZW0gUkFNIG1lbW9yeS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGltYWdlIHN0YXJ0IGFkZHJlc3MgYWZ0ZXIgcG9zc2libGUgcmVsb2NhdGlvbiBmcm9tIHNwZWNpYWwgc3RvcmFnZQorICovCit1bG9uZyBnZW5pbWdfZ2V0X2ltYWdlICh1bG9uZyBpbWdfYWRkcikKK3sKKwl1bG9uZyByYW1fYWRkciA9IGltZ19hZGRyOworCisjaWZkZWYgQ09ORklHX0hBU19EQVRBRkxBU0gKKwl1bG9uZyBoX3NpemUsIGRfc2l6ZTsKKworCWlmIChhZGRyX2RhdGFmbGFzaCAoaW1nX2FkZHIpKXsKKwkJLyogZ2VyIFJBTSBhZGRyZXNzICovCisJCXJhbV9hZGRyID0gQ09ORklHX1NZU19MT0FEX0FERFI7CisKKwkJLyogZ2V0IGhlYWRlciBzaXplICovCisJCWhfc2l6ZSA9IGltYWdlX2dldF9oZWFkZXJfc2l6ZSAoKTsKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJCWlmIChzaXplb2Yoc3RydWN0IGZkdF9oZWFkZXIpID4gaF9zaXplKQorCQkJaF9zaXplID0gc2l6ZW9mKHN0cnVjdCBmZHRfaGVhZGVyKTsKKyNlbmRpZgorCisJCS8qIHJlYWQgaW4gaGVhZGVyICovCisJCWRlYnVnICgiICAgUmVhZGluZyBpbWFnZSBoZWFkZXIgZnJvbSBkYXRhZmxhc2ggYWRkcmVzcyAiCisJCQkiJTA4bHggdG8gUkFNIGFkZHJlc3MgJTA4bHhcbiIsIGltZ19hZGRyLCByYW1fYWRkcik7CisKKwkJcmVhZF9kYXRhZmxhc2ggKGltZ19hZGRyLCBoX3NpemUsIChjaGFyICopcmFtX2FkZHIpOworCisJCS8qIGdldCBkYXRhIHNpemUgKi8KKwkJc3dpdGNoIChnZW5pbWdfZ2V0X2Zvcm1hdCAoKHZvaWQgKilyYW1fYWRkcikpIHsKKwkJY2FzZSBJTUFHRV9GT1JNQVRfTEVHQUNZOgorCQkJZF9zaXplID0gaW1hZ2VfZ2V0X2RhdGFfc2l6ZSAoKGNvbnN0IGltYWdlX2hlYWRlcl90ICopcmFtX2FkZHIpOworCQkJZGVidWcgKCIgICBMZWdhY3kgZm9ybWF0IGltYWdlIGZvdW5kIGF0IDB4JTA4bHgsIHNpemUgMHglMDhseFxuIiwKKwkJCQkJcmFtX2FkZHIsIGRfc2l6ZSk7CisJCQlicmVhazsKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJCWNhc2UgSU1BR0VfRk9STUFUX0ZJVDoKKwkJCWRfc2l6ZSA9IGZpdF9nZXRfc2l6ZSAoKGNvbnN0IHZvaWQgKilyYW1fYWRkcikgLSBoX3NpemU7CisJCQlkZWJ1ZyAoIiAgIEZJVC9GRFQgZm9ybWF0IGltYWdlIGZvdW5kIGF0IDB4JTA4bHgsIHNpemUgMHglMDhseFxuIiwKKwkJCQkJcmFtX2FkZHIsIGRfc2l6ZSk7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJcHJpbnRmICgiICAgTm8gdmFsaWQgaW1hZ2UgZm91bmQgYXQgMHglMDhseFxuIiwgaW1nX2FkZHIpOworCQkJcmV0dXJuIHJhbV9hZGRyOworCQl9CisKKwkJLyogcmVhZCBpbiBpbWFnZSBkYXRhICovCisJCWRlYnVnICgiICAgUmVhZGluZyBpbWFnZSByZW1haW5pbmcgZGF0YSBmcm9tIGRhdGFmbGFzaCBhZGRyZXNzICIKKwkJCSIlMDhseCB0byBSQU0gYWRkcmVzcyAlMDhseFxuIiwgaW1nX2FkZHIgKyBoX3NpemUsCisJCQlyYW1fYWRkciArIGhfc2l6ZSk7CisKKwkJcmVhZF9kYXRhZmxhc2ggKGltZ19hZGRyICsgaF9zaXplLCBkX3NpemUsCisJCQkJKGNoYXIgKikocmFtX2FkZHIgKyBoX3NpemUpKTsKKworCX0KKyNlbmRpZiAvKiBDT05GSUdfSEFTX0RBVEFGTEFTSCAqLworCisJcmV0dXJuIHJhbV9hZGRyOworfQorCisvKioKKyAqIGZpdF9oYXNfY29uZmlnIC0gY2hlY2sgaWYgdGhlcmUgaXMgYSB2YWxpZCBGSVQgY29uZmlndXJhdGlvbgorICogQGltYWdlczogcG9pbnRlciB0byB0aGUgYm9vdG0gY29tbWFuZCBoZWFkZXJzIHN0cnVjdHVyZQorICoKKyAqIGZpdF9oYXNfY29uZmlnKCkgY2hlY2tzIGlmIHRoZXJlIGlzIGEgRklUIGNvbmZpZ3VyYXRpb24gaW4gdXNlCisgKiAoaWYgRlRJIHN1cHBvcnQgaXMgcHJlc2VudCkuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBubyBGSVQgc3VwcG9ydCBvciBubyBjb25maWd1cmF0aW9uIGZvdW5kCisgKiAgICAgMSwgY29uZmlndXJhdGlvbiBmb3VuZAorICovCitpbnQgZ2VuaW1nX2hhc19jb25maWcgKGJvb3RtX2hlYWRlcnNfdCAqaW1hZ2VzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKwlpZiAoaW1hZ2VzLT5maXRfdW5hbWVfY2ZnKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX09GX0xJQkZEVAorc3RhdGljIHZvaWQgZmR0X2Vycm9yIChjb25zdCBjaGFyICptc2cpCit7CisJcHV0cyAoIkVSUk9SOiAiKTsKKwlwdXRzIChtc2cpOworCXB1dHMgKCIgLSBtdXN0IFJFU0VUIHRoZSBib2FyZCB0byByZWNvdmVyLlxuIik7Cit9CisKK3N0YXRpYyBjb25zdCBpbWFnZV9oZWFkZXJfdCAqaW1hZ2VfZ2V0X2ZkdCAodWxvbmcgZmR0X2FkZHIpCit7CisJY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmZkdF9oZHIgPSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKilmZHRfYWRkcjsKKworCWltYWdlX3ByaW50X2NvbnRlbnRzIChmZHRfaGRyKTsKKworCXB1dHMgKCIgICBWZXJpZnlpbmcgQ2hlY2tzdW0gLi4uICIpOworCWlmICghaW1hZ2VfY2hlY2tfaGNyYyAoZmR0X2hkcikpIHsKKwkJZmR0X2Vycm9yICgiZmR0IGhlYWRlciBjaGVja3N1bSBpbnZhbGlkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghaW1hZ2VfY2hlY2tfZGNyYyAoZmR0X2hkcikpIHsKKwkJZmR0X2Vycm9yICgiZmR0IGNoZWNrc3VtIGludmFsaWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXB1dHMgKCJPS1xuIik7CisKKwlpZiAoIWltYWdlX2NoZWNrX3R5cGUgKGZkdF9oZHIsIElIX1RZUEVfRkxBVERUKSkgeworCQlmZHRfZXJyb3IgKCJ1SW1hZ2UgaXMgbm90IGEgZmR0Iik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoaW1hZ2VfZ2V0X2NvbXAgKGZkdF9oZHIpICE9IElIX0NPTVBfTk9ORSkgeworCQlmZHRfZXJyb3IgKCJ1SW1hZ2UgaXMgY29tcHJlc3NlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKGZkdF9jaGVja19oZWFkZXIgKChjaGFyICopaW1hZ2VfZ2V0X2RhdGEgKGZkdF9oZHIpKSAhPSAwKSB7CisJCWZkdF9lcnJvciAoInVJbWFnZSBkYXRhIGlzIG5vdCBhIGZkdCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGZkdF9oZHI7Cit9CisKKy8qKgorICogZml0X2NoZWNrX2ZkdCAtIHZlcmlmeSBGSVQgZm9ybWF0IEZEVCBzdWJpbWFnZQorICogQGZpdF9oZHI6IHBvaW50ZXIgdG8gdGhlIEZJVCAgaGVhZGVyCisgKiBmZHRfbm9mZnNldDogRkRUIHN1YmltYWdlIG5vZGUgb2Zmc2V0IHdpdGhpbiBGSVQgaW1hZ2UKKyAqIEB2ZXJpZnk6IGRhdGEgQ1JDIHZlcmlmaWNhdGlvbiBmbGFnCisgKgorICogZml0X2NoZWNrX2ZkdCgpIHZlcmlmaWVzIGludGVncml0eSBvZiB0aGUgRkRUIHN1YmltYWdlIGFuZCBmcm9tCisgKiBzcGVjaWZpZWQgRklUIGltYWdlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSwgb24gc3VjY2VzcworICogICAgIDAsIG9uIGZhaWx1cmUKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKK3N0YXRpYyBpbnQgZml0X2NoZWNrX2ZkdCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgZmR0X25vZmZzZXQsIGludCB2ZXJpZnkpCit7CisJZml0X2ltYWdlX3ByaW50IChmaXQsIGZkdF9ub2Zmc2V0LCAiICAgIik7CisKKwlpZiAodmVyaWZ5KSB7CisJCXB1dHMgKCIgICBWZXJpZnlpbmcgSGFzaCBJbnRlZ3JpdHkgLi4uICIpOworCQlpZiAoIWZpdF9pbWFnZV9jaGVja19oYXNoZXMgKGZpdCwgZmR0X25vZmZzZXQpKSB7CisJCQlmZHRfZXJyb3IgKCJCYWQgRGF0YSBIYXNoIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwdXRzICgiT0tcbiIpOworCX0KKworCWlmICghZml0X2ltYWdlX2NoZWNrX3R5cGUgKGZpdCwgZmR0X25vZmZzZXQsIElIX1RZUEVfRkxBVERUKSkgeworCQlmZHRfZXJyb3IgKCJOb3QgYSBGRFQgaW1hZ2UiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfY29tcCAoZml0LCBmZHRfbm9mZnNldCwgSUhfQ09NUF9OT05FKSkgeworCQlmZHRfZXJyb3IgKCJGRFQgaW1hZ2UgaXMgY29tcHJlc3NlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBDT05GSUdfRklUICovCisKKyNpZm5kZWYgQ09ORklHX1NZU19GRFRfUEFECisjZGVmaW5lIENPTkZJR19TWVNfRkRUX1BBRCAweDMwMDAKKyNlbmRpZgorCisvKioKKyAqIGJvb3RfcmVsb2NhdGVfZmR0IC0gcmVsb2NhdGUgZmxhdCBkZXZpY2UgdHJlZQorICogQGxtYjogcG9pbnRlciB0byBsbWIgaGFuZGxlLCB3aWxsIGJlIHVzZWQgZm9yIG1lbW9yeSBtZ210CisgKiBAYm9vdG1hcF9iYXNlOiBiYXNlIGFkZHJlc3Mgb2YgdGhlIGJvb3RtYXAgcmVnaW9uCisgKiBAb2ZfZmxhdF90cmVlOiBwb2ludGVyIHRvIGEgY2hhciogdmFyaWFibGUsIHdpbGwgaG9sZCBmZHQgc3RhcnQgYWRkcmVzcworICogQG9mX3NpemU6IHBvaW50ZXIgdG8gYSB1bG9uZyB2YXJpYWJsZSwgd2lsbCBob2xkIGZkdCBsZW5ndGgKKyAqCisgKiBib290X3JlbG9jYXRlX2ZkdCgpIGRldGVybWluZXMgaWYgdGhlIG9mX2ZsYXRfdHJlZSBhZGRyZXNzIGlzIHdpdGhpbgorICogdGhlIGJvb3RtYXAgYW5kIGlmIG5vdCByZWxvY2F0ZXMgaXQgaW50byB0aGF0IHJlZ2lvbgorICoKKyAqIG9mX2ZsYXRfdHJlZSBhbmQgb2Zfc2l6ZSBhcmUgc2V0IHRvIGZpbmFsIChhZnRlciByZWxvY2F0aW9uKSB2YWx1ZXMKKyAqCisgKiByZXR1cm5zOgorICogICAgICAwIC0gc3VjY2VzcworICogICAgICAxIC0gZmFpbHVyZQorICovCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0JPT1RNQVBTWikKK2ludCBib290X3JlbG9jYXRlX2ZkdCAoc3RydWN0IGxtYiAqbG1iLCB1bG9uZyBib290bWFwX2Jhc2UsCisJCWNoYXIgKipvZl9mbGF0X3RyZWUsIHVsb25nICpvZl9zaXplKQoreworCWNoYXIJKmZkdF9ibG9iID0gKm9mX2ZsYXRfdHJlZTsKKwl1bG9uZwlyZWxvY2F0ZSA9IDA7CisJdWxvbmcJb2ZfbGVuID0gMDsKKworCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwlpZiAoKm9mX3NpemUgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZmR0X2NoZWNrX2hlYWRlciAoZmR0X2Jsb2IpICE9IDApIHsKKwkJZmR0X2Vycm9yICgiaW1hZ2UgaXMgbm90IGEgZmR0Iik7CisJCWdvdG8gZXJyb3I7CisJfQorCisjaWZuZGVmIENPTkZJR19TWVNfTk9fRkxBU0gKKwkvKiBtb3ZlIHRoZSBibG9iIGlmIGl0IGlzIGluIGZsYXNoIChzZXQgcmVsb2NhdGUpICovCisJaWYgKGFkZHIyaW5mbyAoKHVsb25nKWZkdF9ibG9iKSAhPSBOVUxMKQorCQlyZWxvY2F0ZSA9IDE7CisjZW5kaWYKKworCS8qCisJICogVGhlIGJsb2IgbmVlZHMgdG8gYmUgaW5zaWRlIHRoZSBib290IG1hcHBpbmcuCisJICovCisJaWYgKGZkdF9ibG9iIDwgKGNoYXIgKilib290bWFwX2Jhc2UpCisJCXJlbG9jYXRlID0gMTsKKworCWlmICgoZmR0X2Jsb2IgKyAqb2Zfc2l6ZSArIENPTkZJR19TWVNfRkRUX1BBRCkgPj0KKwkJCSgoY2hhciAqKUNPTkZJR19TWVNfQk9PVE1BUFNaICsgYm9vdG1hcF9iYXNlKSkKKwkJcmVsb2NhdGUgPSAxOworCisJLyogbW92ZSBmbGF0dGVuZCBkZXZpY2UgdHJlZSBpZiBuZWVkZWQgKi8KKwlpZiAocmVsb2NhdGUpIHsKKwkJaW50IGVycjsKKwkJdWxvbmcgb2Zfc3RhcnQgPSAwOworCisJCS8qIHBvc2l0aW9uIG9uIGEgNEsgYm91bmRhcnkgYmVmb3JlIHRoZSBhbGxvY19jdXJyZW50ICovCisJCS8qIFBhZCB0aGUgRkRUIGJ5IGEgc3BlY2lmaWVkIGFtb3VudCAqLworCQlvZl9sZW4gPSAqb2Zfc2l6ZSArIENPTkZJR19TWVNfRkRUX1BBRDsKKwkJb2Zfc3RhcnQgPSAodW5zaWduZWQgbG9uZylsbWJfYWxsb2NfYmFzZShsbWIsIG9mX2xlbiwgMHgxMDAwLAorCQkJCShDT05GSUdfU1lTX0JPT1RNQVBTWiArIGJvb3RtYXBfYmFzZSkpOworCisJCWlmIChvZl9zdGFydCA9PSAwKSB7CisJCQlwdXRzKCJkZXZpY2UgdHJlZSAtIGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWRlYnVnICgiIyMgZGV2aWNlIHRyZWUgYXQgMHglMDhsWCAuLi4gMHglMDhsWCAobGVuPSVsZD0weCVsWClcbiIsCisJCQkodWxvbmcpZmR0X2Jsb2IsICh1bG9uZylmZHRfYmxvYiArICpvZl9zaXplIC0gMSwKKwkJCW9mX2xlbiwgb2ZfbGVuKTsKKworCQlwcmludGYgKCIgICBMb2FkaW5nIERldmljZSBUcmVlIHRvICUwOGx4LCBlbmQgJTA4bHggLi4uICIsCisJCQlvZl9zdGFydCwgb2Zfc3RhcnQgKyBvZl9sZW4gLSAxKTsKKworCQllcnIgPSBmZHRfb3Blbl9pbnRvIChmZHRfYmxvYiwgKHZvaWQgKilvZl9zdGFydCwgb2ZfbGVuKTsKKwkJaWYgKGVyciAhPSAwKSB7CisJCQlmZHRfZXJyb3IgKCJmZHQgbW92ZSBmYWlsZWQiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcHV0cyAoIk9LXG4iKTsKKworCQkqb2ZfZmxhdF90cmVlID0gKGNoYXIgKilvZl9zdGFydDsKKwkJKm9mX3NpemUgPSBvZl9sZW47CisJfSBlbHNlIHsKKwkJKm9mX2ZsYXRfdHJlZSA9IGZkdF9ibG9iOworCQlvZl9sZW4gPSAoQ09ORklHX1NZU19CT09UTUFQU1ogKyBib290bWFwX2Jhc2UpIC0gKHVsb25nKWZkdF9ibG9iOworCQlsbWJfcmVzZXJ2ZShsbWIsICh1bG9uZylmZHRfYmxvYiwgb2ZfbGVuKTsKKwkJZmR0X3NldF90b3RhbHNpemUoKm9mX2ZsYXRfdHJlZSwgb2ZfbGVuKTsKKworCQkqb2Zfc2l6ZSA9IG9mX2xlbjsKKwl9CisKKwlzZXRfd29ya2luZ19mZHRfYWRkcigqb2ZfZmxhdF90cmVlKTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogQ09ORklHX1NZU19CT09UTUFQU1ogKi8KKworLyoqCisgKiBib290X2dldF9mZHQgLSBtYWluIGZkdCBoYW5kbGluZyByb3V0aW5lCisgKiBAYXJnYzogY29tbWFuZCBhcmd1bWVudCBjb3VudAorICogQGFyZ3Y6IGNvbW1hbmQgYXJndW1lbnQgbGlzdAorICogQGltYWdlczogcG9pbnRlciB0byB0aGUgYm9vdG0gaW1hZ2VzIHN0cnVjdHVyZQorICogQG9mX2ZsYXRfdHJlZTogcG9pbnRlciB0byBhIGNoYXIqIHZhcmlhYmxlLCB3aWxsIGhvbGQgZmR0IHN0YXJ0IGFkZHJlc3MKKyAqIEBvZl9zaXplOiBwb2ludGVyIHRvIGEgdWxvbmcgdmFyaWFibGUsIHdpbGwgaG9sZCBmZHQgbGVuZ3RoCisgKgorICogYm9vdF9nZXRfZmR0KCkgaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgYSB2YWxpZCBmbGF0IGRldmljZSB0cmVlIGltYWdlLgorICogQ3VyZW50bHkgc3VwcG9ydGVkIGFyZSB0aGUgZm9sbG93aW5nIHJhbWRpc2sgc291cmNlczoKKyAqICAgICAgLSBtdWx0aWNvbXBvbmVudCBrZXJuZWwvcmFtZGlzayBpbWFnZSwKKyAqICAgICAgLSBjb21tYW5kbGluZSBwcm92aWRlZCBhZGRyZXNzIG9mIGRlY2ljYXRlZCByYW1kaXNrIGltYWdlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgaWYgZmR0IGltYWdlIHdhcyBmb3VuZCBhbmQgdmFsaWQsIG9yIHNraXBwZWQKKyAqICAgICBvZl9mbGF0X3RyZWUgYW5kIG9mX3NpemUgYXJlIHNldCB0byBmZHQgc3RhcnQgYWRkcmVzcyBhbmQgbGVuZ3RoIGlmCisgKiAgICAgZmR0IGltYWdlIGlzIGZvdW5kIGFuZCB2YWxpZAorICoKKyAqICAgICAxLCBpZiBmZHQgaW1hZ2UgaXMgZm91bmQgYnV0IGNvcnJ1cHRlZAorICogICAgIG9mX2ZsYXRfdHJlZSBhbmQgb2Zfc2l6ZSBhcmUgc2V0IHRvIDAgaWYgbm8gZmR0IGV4aXN0cworICovCitpbnQgYm9vdF9nZXRfZmR0IChpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10sIGJvb3RtX2hlYWRlcnNfdCAqaW1hZ2VzLAorCQljaGFyICoqb2ZfZmxhdF90cmVlLCB1bG9uZyAqb2Zfc2l6ZSkKK3sKKwljb25zdCBpbWFnZV9oZWFkZXJfdCAqZmR0X2hkcjsKKwl1bG9uZwkJZmR0X2FkZHI7CisJY2hhcgkJKmZkdF9ibG9iID0gTlVMTDsKKwl1bG9uZwkJaW1hZ2Vfc3RhcnQsIGltYWdlX2VuZDsKKwl1bG9uZwkJbG9hZF9zdGFydCwgbG9hZF9lbmQ7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCXZvaWQJCSpmaXRfaGRyOworCWNvbnN0IGNoYXIJKmZpdF91bmFtZV9jb25maWcgPSBOVUxMOworCWNvbnN0IGNoYXIJKmZpdF91bmFtZV9mZHQgPSBOVUxMOworCXVsb25nCQlkZWZhdWx0X2FkZHI7CisJaW50CQljZmdfbm9mZnNldDsKKwlpbnQJCWZkdF9ub2Zmc2V0OworCWNvbnN0IHZvaWQJKmRhdGE7CisJc2l6ZV90CQlzaXplOworI2VuZGlmCisKKwkqb2ZfZmxhdF90cmVlID0gTlVMTDsKKwkqb2Zfc2l6ZSA9IDA7CisKKwlpZiAoYXJnYyA+IDMgfHwgZ2VuaW1nX2hhc19jb25maWcgKGltYWdlcykpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJCWlmIChhcmdjID4gMykgeworCQkJLyoKKwkJCSAqIElmIHRoZSBGRFQgYmxvYiBjb21lcyBmcm9tIHRoZSBGSVQgaW1hZ2UgYW5kIHRoZQorCQkJICogRklUIGltYWdlIGFkZHJlc3MgaXMgb21pdHRlZCBpbiB0aGUgY29tbWFuZCBsaW5lCisJCQkgKiBhcmd1bWVudCwgdHJ5IHRvIHVzZSByYW1kaXNrIG9yIG9zIEZJVCBpbWFnZQorCQkJICogYWRkcmVzcyBvciBkZWZhdWx0IGxvYWQgYWRkcmVzcy4KKwkJCSAqLworCQkJaWYgKGltYWdlcy0+Zml0X3VuYW1lX3JkKQorCQkJCWRlZmF1bHRfYWRkciA9ICh1bG9uZylpbWFnZXMtPmZpdF9oZHJfcmQ7CisJCQllbHNlIGlmIChpbWFnZXMtPmZpdF91bmFtZV9vcykKKwkJCQlkZWZhdWx0X2FkZHIgPSAodWxvbmcpaW1hZ2VzLT5maXRfaGRyX29zOworCQkJZWxzZQorCQkJCWRlZmF1bHRfYWRkciA9IGxvYWRfYWRkcjsKKworCQkJaWYgKGZpdF9wYXJzZV9jb25mIChhcmd2WzNdLCBkZWZhdWx0X2FkZHIsCisJCQkJCQkmZmR0X2FkZHIsICZmaXRfdW5hbWVfY29uZmlnKSkgeworCQkJCWRlYnVnICgiKiAgZmR0OiBjb25maWcgJyVzJyBmcm9tIGltYWdlIGF0IDB4JTA4bHhcbiIsCisJCQkJCQlmaXRfdW5hbWVfY29uZmlnLCBmZHRfYWRkcik7CisJCQl9IGVsc2UgaWYgKGZpdF9wYXJzZV9zdWJpbWFnZSAoYXJndlszXSwgZGVmYXVsdF9hZGRyLAorCQkJCQkJJmZkdF9hZGRyLCAmZml0X3VuYW1lX2ZkdCkpIHsKKwkJCQlkZWJ1ZyAoIiogIGZkdDogc3ViaW1hZ2UgJyVzJyBmcm9tIGltYWdlIGF0IDB4JTA4bHhcbiIsCisJCQkJCQlmaXRfdW5hbWVfZmR0LCBmZHRfYWRkcik7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJeworCQkJCWZkdF9hZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCQkJCWRlYnVnICgiKiAgZmR0OiBjbWRsaW5lIGltYWdlIGFkZHJlc3MgPSAweCUwOGx4XG4iLAorCQkJCQkJZmR0X2FkZHIpOworCQkJfQorI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKwkJfSBlbHNlIHsKKwkJCS8qIHVzZSBGSVQgY29uZmlndXJhdGlvbiBwcm92aWRlZCBpbiBmaXJzdCBib290bQorCQkJICogY29tbWFuZCBhcmd1bWVudAorCQkJICovCisJCQlmZHRfYWRkciA9ICh1bG9uZylpbWFnZXMtPmZpdF9oZHJfb3M7CisJCQlmaXRfdW5hbWVfY29uZmlnID0gaW1hZ2VzLT5maXRfdW5hbWVfY2ZnOworCQkJZGVidWcgKCIqICBmZHQ6IHVzaW5nIGNvbmZpZyAnJXMnIGZyb20gaW1hZ2UgYXQgMHglMDhseFxuIiwKKwkJCQkJZml0X3VuYW1lX2NvbmZpZywgZmR0X2FkZHIpOworCisJCQkvKgorCQkJICogQ2hlY2sgd2hldGhlciBjb25maWd1cmF0aW9uIGhhcyBGRFQgYmxvYiBkZWZpbmVkLAorCQkJICogaWYgbm90IHF1aXQgc2lsZW50bHkuCisJCQkgKi8KKwkJCWZpdF9oZHIgPSAodm9pZCAqKWZkdF9hZGRyOworCQkJY2ZnX25vZmZzZXQgPSBmaXRfY29uZl9nZXRfbm9kZSAoZml0X2hkciwKKwkJCQkJZml0X3VuYW1lX2NvbmZpZyk7CisJCQlpZiAoY2ZnX25vZmZzZXQgPCAwKSB7CisJCQkJZGVidWcgKCIqICBmZHQ6IG5vIHN1Y2ggY29uZmlnXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJZmR0X25vZmZzZXQgPSBmaXRfY29uZl9nZXRfZmR0X25vZGUgKGZpdF9oZHIsCisJCQkJCWNmZ19ub2Zmc2V0KTsKKwkJCWlmIChmZHRfbm9mZnNldCA8IDApIHsKKwkJCQlkZWJ1ZyAoIiogIGZkdDogbm8gZmR0IGluIGNvbmZpZ1xuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCWRlYnVnICgiIyMgQ2hlY2tpbmcgZm9yICdGRFQnLydGRFQgSW1hZ2UnIGF0ICUwOGx4XG4iLAorCQkJCWZkdF9hZGRyKTsKKworCQkvKiBjb3B5IGZyb20gZGF0YWZsYXNoIGlmIG5lZWRlZCAqLworCQlmZHRfYWRkciA9IGdlbmltZ19nZXRfaW1hZ2UgKGZkdF9hZGRyKTsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBGRFQgaW1hZ2UgYXQgdGhlCisJCSAqIGFkZHJlc3MgcHJvdmlkZWQgaW4gdGhlIHNlY29uZCBib290bSBhcmd1bWVudAorCQkgKiBjaGVjayBpbWFnZSB0eXBlLCBmb3IgRklUIGltYWdlcyBnZXQgYSBGSVQgbm9kZS4KKwkJICovCisJCXN3aXRjaCAoZ2VuaW1nX2dldF9mb3JtYXQgKCh2b2lkICopZmR0X2FkZHIpKSB7CisJCWNhc2UgSU1BR0VfRk9STUFUX0xFR0FDWToKKwkJCS8qIHZlcmlmeSBmZHRfYWRkciBwb2ludHMgdG8gYSB2YWxpZCBpbWFnZSBoZWFkZXIgKi8KKwkJCXByaW50ZiAoIiMjIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSBmcm9tIExlZ2FjeSBJbWFnZSBhdCAlMDhseFxuIiwKKwkJCQkJZmR0X2FkZHIpOworCQkJZmR0X2hkciA9IGltYWdlX2dldF9mZHQgKGZkdF9hZGRyKTsKKwkJCWlmICghZmR0X2hkcikKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKgorCQkJICogbW92ZSBpbWFnZSBkYXRhIHRvIHRoZSBsb2FkIGFkZHJlc3MsCisJCQkgKiBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcndyaXRlIGluaXRpYWwgaW1hZ2UKKwkJCSAqLworCQkJaW1hZ2Vfc3RhcnQgPSAodWxvbmcpZmR0X2hkcjsKKwkJCWltYWdlX2VuZCA9IGltYWdlX2dldF9pbWFnZV9lbmQgKGZkdF9oZHIpOworCisJCQlsb2FkX3N0YXJ0ID0gaW1hZ2VfZ2V0X2xvYWQgKGZkdF9oZHIpOworCQkJbG9hZF9lbmQgPSBsb2FkX3N0YXJ0ICsgaW1hZ2VfZ2V0X2RhdGFfc2l6ZSAoZmR0X2hkcik7CisKKwkJCWlmICgobG9hZF9zdGFydCA8IGltYWdlX2VuZCkgJiYgKGxvYWRfZW5kID4gaW1hZ2Vfc3RhcnQpKSB7CisJCQkJZmR0X2Vycm9yICgiZmR0IG92ZXJ3cml0dGVuIik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJZGVidWcgKCIgICBMb2FkaW5nIEZEVCBmcm9tIDB4JTA4bHggdG8gMHglMDhseFxuIiwKKwkJCQkJaW1hZ2VfZ2V0X2RhdGEgKGZkdF9oZHIpLCBsb2FkX3N0YXJ0KTsKKworCQkJbWVtbW92ZSAoKHZvaWQgKilsb2FkX3N0YXJ0LAorCQkJCQkodm9pZCAqKWltYWdlX2dldF9kYXRhIChmZHRfaGRyKSwKKwkJCQkJaW1hZ2VfZ2V0X2RhdGFfc2l6ZSAoZmR0X2hkcikpOworCisJCQlmZHRfYmxvYiA9IChjaGFyICopbG9hZF9zdGFydDsKKwkJCWJyZWFrOworCQljYXNlIElNQUdFX0ZPUk1BVF9GSVQ6CisJCQkvKgorCQkJICogVGhpcyBjYXNlIHdpbGwgY2F0Y2ggYm90aDogbmV3IHVJbWFnZSBmb3JtYXQKKwkJCSAqIChsaWJmZHQgYmFzZWQpIGFuZCByYXcgRkRUIGJsb2IgKGFsc28gbGliZmR0CisJCQkgKiBiYXNlZCkuCisJCQkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJCQkvKiBjaGVjayBGRFQgYmxvYiB2cyBGSVQgYmxvYiAqLworCQkJaWYgKGZpdF9jaGVja19mb3JtYXQgKChjb25zdCB2b2lkICopZmR0X2FkZHIpKSB7CisJCQkJLyoKKwkJCQkgKiBGSVQgaW1hZ2UKKwkJCQkgKi8KKwkJCQlmaXRfaGRyID0gKHZvaWQgKilmZHRfYWRkcjsKKwkJCQlwcmludGYgKCIjIyBGbGF0dGVuZWQgRGV2aWNlIFRyZWUgZnJvbSBGSVQgSW1hZ2UgYXQgJTA4bHhcbiIsCisJCQkJCQlmZHRfYWRkcik7CisKKwkJCQlpZiAoIWZpdF91bmFtZV9mZHQpIHsKKwkJCQkJLyoKKwkJCQkJICogbm8gRkRUIGJsb2IgaW1hZ2Ugbm9kZSB1bml0IG5hbWUsCisJCQkJCSAqIHRyeSB0byBnZXQgY29uZmlnIG5vZGUgZmlyc3QuIElmCisJCQkJCSAqIGNvbmZpZyB1bml0IG5vZGUgbmFtZSBpcyBOVUxMCisJCQkJCSAqIGZpdF9jb25mX2dldF9ub2RlKCkgd2lsbCB0cnkgdG8KKwkJCQkJICogZmluZCBkZWZhdWx0IGNvbmZpZyBub2RlCisJCQkJCSAqLworCQkJCQljZmdfbm9mZnNldCA9IGZpdF9jb25mX2dldF9ub2RlIChmaXRfaGRyLAorCQkJCQkJCWZpdF91bmFtZV9jb25maWcpOworCisJCQkJCWlmIChjZmdfbm9mZnNldCA8IDApIHsKKwkJCQkJCWZkdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIGNvbmZpZ3VyYXRpb24gbm9kZVxuIik7CisJCQkJCQlnb3RvIGVycm9yOworCQkJCQl9CisKKwkJCQkJZml0X3VuYW1lX2NvbmZpZyA9IGZkdF9nZXRfbmFtZSAoZml0X2hkciwKKwkJCQkJCQljZmdfbm9mZnNldCwgTlVMTCk7CisJCQkJCXByaW50ZiAoIiAgIFVzaW5nICclcycgY29uZmlndXJhdGlvblxuIiwKKwkJCQkJCQlmaXRfdW5hbWVfY29uZmlnKTsKKworCQkJCQlmZHRfbm9mZnNldCA9IGZpdF9jb25mX2dldF9mZHRfbm9kZSAoZml0X2hkciwKKwkJCQkJCQljZmdfbm9mZnNldCk7CisJCQkJCWZpdF91bmFtZV9mZHQgPSBmaXRfZ2V0X25hbWUgKGZpdF9oZHIsCisJCQkJCQkJZmR0X25vZmZzZXQsIE5VTEwpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGdldCBGRFQgY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0ICovCisJCQkJCWZkdF9ub2Zmc2V0ID0gZml0X2ltYWdlX2dldF9ub2RlIChmaXRfaGRyLAorCQkJCQkJCWZpdF91bmFtZV9mZHQpOworCQkJCX0KKwkJCQlpZiAoZmR0X25vZmZzZXQgPCAwKSB7CisJCQkJCWZkdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIHN1YmltYWdlIG5vZGVcbiIpOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKworCQkJCXByaW50ZiAoIiAgIFRyeWluZyAnJXMnIEZEVCBibG9iIHN1YmltYWdlXG4iLAorCQkJCQkJZml0X3VuYW1lX2ZkdCk7CisKKwkJCQlpZiAoIWZpdF9jaGVja19mZHQgKGZpdF9oZHIsIGZkdF9ub2Zmc2V0LAorCQkJCQkJCWltYWdlcy0+dmVyaWZ5KSkKKwkJCQkJZ290byBlcnJvcjsKKworCQkJCS8qIGdldCByYW1kaXNrIGltYWdlIGRhdGEgYWRkcmVzcyBhbmQgbGVuZ3RoICovCisJCQkJaWYgKGZpdF9pbWFnZV9nZXRfZGF0YSAoZml0X2hkciwgZmR0X25vZmZzZXQsCisJCQkJCQkJJmRhdGEsICZzaXplKSkgeworCQkJCQlmZHRfZXJyb3IgKCJDb3VsZCBub3QgZmluZCBGRFQgc3ViaW1hZ2UgZGF0YSIpOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKworCQkJCS8qIHZlcmlmdCB0aGF0IGltYWdlIGRhdGEgaXMgYSBwcm9wZXIgRkRUIGJsb2IgKi8KKwkJCQlpZiAoZmR0X2NoZWNrX2hlYWRlciAoKGNoYXIgKilkYXRhKSAhPSAwKSB7CisJCQkJCWZkdF9lcnJvciAoIlN1YmltYWdlIGRhdGEgaXMgbm90IGEgRlREIik7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBtb3ZlIGltYWdlIGRhdGEgdG8gdGhlIGxvYWQgYWRkcmVzcywKKwkJCQkgKiBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcndyaXRlIGluaXRpYWwgaW1hZ2UKKwkJCQkgKi8KKwkJCQlpbWFnZV9zdGFydCA9ICh1bG9uZylmaXRfaGRyOworCQkJCWltYWdlX2VuZCA9IGZpdF9nZXRfZW5kIChmaXRfaGRyKTsKKworCQkJCWlmIChmaXRfaW1hZ2VfZ2V0X2xvYWQgKGZpdF9oZHIsIGZkdF9ub2Zmc2V0LAorCQkJCQkJCSZsb2FkX3N0YXJ0KSA9PSAwKSB7CisJCQkJCWxvYWRfZW5kID0gbG9hZF9zdGFydCArIHNpemU7CisKKwkJCQkJaWYgKChsb2FkX3N0YXJ0IDwgaW1hZ2VfZW5kKSAmJgorCQkJCQkJCShsb2FkX2VuZCA+IGltYWdlX3N0YXJ0KSkgeworCQkJCQkJZmR0X2Vycm9yICgiRkRUIG92ZXJ3cml0dGVuIik7CisJCQkJCQlnb3RvIGVycm9yOworCQkJCQl9CisKKwkJCQkJcHJpbnRmICgiICAgTG9hZGluZyBGRFQgZnJvbSAweCUwOGx4IHRvIDB4JTA4bHhcbiIsCisJCQkJCQkJKHVsb25nKWRhdGEsIGxvYWRfc3RhcnQpOworCisJCQkJCW1lbW1vdmUgKCh2b2lkICopbG9hZF9zdGFydCwKKwkJCQkJCQkodm9pZCAqKWRhdGEsIHNpemUpOworCisJCQkJCWZkdF9ibG9iID0gKGNoYXIgKilsb2FkX3N0YXJ0OworCQkJCX0gZWxzZSB7CisJCQkJCWZkdF9ibG9iID0gKGNoYXIgKilkYXRhOworCQkJCX0KKworCQkJCWltYWdlcy0+Zml0X2hkcl9mZHQgPSBmaXRfaGRyOworCQkJCWltYWdlcy0+Zml0X3VuYW1lX2ZkdCA9IGZpdF91bmFtZV9mZHQ7CisJCQkJaW1hZ2VzLT5maXRfbm9mZnNldF9mZHQgPSBmZHRfbm9mZnNldDsKKwkJCQlicmVhazsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQl7CisJCQkJLyoKKwkJCQkgKiBGRFQgYmxvYgorCQkJCSAqLworCQkJCWZkdF9ibG9iID0gKGNoYXIgKilmZHRfYWRkcjsKKwkJCQlkZWJ1ZyAoIiogIGZkdDogcmF3IEZEVCBibG9iXG4iKTsKKwkJCQlwcmludGYgKCIjIyBGbGF0dGVuZWQgRGV2aWNlIFRyZWUgYmxvYiBhdCAlMDhseFxuIiwgKGxvbmcpZmR0X2Jsb2IpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwdXRzICgiRVJST1I6IERpZCBub3QgZmluZCBhIGNtZGxpbmUgRmxhdHRlbmVkIERldmljZSBUcmVlXG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlwcmludGYgKCIgICBCb290aW5nIHVzaW5nIHRoZSBmZHQgYmxvYiBhdCAweCV4XG4iLCAoaW50KWZkdF9ibG9iKTsKKworCX0gZWxzZSBpZiAoaW1hZ2VzLT5sZWdhY3lfaGRyX3ZhbGlkICYmCisJCQlpbWFnZV9jaGVja190eXBlICgmaW1hZ2VzLT5sZWdhY3lfaGRyX29zX2NvcHksIElIX1RZUEVfTVVMVEkpKSB7CisKKwkJdWxvbmcgZmR0X2RhdGEsIGZkdF9sZW47CisKKwkJLyoKKwkJICogTm93IGNoZWNrIGlmIHdlIGhhdmUgYSBsZWdhY3kgbXVsdGktY29tcG9uZW50IGltYWdlLAorCQkgKiBnZXQgc2Vjb25kIGVudHJ5IGRhdGEgc3RhcnQgYWRkcmVzcyBhbmQgbGVuLgorCQkgKi8KKwkJcHJpbnRmICgiIyMgRmxhdHRlbmVkIERldmljZSBUcmVlIGZyb20gbXVsdGkgIgorCQkJImNvbXBvbmVudCBJbWFnZSBhdCAlMDhsWFxuIiwKKwkJCSh1bG9uZylpbWFnZXMtPmxlZ2FjeV9oZHJfb3MpOworCisJCWltYWdlX211bHRpX2dldGltZyAoaW1hZ2VzLT5sZWdhY3lfaGRyX29zLCAyLCAmZmR0X2RhdGEsICZmZHRfbGVuKTsKKwkJaWYgKGZkdF9sZW4pIHsKKworCQkJZmR0X2Jsb2IgPSAoY2hhciAqKWZkdF9kYXRhOworCQkJcHJpbnRmICgiICAgQm9vdGluZyB1c2luZyB0aGUgZmR0IGF0IDB4JXhcbiIsIChpbnQpZmR0X2Jsb2IpOworCisJCQlpZiAoZmR0X2NoZWNrX2hlYWRlciAoZmR0X2Jsb2IpICE9IDApIHsKKwkJCQlmZHRfZXJyb3IgKCJpbWFnZSBpcyBub3QgYSBmZHQiKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCisJCQlpZiAoYmUzMl90b19jcHUgKGZkdF90b3RhbHNpemUgKGZkdF9ibG9iKSkgIT0gZmR0X2xlbikgeworCQkJCWZkdF9lcnJvciAoImZkdCBzaXplICE9IGltYWdlIHNpemUiKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9IGVsc2UgeworCQkJZGVidWcgKCIjIyBObyBGbGF0dGVuZWQgRGV2aWNlIFRyZWVcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlkZWJ1ZyAoIiMjIE5vIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZVxuIik7CisJCXJldHVybiAwOworCX0KKworCSpvZl9mbGF0X3RyZWUgPSBmZHRfYmxvYjsKKwkqb2Zfc2l6ZSA9IGJlMzJfdG9fY3B1IChmZHRfdG90YWxzaXplIChmZHRfYmxvYikpOworCWRlYnVnICgiICAgb2ZfZmxhdF90cmVlIGF0IDB4JTA4bHggc2l6ZSAweCUwOGx4XG4iLAorCQkJKHVsb25nKSpvZl9mbGF0X3RyZWUsICpvZl9zaXplKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwkqb2ZfZmxhdF90cmVlID0gMDsKKwkqb2Zfc2l6ZSA9IDA7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLworI2VuZGlmIC8qICFVU0VfSE9TVENDICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBOZXcgdUltYWdlIGZvcm1hdCByb3V0aW5lcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBVU0VfSE9TVENDCitzdGF0aWMgaW50IGZpdF9wYXJzZV9zcGVjIChjb25zdCBjaGFyICpzcGVjLCBjaGFyIHNlcGMsIHVsb25nIGFkZHJfY3VyciwKKwkJdWxvbmcgKmFkZHIsIGNvbnN0IGNoYXIgKipuYW1lKQoreworCWNvbnN0IGNoYXIgKnNlcDsKKworCSphZGRyID0gYWRkcl9jdXJyOworCSpuYW1lID0gTlVMTDsKKworCXNlcCA9IHN0cmNociAoc3BlYywgc2VwYyk7CisJaWYgKHNlcCkgeworCQlpZiAoc2VwIC0gc3BlYyA+IDApCisJCQkqYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChzcGVjLCBOVUxMLCAxNik7CisKKwkJKm5hbWUgPSBzZXAgKyAxOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfcGFyc2VfY29uZiAtIHBhcnNlIEZJVCBjb25maWd1cmF0aW9uIHNwZWMKKyAqIEBzcGVjOiBpbnB1dCBzdHJpbmcsIGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBzcGVjCisgKiBAYWRkX2N1cnI6IGN1cnJlbnQgaW1hZ2UgYWRkcmVzcyAodG8gYmUgdXNlZCBhcyBhIHBvc3NpYmxlIGRlZmF1bHQpCisgKiBAYWRkcjogcG9pbnRlciB0byBhIHVsb25nIHZhcmlhYmxlLCB3aWxsIGhvbGQgRklUIGltYWdlIGFkZHJlc3Mgb2YgYSBnaXZlbgorICogY29uZmlndXJhdGlvbgorICogQGNvbmZfbmFtZSBkb3VibGUgcG9pbnRlciB0byBhIGNoYXIsIHdpbGwgaG9sZCBwb2ludGVyIHRvIGEgY29uZmlndXJhdGlvbgorICogdW5pdCBuYW1lCisgKgorICogZml0X3BhcnNlX2NvbmYoKSBleHBlY3RzIGNvbmZpZ3VyYXRpb24gc3BlYyBpbiB0aGUgZm9yIG9mIFs8YWRkcj5dIzxjb25mPiwKKyAqIHdoZXJlIDxhZGRyPiBpcyBhIEZJVCBpbWFnZSBhZGRyZXNzIHRoYXQgY29udGFpbnMgY29uZmlndXJhdGlvbgorICogd2l0aCBhIDxjb25mPiB1bml0IG5hbWUuCisgKgorICogQWRkcmVzcyBwYXJ0IGlzIG9wdGlvbmFsLCBhbmQgaWYgb21pdHRlZCBkZWZhdWx0IGFkZF9jdXJyIHdpbGwKKyAqIGJlIHVzZWQgaW5zdGVhZC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEgaWYgc3BlYyBpcyBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gc3RyaW5nLAorICogICAgIGFkZHIgYW5kIGNvbmZfbmFtZSBhcmUgc2V0IGFjY29yZGluZ2x5CisgKiAgICAgMCBvdGhlcndpc2UKKyAqLworaW5saW5lIGludCBmaXRfcGFyc2VfY29uZiAoY29uc3QgY2hhciAqc3BlYywgdWxvbmcgYWRkcl9jdXJyLAorCQl1bG9uZyAqYWRkciwgY29uc3QgY2hhciAqKmNvbmZfbmFtZSkKK3sKKwlyZXR1cm4gZml0X3BhcnNlX3NwZWMgKHNwZWMsICcjJywgYWRkcl9jdXJyLCBhZGRyLCBjb25mX25hbWUpOworfQorCisvKioKKyAqIGZpdF9wYXJzZV9zdWJpbWFnZSAtIHBhcnNlIEZJVCBzdWJpbWFnZSBzcGVjCisgKiBAc3BlYzogaW5wdXQgc3RyaW5nLCBjb250YWluaW5nIHN1YmltYWdlIHNwZWMKKyAqIEBhZGRfY3VycjogY3VycmVudCBpbWFnZSBhZGRyZXNzICh0byBiZSB1c2VkIGFzIGEgcG9zc2libGUgZGVmYXVsdCkKKyAqIEBhZGRyOiBwb2ludGVyIHRvIGEgdWxvbmcgdmFyaWFibGUsIHdpbGwgaG9sZCBGSVQgaW1hZ2UgYWRkcmVzcyBvZiBhIGdpdmVuCisgKiBzdWJpbWFnZQorICogQGltYWdlX25hbWU6IGRvdWJsZSBwb2ludGVyIHRvIGEgY2hhciwgd2lsbCBob2xkIHBvaW50ZXIgdG8gYSBzdWJpbWFnZSBuYW1lCisgKgorICogZml0X3BhcnNlX3N1YmltYWdlKCkgZXhwZWN0cyBzdWJpbWFnZSBzcGVjIGluIHRoZSBmb3Igb2YKKyAqIFs8YWRkcj5dOjxzdWJpbWFnZT4sIHdoZXJlIDxhZGRyPiBpcyBhIEZJVCBpbWFnZSBhZGRyZXNzIHRoYXQgY29udGFpbnMKKyAqIHN1YmltYWdlIHdpdGggYSA8c3ViaW1nPiB1bml0IG5hbWUuCisgKgorICogQWRkcmVzcyBwYXJ0IGlzIG9wdGlvbmFsLCBhbmQgaWYgb21pdHRlZCBkZWZhdWx0IGFkZF9jdXJyIHdpbGwKKyAqIGJlIHVzZWQgaW5zdGVhZC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEgaWYgc3BlYyBpcyBhIHZhbGlkIHN1YmltYWdlIHN0cmluZywKKyAqICAgICBhZGRyIGFuZCBpbWFnZV9uYW1lIGFyZSBzZXQgYWNjb3JkaW5nbHkKKyAqICAgICAwIG90aGVyd2lzZQorICovCitpbmxpbmUgaW50IGZpdF9wYXJzZV9zdWJpbWFnZSAoY29uc3QgY2hhciAqc3BlYywgdWxvbmcgYWRkcl9jdXJyLAorCQl1bG9uZyAqYWRkciwgY29uc3QgY2hhciAqKmltYWdlX25hbWUpCit7CisJcmV0dXJuIGZpdF9wYXJzZV9zcGVjIChzcGVjLCAnOicsIGFkZHJfY3VyciwgYWRkciwgaW1hZ2VfbmFtZSk7Cit9CisjZW5kaWYgLyogIVVTRV9IT1NUQ0MgKi8KKworc3RhdGljIHZvaWQgZml0X2dldF9kZWJ1ZyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwKKwkJY2hhciAqcHJvcF9uYW1lLCBpbnQgZXJyKQoreworCWRlYnVnICgiQ2FuJ3QgZ2V0ICclcycgcHJvcGVydHkgZnJvbSBGSVQgMHglMDhseCwgIgorCQkibm9kZTogb2Zmc2V0ICVkLCBuYW1lICVzICglcylcbiIsCisJCXByb3BfbmFtZSwgKHVsb25nKWZpdCwgbm9mZnNldCwKKwkJZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQlmZHRfc3RyZXJyb3IgKGVycikpOworfQorCisvKioKKyAqIGZpdF9wcmludF9jb250ZW50cyAtIHByaW50cyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBGSVQgZm9ybWF0IGltYWdlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQHA6IHBvaW50ZXIgdG8gcHJlZml4IHN0cmluZworICoKKyAqIGZpdF9wcmludF9jb250ZW50cygpIGZvcm1hdHMgYSBtdWx0aSBsaW5lIEZJVCBpbWFnZSBjb250ZW50cyBkZXNjcmlwdGlvbi4KKyAqIFRoZSByb3V0aW5lIHByaW50cyBvdXQgRklUIGltYWdlIHByb3BlcnRpZXMgKHJvb3Qgbm9kZSBsZXZlbCkgZm9sbHdlZCBieQorICogdGhlIGRldGFpbHMgb2YgZWFjaCBjb21wb25lbnQgaW1hZ2UuCisgKgorICogcmV0dXJuczoKKyAqICAgICBubyByZXR1cm5lZCByZXN1bHRzCisgKi8KK3ZvaWQgZml0X3ByaW50X2NvbnRlbnRzIChjb25zdCB2b2lkICpmaXQpCit7CisJY2hhciAqZGVzYzsKKwljaGFyICp1bmFtZTsKKwlpbnQgaW1hZ2VzX25vZmZzZXQ7CisJaW50IGNvbmZzX25vZmZzZXQ7CisJaW50IG5vZmZzZXQ7CisJaW50IG5kZXB0aDsKKwlpbnQgY291bnQgPSAwOworCWludCByZXQ7CisJY29uc3QgY2hhciAqcDsKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCisJdGltZV90IHRpbWVzdGFtcDsKKyNlbmRpZgorCisjaWZkZWYgVVNFX0hPU1RDQworCXAgPSAiIjsKKyNlbHNlCisJcCA9ICIgICAiOworI2VuZGlmCisKKwkvKiBSb290IG5vZGUgcHJvcGVydGllcyAqLworCXJldCA9IGZpdF9nZXRfZGVzYyAoZml0LCAwLCAmZGVzYyk7CisJcHJpbnRmICgiJXNGSVQgZGVzY3JpcHRpb246ICIsIHApOworCWlmIChyZXQpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCXByaW50ZiAoIiVzXG4iLCBkZXNjKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKKwlyZXQgPSBmaXRfZ2V0X3RpbWVzdGFtcCAoZml0LCAwLCAmdGltZXN0YW1wKTsKKwlwcmludGYgKCIlc0NyZWF0ZWQ6ICAgICAgICAgIiwgcCk7CisJaWYgKHJldCkKKwkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCWVsc2UKKwkJZ2VuaW1nX3ByaW50X3RpbWUgKHRpbWVzdGFtcCk7CisjZW5kaWYKKworCS8qIEZpbmQgaW1hZ2VzIHBhcmVudCBub2RlIG9mZnNldCAqLworCWltYWdlc19ub2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmaXQsIEZJVF9JTUFHRVNfUEFUSCk7CisJaWYgKGltYWdlc19ub2Zmc2V0IDwgMCkgeworCQlwcmludGYgKCJDYW4ndCBmaW5kIGltYWdlcyBwYXJlbnQgbm9kZSAnJXMnICglcylcbiIsCisJCQlGSVRfSU1BR0VTX1BBVEgsIGZkdF9zdHJlcnJvciAoaW1hZ2VzX25vZmZzZXQpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFByb2Nlc3MgaXRzIHN1Ym5vZGVzLCBwcmludCBvdXQgY29tcG9uZW50IGltYWdlcyBkZXRhaWxzICovCisJZm9yIChuZGVwdGggPSAwLCBjb3VudCA9IDAsIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGltYWdlc19ub2Zmc2V0LCAmbmRlcHRoKTsKKwkgICAgIChub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkgICAgIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyoKKwkJCSAqIERpcmVjdCBjaGlsZCBub2RlIG9mIHRoZSBpbWFnZXMgcGFyZW50IG5vZGUsCisJCQkgKiBpLmUuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorCQkJICovCisJCQlwcmludGYgKCIlcyBJbWFnZSAldSAoJXMpXG4iLCBwLCBjb3VudCsrLAorCQkJCQlmaXRfZ2V0X25hbWUoZml0LCBub2Zmc2V0LCBOVUxMKSk7CisKKwkJCWZpdF9pbWFnZV9wcmludCAoZml0LCBub2Zmc2V0LCBwKTsKKwkJfQorCX0KKworCS8qIEZpbmQgY29uZmlndXJhdGlvbnMgcGFyZW50IG5vZGUgb2Zmc2V0ICovCisJY29uZnNfbm9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZml0LCBGSVRfQ09ORlNfUEFUSCk7CisJaWYgKGNvbmZzX25vZmZzZXQgPCAwKSB7CisJCWRlYnVnICgiQ2FuJ3QgZ2V0IGNvbmZpZ3VyYXRpb25zIHBhcmVudCBub2RlICclcycgKCVzKVxuIiwKKwkJCUZJVF9DT05GU19QQVRILCBmZHRfc3RyZXJyb3IgKGNvbmZzX25vZmZzZXQpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGdldCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdW5pdCBuYW1lIGZyb20gZGVmYXVsdCBwcm9wZXJ0eSAqLworCXVuYW1lID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfREVGQVVMVF9QUk9QLCBOVUxMKTsKKwlpZiAodW5hbWUpCisJCXByaW50ZiAoIiVzIERlZmF1bHQgQ29uZmlndXJhdGlvbjogJyVzJ1xuIiwgcCwgdW5hbWUpOworCisJLyogUHJvY2VzcyBpdHMgc3Vibm9kZXMsIHByaW50IG91dCBjb25maWd1cmF0aW9ucyBkZXRhaWxzICovCisJZm9yIChuZGVwdGggPSAwLCBjb3VudCA9IDAsIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGNvbmZzX25vZmZzZXQsICZuZGVwdGgpOworCSAgICAgKG5vZmZzZXQgPj0gMCkgJiYgKG5kZXB0aCA+IDApOworCSAgICAgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgbm9mZnNldCwgJm5kZXB0aCkpIHsKKwkJaWYgKG5kZXB0aCA9PSAxKSB7CisJCQkvKgorCQkJICogRGlyZWN0IGNoaWxkIG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb25zIHBhcmVudCBub2RlLAorCQkJICogaS5lLiBjb25maWd1cmF0aW9uIG5vZGUuCisJCQkgKi8KKwkJCXByaW50ZiAoIiVzIENvbmZpZ3VyYXRpb24gJXUgKCVzKVxuIiwgcCwgY291bnQrKywKKwkJCQkJZml0X2dldF9uYW1lKGZpdCwgbm9mZnNldCwgTlVMTCkpOworCisJCQlmaXRfY29uZl9wcmludCAoZml0LCBub2Zmc2V0LCBwKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBmaXRfaW1hZ2VfcHJpbnQgLSBwcmludHMgb3V0IHRoZSBGSVQgY29tcG9uZW50IGltYWdlIGRldGFpbHMKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAaW1hZ2Vfbm9mZnNldDogb2Zmc2V0IG9mIHRoZSBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQHA6IHBvaW50ZXIgdG8gcHJlZml4IHN0cmluZworICoKKyAqIGZpdF9pbWFnZV9wcmludCgpIGxpc3RzIGFsbCBtYW5kYXRvcnkgcHJvcGVyaWVzIGZvciB0aGUgcHJvY2Vzc2VkIGNvbXBvbmVudAorICogaW1hZ2UuIElmIHByZXNlbnQsIGhhc2ggbm9kZXMgYXJlIHByaW50ZWQgb3V0IGFzIHdlbGwuIExvYWQKKyAqIGFkZHJlc3MgZm9yIGltYWdlcyBvZiB0eXBlIGZpcm13YXJlIGlzIGFsc28gcHJpbnRlZCBvdXQuIFNpbmNlIHRoZSBsb2FkCisgKiBhZGRyZXNzIGlzIG5vdCBtYW5kYXRvcnkgZm9yIGZpcm13YXJlIGltYWdlcywgaXQgd2lsbCBiZSBvdXRwdXQgYXMKKyAqICJ1bmF2YWlsYWJsZSIgd2hlbiBub3QgcHJlc2VudC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIG5vIHJldHVybmVkIHJlc3VsdHMKKyAqLwordm9pZCBmaXRfaW1hZ2VfcHJpbnQgKGNvbnN0IHZvaWQgKmZpdCwgaW50IGltYWdlX25vZmZzZXQsIGNvbnN0IGNoYXIgKnApCit7CisJY2hhciAqZGVzYzsKKwl1aW50OF90IHR5cGUsIGFyY2gsIG9zLCBjb21wOworCXNpemVfdCBzaXplOworCXVsb25nIGxvYWQsIGVudHJ5OworCWNvbnN0IHZvaWQgKmRhdGE7CisJaW50IG5vZmZzZXQ7CisJaW50IG5kZXB0aDsKKwlpbnQgcmV0OworCisJLyogTWFuZGF0b3J5IHByb3BlcnRpZXMgKi8KKwlyZXQgPSBmaXRfZ2V0X2Rlc2MgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJmRlc2MpOworCXByaW50ZiAoIiVzICBEZXNjcmlwdGlvbjogICIsIHApOworCWlmIChyZXQpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCXByaW50ZiAoIiVzXG4iLCBkZXNjKTsKKworCWZpdF9pbWFnZV9nZXRfdHlwZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmdHlwZSk7CisJcHJpbnRmICgiJXMgIFR5cGU6ICAgICAgICAgJXNcbiIsIHAsIGdlbmltZ19nZXRfdHlwZV9uYW1lICh0eXBlKSk7CisKKwlmaXRfaW1hZ2VfZ2V0X2NvbXAgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJmNvbXApOworCXByaW50ZiAoIiVzICBDb21wcmVzc2lvbjogICVzXG4iLCBwLCBnZW5pbWdfZ2V0X2NvbXBfbmFtZSAoY29tcCkpOworCisJcmV0ID0gZml0X2ltYWdlX2dldF9kYXRhIChmaXQsIGltYWdlX25vZmZzZXQsICZkYXRhLCAmc2l6ZSk7CisKKyNpZm5kZWYgVVNFX0hPU1RDQworCXByaW50ZiAoIiVzICBEYXRhIFN0YXJ0OiAgICIsIHApOworCWlmIChyZXQpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCXByaW50ZiAoIjB4JTA4bHhcbiIsICh1bG9uZylkYXRhKTsKKyNlbmRpZgorCisJcHJpbnRmICgiJXMgIERhdGEgU2l6ZTogICAgIiwgcCk7CisJaWYgKHJldCkKKwkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCWVsc2UKKwkJZ2VuaW1nX3ByaW50X3NpemUgKHNpemUpOworCisJLyogUmVtYWluaW5nLCB0eXBlIGRlcGVuZGVudCBwcm9wZXJ0aWVzICovCisJaWYgKCh0eXBlID09IElIX1RZUEVfS0VSTkVMKSB8fCAodHlwZSA9PSBJSF9UWVBFX1NUQU5EQUxPTkUpIHx8CisJICAgICh0eXBlID09IElIX1RZUEVfUkFNRElTSykgfHwgKHR5cGUgPT0gSUhfVFlQRV9GSVJNV0FSRSkgfHwKKwkgICAgKHR5cGUgPT0gSUhfVFlQRV9GTEFURFQpKSB7CisJCWZpdF9pbWFnZV9nZXRfYXJjaCAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmYXJjaCk7CisJCXByaW50ZiAoIiVzICBBcmNoaXRlY3R1cmU6ICVzXG4iLCBwLCBnZW5pbWdfZ2V0X2FyY2hfbmFtZSAoYXJjaCkpOworCX0KKworCWlmICh0eXBlID09IElIX1RZUEVfS0VSTkVMKSB7CisJCWZpdF9pbWFnZV9nZXRfb3MgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJm9zKTsKKwkJcHJpbnRmICgiJXMgIE9TOiAgICAgICAgICAgJXNcbiIsIHAsIGdlbmltZ19nZXRfb3NfbmFtZSAob3MpKTsKKwl9CisKKwlpZiAoKHR5cGUgPT0gSUhfVFlQRV9LRVJORUwpIHx8ICh0eXBlID09IElIX1RZUEVfU1RBTkRBTE9ORSkgfHwKKwkJKHR5cGUgPT0gSUhfVFlQRV9GSVJNV0FSRSkpIHsKKwkJcmV0ID0gZml0X2ltYWdlX2dldF9sb2FkIChmaXQsIGltYWdlX25vZmZzZXQsICZsb2FkKTsKKwkJcHJpbnRmICgiJXMgIExvYWQgQWRkcmVzczogIiwgcCk7CisJCWlmIChyZXQpCisJCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJCWVsc2UKKwkJCXByaW50ZiAoIjB4JTA4bHhcbiIsIGxvYWQpOworCX0KKworCWlmICgodHlwZSA9PSBJSF9UWVBFX0tFUk5FTCkgfHwgKHR5cGUgPT0gSUhfVFlQRV9TVEFOREFMT05FKSkgeworCQlmaXRfaW1hZ2VfZ2V0X2VudHJ5IChmaXQsIGltYWdlX25vZmZzZXQsICZlbnRyeSk7CisJCXByaW50ZiAoIiVzICBFbnRyeSBQb2ludDogICIsIHApOworCQlpZiAocmV0KQorCQkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCQllbHNlCisJCQlwcmludGYgKCIweCUwOGx4XG4iLCBlbnRyeSk7CisJfQorCisJLyogUHJvY2VzcyBhbGwgaGFzaCBzdWJub2RlcyBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUgKi8KKwlmb3IgKG5kZXB0aCA9IDAsIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGltYWdlX25vZmZzZXQsICZuZGVwdGgpOworCSAgICAgKG5vZmZzZXQgPj0gMCkgJiYgKG5kZXB0aCA+IDApOworCSAgICAgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgbm9mZnNldCwgJm5kZXB0aCkpIHsKKwkJaWYgKG5kZXB0aCA9PSAxKSB7CisJCQkvKiBEaXJlY3QgY2hpbGQgbm9kZSBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUgKi8KKwkJCWZpdF9pbWFnZV9wcmludF9oYXNoIChmaXQsIG5vZmZzZXQsIHApOworCQl9CisJfQorfQorCisvKioKKyAqIGZpdF9pbWFnZV9wcmludF9oYXNoIC0gcHJpbnRzIG91dCB0aGUgaGFzaCBub2RlIGRldGFpbHMKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogb2Zmc2V0IG9mIHRoZSBoYXNoIG5vZGUKKyAqIEBwOiBwb2ludGVyIHRvIHByZWZpeCBzdHJpbmcKKyAqCisgKiBmaXRfaW1hZ2VfcHJpbnRfaGFzaCgpIGxpc3RzIHByb3BlcmllcyBmb3IgdGhlIHByb2Nlc3NlZCBoYXNoIG5vZGUKKyAqCisgKiByZXR1cm5zOgorICogICAgIG5vIHJldHVybmVkIHJlc3VsdHMKKyAqLwordm9pZCBmaXRfaW1hZ2VfcHJpbnRfaGFzaCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY29uc3QgY2hhciAqcCkKK3sKKwljaGFyICphbGdvOworCXVpbnQ4X3QgKnZhbHVlOworCWludCB2YWx1ZV9sZW47CisJaW50IGksIHJldDsKKworCS8qCisJICogQ2hlY2sgc3Vibm9kZSBuYW1lLCBtdXN0IGJlIGVxdWFsIHRvICJoYXNoIi4KKwkgKiBNdWx0aXBsZSBoYXNoIG5vZGVzIHJlcXVpcmUgdW5pcXVlIHVuaXQgbm9kZQorCSAqIG5hbWVzLCBlLmcuIGhhc2hAMSwgaGFzaEAyLCBldGMuCisJICovCisJaWYgKHN0cm5jbXAgKGZpdF9nZXRfbmFtZShmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJRklUX0hBU0hfTk9ERU5BTUUsCisJCQlzdHJsZW4oRklUX0hBU0hfTk9ERU5BTUUpKSAhPSAwKQorCQlyZXR1cm47CisKKwlkZWJ1ZyAoIiVzICBIYXNoIG5vZGU6ICAgICclcydcbiIsIHAsCisJCQlmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCkpOworCisJcHJpbnRmICgiJXMgIEhhc2ggYWxnbzogICAgIiwgcCk7CisJaWYgKGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvIChmaXQsIG5vZmZzZXQsICZhbGdvKSkgeworCQlwcmludGYgKCJpbnZhbGlkL3Vuc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwcmludGYgKCIlc1xuIiwgYWxnbyk7CisKKwlyZXQgPSBmaXRfaW1hZ2VfaGFzaF9nZXRfdmFsdWUgKGZpdCwgbm9mZnNldCwgJnZhbHVlLAorCQkJCQkmdmFsdWVfbGVuKTsKKwlwcmludGYgKCIlcyAgSGFzaCB2YWx1ZTogICAiLCBwKTsKKwlpZiAocmV0KSB7CisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgdmFsdWVfbGVuOyBpKyspCisJCQlwcmludGYgKCIlMDJ4IiwgdmFsdWVbaV0pOworCQlwcmludGYgKCJcbiIpOworCX0KKworCWRlYnVnICAoIiVzICBIYXNoIGxlbjogICAgICVkXG4iLCBwLCB2YWx1ZV9sZW4pOworfQorCisvKioKKyAqIGZpdF9nZXRfZGVzYyAtIGdldCBub2RlIGRlc2NyaXB0aW9uIHByb3BlcnR5CisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IG5vZGUgb2Zmc2V0CisgKiBAZGVzYzogZG91YmxlIHBvaW50ZXIgdG8gdGhlIGNoYXIsIHdpbGwgaG9sZCBwb2ludGVyIHRvIHRoZSBkZXNjcnB0aW9uCisgKgorICogZml0X2dldF9kZXNjKCkgcmVhZHMgZGVzY3JpcHRpb24gcHJvcGVydHkgZnJvbSBhIGdpdmVuIG5vZGUsIGlmCisgKiBkZXNjcmlwdGlvbiBpcyBmb3VuZCBwb2ludGVyIHRvIGl0IGlzIHJldHVyZW5lZCBpbiB0aGlyZCBjYWxsIGFyZ3VtZW50LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfZ2V0X2Rlc2MgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNoYXIgKipkZXNjKQoreworCWludCBsZW47CisKKwkqZGVzYyA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0RFU0NfUFJPUCwgJmxlbik7CisJaWYgKCpkZXNjID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfREVTQ19QUk9QLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2dldF90aW1lc3RhbXAgLSBnZXQgbm9kZSB0aW1lc3RhbXAgcHJvcGVydHkKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogbm9kZSBvZmZzZXQKKyAqIEB0aW1lc3RhbXA6IHBvaW50ZXIgdG8gdGhlIHRpbWVfdCwgd2lsbCBob2xkIHJlYWQgdGltZXN0YW1wCisgKgorICogZml0X2dldF90aW1lc3RhbXAoKSByZWFkcyB0aW1lc3RhbXAgcG9wZXJ0eSBmcm9tIGdpdmVuIG5vZGUsIGlmIHRpbWVzdGFtcAorICogaXMgZm91bmQgYW5kIGhhcyBhIGNvcnJlY3Qgc2l6ZSBpdHMgdmFsdWUgaXMgcmV0dXJlZCBpbiB0aGlyZCBjYWxsCisgKiBhcmd1bWVudC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gcHJvcGVydHkgcmVhZCBmYWlsdXJlCisgKiAgICAgLTIsIG9uIHdyb25nIHRpbWVzdGFtcCBzaXplCisgKi8KK2ludCBmaXRfZ2V0X3RpbWVzdGFtcCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdGltZV90ICp0aW1lc3RhbXApCit7CisJaW50IGxlbjsKKwljb25zdCB2b2lkICpkYXRhOworCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9USU1FU1RBTVBfUFJPUCwgJmxlbik7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9USU1FU1RBTVBfUFJPUCwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAobGVuICE9IHNpemVvZiAodWludDMyX3QpKSB7CisJCWRlYnVnICgiRklUIHRpbWVzdGFtcCB3aXRoIGluY29ycmVjdCBzaXplIG9mICgldSlcbiIsIGxlbik7CisJCXJldHVybiAtMjsKKwl9CisKKwkqdGltZXN0YW1wID0gdWltYWdlX3RvX2NwdSAoKigodWludDMyX3QgKilkYXRhKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9ub2RlIC0gZ2V0IG5vZGUgb2Zmc2V0IGZvciBjb21wb25lbnQgaW1hZ2Ugb2YgYSBnaXZlbiB1bml0IG5hbWUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAaW1hZ2VfdW5hbWU6IGNvbXBvbmVudCBpbWFnZSBub2RlIHVuaXQgbmFtZQorICoKKyAqIGZpdF9pbWFnZV9nZXRfbm9kZSgpIGZpbmRzIGEgY29tcG9uZW50IGltYWdlICh3aXRoaW5nIHRoZSAnL2ltYWdlcycKKyAqIG5vZGUpIG9mIGEgcHJvdmlkZWQgdW5pdCBuYW1lLiBJZiBpbWFnZSBpcyBmb3VuZCBpdHMgbm9kZSBvZmZzZXQgaXMKKyAqIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICBpbWFnZSBub2RlIG9mZnNldCB3aGVuIGZvdW5kICg+PTApCisgKiAgICAgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUgKEZEVF9FUlJfKiBjb2RlKQorICovCitpbnQgZml0X2ltYWdlX2dldF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGNvbnN0IGNoYXIgKmltYWdlX3VuYW1lKQoreworCWludCBub2Zmc2V0LCBpbWFnZXNfbm9mZnNldDsKKworCWltYWdlc19ub2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmaXQsIEZJVF9JTUFHRVNfUEFUSCk7CisJaWYgKGltYWdlc19ub2Zmc2V0IDwgMCkgeworCQlkZWJ1ZyAoIkNhbid0IGZpbmQgaW1hZ2VzIHBhcmVudCBub2RlICclcycgKCVzKVxuIiwKKwkJCUZJVF9JTUFHRVNfUEFUSCwgZmR0X3N0cmVycm9yIChpbWFnZXNfbm9mZnNldCkpOworCQlyZXR1cm4gaW1hZ2VzX25vZmZzZXQ7CisJfQorCisJbm9mZnNldCA9IGZkdF9zdWJub2RlX29mZnNldCAoZml0LCBpbWFnZXNfbm9mZnNldCwgaW1hZ2VfdW5hbWUpOworCWlmIChub2Zmc2V0IDwgMCkgeworCQlkZWJ1ZyAoIkNhbid0IGdldCBub2RlIG9mZnNldCBmb3IgaW1hZ2UgdW5pdCBuYW1lOiAnJXMnICglcylcbiIsCisJCQlpbWFnZV91bmFtZSwgZmR0X3N0cmVycm9yIChub2Zmc2V0KSk7CisJfQorCisJcmV0dXJuIG5vZmZzZXQ7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9vcyAtIGdldCBvcyBpZCBmb3IgYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBvczogcG9pbnRlciB0byB0aGUgdWludDhfdCwgd2lsbCBob2xkIG9zIG51bWVyaWMgaWQKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X29zKCkgZmluZHMgb3MgcHJvcGVydHkgaW4gYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCwgaXRzIChzdHJpbmcpIHZhbHVlIGlzIHRyYW5zbGF0ZWQgdG8gdGhlIG51bWVyaWMKKyAqIGlkIHdoaWNoIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfb3MgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKm9zKQoreworCWludCBsZW47CisJY29uc3Qgdm9pZCAqZGF0YTsKKworCS8qIEdldCBPUyBuYW1lIGZyb20gcHJvcGVydHkgZGF0YSAqLworCWRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfT1NfUFJPUCwgJmxlbik7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9PU19QUk9QLCBsZW4pOworCQkqb3MgPSAtMTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFRyYW5zbGF0ZSBPUyBuYW1lIHRvIGlkICovCisJKm9zID0gZ2VuaW1nX2dldF9vc19pZCAoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9hcmNoIC0gZ2V0IGFyY2ggaWQgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAYXJjaDogcG9pbnRlciB0byB0aGUgdWludDhfdCwgd2lsbCBob2xkIGFyY2ggbnVtZXJpYyBpZAorICoKKyAqIGZpdF9pbWFnZV9nZXRfYXJjaCgpIGZpbmRzIGFyY2ggcHJvcGVydHkgaW4gYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCwgaXRzIChzdHJpbmcpIHZhbHVlIGlzIHRyYW5zbGF0ZWQgdG8gdGhlIG51bWVyaWMKKyAqIGlkIHdoaWNoIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfYXJjaCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqYXJjaCkKK3sKKwlpbnQgbGVuOworCWNvbnN0IHZvaWQgKmRhdGE7CisKKwkvKiBHZXQgYXJjaGl0ZWN0dXJlIG5hbWUgZnJvbSBwcm9wZXJ0eSBkYXRhICovCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9BUkNIX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfQVJDSF9QUk9QLCBsZW4pOworCQkqYXJjaCA9IC0xOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVHJhbnNsYXRlIGFyY2hpdGVjdHVyZSBuYW1lIHRvIGlkICovCisJKmFyY2ggPSBnZW5pbWdfZ2V0X2FyY2hfaWQgKGRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfdHlwZSAtIGdldCB0eXBlIGlkIGZvciBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQHR5cGU6IHBvaW50ZXIgdG8gdGhlIHVpbnQ4X3QsIHdpbGwgaG9sZCB0eXBlIG51bWVyaWMgaWQKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X3R5cGUoKSBmaW5kcyB0eXBlIHByb3BlcnR5IGluIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQsIGl0cyAoc3RyaW5nKSB2YWx1ZSBpcyB0cmFuc2xhdGVkIHRvIHRoZSBudW1lcmljCisgKiBpZCB3aGljaCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X3R5cGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKnR5cGUpCit7CisJaW50IGxlbjsKKwljb25zdCB2b2lkICpkYXRhOworCisJLyogR2V0IGltYWdlIHR5cGUgbmFtZSBmcm9tIHByb3BlcnR5IGRhdGEgKi8KKwlkYXRhID0gZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX1RZUEVfUFJPUCwgJmxlbik7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9UWVBFX1BST1AsIGxlbik7CisJCSp0eXBlID0gLTE7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBUcmFuc2xhdGUgaW1hZ2UgdHlwZSBuYW1lIHRvIGlkICovCisJKnR5cGUgPSBnZW5pbWdfZ2V0X3R5cGVfaWQgKGRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfY29tcCAtIGdldCBjb21wIGlkIGZvciBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGNvbXA6IHBvaW50ZXIgdG8gdGhlIHVpbnQ4X3QsIHdpbGwgaG9sZCBjb21wIG51bWVyaWMgaWQKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X2NvbXAoKSBmaW5kcyBjb21wIHByb3BlcnR5IGluIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQsIGl0cyAoc3RyaW5nKSB2YWx1ZSBpcyB0cmFuc2xhdGVkIHRvIHRoZSBudW1lcmljCisgKiBpZCB3aGljaCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X2NvbXAgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKmNvbXApCit7CisJaW50IGxlbjsKKwljb25zdCB2b2lkICpkYXRhOworCisJLyogR2V0IGNvbXByZXNzaW9uIG5hbWUgZnJvbSBwcm9wZXJ0eSBkYXRhICovCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9DT01QX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfQ09NUF9QUk9QLCBsZW4pOworCQkqY29tcCA9IC0xOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVHJhbnNsYXRlIGNvbXByZXNzaW9uIG5hbWUgdG8gaWQgKi8KKwkqY29tcCA9IGdlbmltZ19nZXRfY29tcF9pZCAoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9sb2FkIC0gZ2V0IGxvYWQgYWRkcmVzcyBwcm9wZXJ0eSBmb3IgYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBsb2FkOiBwb2ludGVyIHRvIHRoZSB1aW50MzJfdCwgd2lsbCBob2xkIGxvYWQgYWRkcmVzcworICoKKyAqIGZpdF9pbWFnZV9nZXRfbG9hZCgpIGZpbmRzIGxvYWQgYWRkcmVzcyBwcm9wZXJ0eSBpbiBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kLCBpdHMgdmFsdWUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2dldF9sb2FkIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1bG9uZyAqbG9hZCkKK3sKKwlpbnQgbGVuOworCWNvbnN0IHVpbnQzMl90ICpkYXRhOworCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9MT0FEX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfTE9BRF9QUk9QLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJKmxvYWQgPSB1aW1hZ2VfdG9fY3B1ICgqZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9lbnRyeSAtIGdldCBlbnRyeSBwb2ludCBhZGRyZXNzIHByb3BlcnR5IGZvciBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGVudHJ5OiBwb2ludGVyIHRvIHRoZSB1aW50MzJfdCwgd2lsbCBob2xkIGVudHJ5IHBvaW50IGFkZHJlc3MKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X2VudHJ5KCkgZmluZHMgZW50cnkgcG9pbnQgYWRkcmVzcyBwcm9wZXJ0eSBpbiBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kLCBpdHMgdmFsdWUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2dldF9lbnRyeSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWxvbmcgKmVudHJ5KQoreworCWludCBsZW47CisJY29uc3QgdWludDMyX3QgKmRhdGE7CisKKwlkYXRhID0gZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0VOVFJZX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfRU5UUllfUFJPUCwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCSplbnRyeSA9IHVpbWFnZV90b19jcHUgKCpkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfZ2V0X2RhdGEgLSBnZXQgZGF0YSBwcm9wZXJ0eSBhbmQgaXRzIHNpemUgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAZGF0YTogZG91YmxlIHBvaW50ZXIgdG8gdm9pZCwgd2lsbCBob2xkIGRhdGEgcHJvcGVydHkncyBkYXRhIGFkZHJlc3MKKyAqIEBzaXplOiBwb2ludGVyIHRvIHNpemVfdCwgd2lsbCBob2xkIGRhdGEgcHJvcGVydHkncyBkYXRhIHNpemUKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X2RhdGEoKSBmaW5kcyBkYXRhIHByb3BlcnR5IGluIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQgaXRzIGRhdGEgc3RhcnQgYWRkcmVzcyBhbmQgc2l6ZSBhcmUgcmV0dXJuZWQgdG8KKyAqIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfZGF0YSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwKKwkJY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkKK3sKKwlpbnQgbGVuOworCisJKmRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfREFUQV9QUk9QLCAmbGVuKTsKKwlpZiAoKmRhdGEgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9EQVRBX1BST1AsIGxlbik7CisJCSpzaXplID0gMDsKKwkJcmV0dXJuIC0xOworCX0KKworCSpzaXplID0gbGVuOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvIC0gZ2V0IGhhc2ggYWxnb3JpdGhtIG5hbWUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogaGFzaCBub2RlIG9mZnNldAorICogQGFsZ286IGRvdWJsZSBwb2ludGVyIHRvIGNoYXIsIHdpbGwgaG9sZCBwb2ludGVyIHRvIHRoZSBhbGdvcml0aG0gbmFtZQorICoKKyAqIGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvKCkgZmluZHMgaGFzaCBhbGdvcml0aG0gcHJvcGVydHkgaW4gYSBnaXZlbiBoYXNoIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQgaXRzIGRhdGEgc3RhcnQgYWRkcmVzcyBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY2hhciAqKmFsZ28pCit7CisJaW50IGxlbjsKKworCSphbGdvID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfQUxHT19QUk9QLCAmbGVuKTsKKwlpZiAoKmFsZ28gPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9BTEdPX1BST1AsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfaGFzaF9nZXRfdmFsdWUgLSBnZXQgaGFzaCB2YWx1ZSBhbmQgbGVuZ3RoCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGhhc2ggbm9kZSBvZmZzZXQKKyAqIEB2YWx1ZTogZG91YmxlIHBvaW50ZXIgdG8gdWludDhfdCwgd2lsbCBob2xkIGFkZHJlc3Mgb2YgYSBoYXNoIHZhbHVlIGRhdGEKKyAqIEB2YWx1ZV9sZW46IHBvaW50ZXIgdG8gYW4gaW50LCB3aWxsIGhvbGQgaGFzaCBkYXRhIGxlbmd0aAorICoKKyAqIGZpdF9pbWFnZV9oYXNoX2dldF92YWx1ZSgpIGZpbmRzIGhhc2ggdmFsdWUgcHJvcGVydHkgaW4gYSBnaXZlbiBoYXNoIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQgaXRzIGRhdGEgc3RhcnQgYWRkcmVzcyBhbmQgc2l6ZSBhcmUgcmV0dXJuZWQgdG8KKyAqIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9oYXNoX2dldF92YWx1ZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqKnZhbHVlLAorCQkJCWludCAqdmFsdWVfbGVuKQoreworCWludCBsZW47CisKKwkqdmFsdWUgPSAodWludDhfdCAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9WQUxVRV9QUk9QLCAmbGVuKTsKKwlpZiAoKnZhbHVlID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfVkFMVUVfUFJPUCwgbGVuKTsKKwkJKnZhbHVlX2xlbiA9IDA7CisJCXJldHVybiAtMTsKKwl9CisKKwkqdmFsdWVfbGVuID0gbGVuOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9zZXRfdGltZXN0YW1wIC0gc2V0IG5vZGUgdGltZXN0YW1wIHByb3BlcnR5CisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IG5vZGUgb2Zmc2V0CisgKiBAdGltZXN0YW1wOiB0aW1lc3RhbXAgdmFsdWUgdG8gYmUgc2V0CisgKgorICogZml0X3NldF90aW1lc3RhbXAoKSBhdHRlbXB0cyB0byBzZXQgdGltZXN0YW1wIHByb3BlcnR5IGluIHRoZSByZXF1ZXN0ZWQKKyAqIG5vZGUgYW5kIHJldHVybnMgb3BlcmF0aW9uIHN0YXR1cyB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBwcm9wZXJ0eSByZWFkIGZhaWx1cmUKKyAqLworaW50IGZpdF9zZXRfdGltZXN0YW1wICh2b2lkICpmaXQsIGludCBub2Zmc2V0LCB0aW1lX3QgdGltZXN0YW1wKQoreworCXVpbnQzMl90IHQ7CisJaW50IHJldDsKKworCXQgPSBjcHVfdG9fdWltYWdlICh0aW1lc3RhbXApOworCXJldCA9IGZkdF9zZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9USU1FU1RBTVBfUFJPUCwgJnQsCisJCQkJc2l6ZW9mICh1aW50MzJfdCkpOworCWlmIChyZXQpIHsKKwkJcHJpbnRmICgiQ2FuJ3Qgc2V0ICclcycgcHJvcGVydHkgZm9yICclcycgbm9kZSAoJXMpXG4iLAorCQkJRklUX1RJTUVTVEFNUF9QUk9QLCBmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQlmZHRfc3RyZXJyb3IgKHJldCkpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsY3VsYXRlX2hhc2ggLSBjYWxjdWxhdGUgYW5kIHJldHVybiBoYXNoIGZvciBwcm92aWRlZCBpbnB1dCBkYXRhCisgKiBAZGF0YTogcG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YQorICogQGRhdGFfbGVuOiBkYXRhIGxlbmd0aAorICogQGFsZ286IHJlcXVlc3RlZCBoYXNoIGFsZ29yaXRobQorICogQHZhbHVlOiBwb2ludGVyIHRvIHRoZSBjaGFyLCB3aWxsIGhvbGQgaGFzaCB2YWx1ZSBkYXRhIChjYWxsZXIgbXVzdAorICogYWxsb2NhdGUgZW5vdWdoIGZyZWUgc3BhY2UpCisgKiB2YWx1ZV9sZW46IGxlbmd0aCBvZiB0aGUgY2FsY3VsYXRlZCBoYXNoCisgKgorICogY2FsY3VsYXRlX2hhc2goKSBjb21wdXRlcyBpbnB1dCBkYXRhIGhhc2ggYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgYWxnb3JpdGhtLgorICogUmVzdWx0aW5nIGhhc2ggdmFsdWUgaXMgcGxhY2VkIGluIGNhbGxlciBwcm92aWRlZCAndmFsdWUnIGJ1ZmZlciwgbGVuZ3RoCisgKiBvZiB0aGUgY2FsY3VsYXRlZCBoYXNoIGlzIHJldHVybmVkIHZpYSB2YWx1ZV9sZW4gcG9pbnRlciBhcmd1bWVudC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgIC0xLCB3aGVuIGFsZ28gaXMgdW5zdXBwb3J0ZWQKKyAqLworc3RhdGljIGludCBjYWxjdWxhdGVfaGFzaCAoY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFfbGVuLCBjb25zdCBjaGFyICphbGdvLAorCQkJdWludDhfdCAqdmFsdWUsIGludCAqdmFsdWVfbGVuKQoreworCWlmIChzdHJjbXAgKGFsZ28sICJjcmMzMiIpID09IDAgKSB7CisJCSooKHVpbnQzMl90ICopdmFsdWUpID0gY3JjMzJfd2QgKDAsIGRhdGEsIGRhdGFfbGVuLAorCQkJCQkJCUNIVU5LU1pfQ1JDMzIpOworCQkqKCh1aW50MzJfdCAqKXZhbHVlKSA9IGNwdV90b191aW1hZ2UgKCooKHVpbnQzMl90ICopdmFsdWUpKTsKKwkJKnZhbHVlX2xlbiA9IDQ7CisJfSBlbHNlIGlmIChzdHJjbXAgKGFsZ28sICJzaGExIikgPT0gMCApIHsKKwkJc2hhMV9jc3VtX3dkICgodW5zaWduZWQgY2hhciAqKSBkYXRhLCBkYXRhX2xlbiwKKwkJCQkodW5zaWduZWQgY2hhciAqKSB2YWx1ZSwgQ0hVTktTWl9TSEExKTsKKwkJKnZhbHVlX2xlbiA9IDIwOworCX0gZWxzZSBpZiAoc3RyY21wIChhbGdvLCAibWQ1IikgPT0gMCApIHsKKwkJbWQ1X3dkICgodW5zaWduZWQgY2hhciAqKWRhdGEsIGRhdGFfbGVuLCB2YWx1ZSwgQ0hVTktTWl9NRDUpOworCQkqdmFsdWVfbGVuID0gMTY7CisJfSBlbHNlIHsKKwkJZGVidWcgKCJVbnN1cHBvcnRlZCBoYXNoIGFsb2dyaXRobVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBVU0VfSE9TVENDCisvKioKKyAqIGZpdF9zZXRfaGFzaGVzIC0gcHJvY2VzcyBGSVQgY29tcG9uZW50IGltYWdlIG5vZGVzIGFuZCBjYWxjdWxhdGUgaGFzaGVzCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICoKKyAqIGZpdF9zZXRfaGFzaGVzKCkgYWRkcyBoYXNoIHZhbHVlcyBmb3IgYWxsIGNvbXBvbmVudCBpbWFnZXMgaW4gdGhlIEZJVCBibG9iLgorICogSGFzaGVzIGFyZSBjYWxjdWxhdGVkIGZvciBhbGwgY29tcG9uZW50IGltYWdlcyB3aGljaCBoYXZlIGhhc2ggc3Vibm9kZXMKKyAqIHdpdGggYWxnb3JpdGhtIHByb3BlcnR5IHNldCB0byBvbmUgb2YgdGhlIHN1cHBvcnRlZCBoYXNoIGFsZ29yaXRobXMuCisgKgorICogcmV0dXJucworICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICBsaWJmZHQgZXJyb3IgY29kZSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X3NldF9oYXNoZXMgKHZvaWQgKmZpdCkKK3sKKwlpbnQgaW1hZ2VzX25vZmZzZXQ7CisJaW50IG5vZmZzZXQ7CisJaW50IG5kZXB0aDsKKwlpbnQgcmV0OworCisJLyogRmluZCBpbWFnZXMgcGFyZW50IG5vZGUgb2Zmc2V0ICovCisJaW1hZ2VzX25vZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZpdCwgRklUX0lNQUdFU19QQVRIKTsKKwlpZiAoaW1hZ2VzX25vZmZzZXQgPCAwKSB7CisJCXByaW50ZiAoIkNhbid0IGZpbmQgaW1hZ2VzIHBhcmVudCBub2RlICclcycgKCVzKVxuIiwKKwkJCUZJVF9JTUFHRVNfUEFUSCwgZmR0X3N0cmVycm9yIChpbWFnZXNfbm9mZnNldCkpOworCQlyZXR1cm4gaW1hZ2VzX25vZmZzZXQ7CisJfQorCisJLyogUHJvY2VzcyBpdHMgc3Vibm9kZXMsIHByaW50IG91dCBjb21wb25lbnQgaW1hZ2VzIGRldGFpbHMgKi8KKwlmb3IgKG5kZXB0aCA9IDAsIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGltYWdlc19ub2Zmc2V0LCAmbmRlcHRoKTsKKwkgICAgIChub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkgICAgIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyoKKwkJCSAqIERpcmVjdCBjaGlsZCBub2RlIG9mIHRoZSBpbWFnZXMgcGFyZW50IG5vZGUsCisJCQkgKiBpLmUuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorCQkJICovCisJCQlyZXQgPSBmaXRfaW1hZ2Vfc2V0X2hhc2hlcyAoZml0LCBub2Zmc2V0KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9zZXRfaGFzaGVzIC0gY2FsY3VsYXRlL3NldCBoYXNoZXMgZm9yIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQGltYWdlX25vZmZzZXQ6IHJlcXVlc3RlZCBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICoKKyAqIGZpdF9pbWFnZV9zZXRfaGFzaGVzKCkgYWRkcyBoYXNoIHZhbHVlcyBmb3IgYW4gY29tcG9uZW50IGltYWdlIG5vZGUuIEFsbAorICogZXhpc3RpbmcgaGFzaCBzdWJub2RlcyBhcmUgY2hlY2tlZCwgaWYgYWxnb3JpdGhtIHByb3BlcnR5IGlzIHNldCB0byBvbmUgb2YKKyAqIHRoZSBzdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG1zLCBoYXNoIHZhbHVlIGlzIGNvbXB1dGVkIGFuZCBjb3JyZXNwb25kaW5nCisgKiBoYXNoIG5vZGUgcHJvcGVydHkgaXMgc2V0LCBmb3IgZXhhbXBsZToKKyAqCisgKiBJbnB1dCBjb21wb25lbnQgaW1hZ2Ugbm9kZSBzdHJ1Y3R1cmU6CisgKgorICogbyBpbWFnZUAxIChhdCBpbWFnZV9ub2Zmc2V0KQorICogICB8IC0gZGF0YSA9IFtiaW5hcnkgZGF0YV0KKyAqICAgbyBoYXNoQDEKKyAqICAgICB8LSBhbGdvID0gInNoYTEiCisgKgorICogT3V0cHV0IGNvbXBvbmVudCBpbWFnZSBub2RlIHN0cnVjdHVyZToKKyAqCisgKiBvIGltYWdlQDEgKGF0IGltYWdlX25vZmZzZXQpCisgKiAgIHwgLSBkYXRhID0gW2JpbmFyeSBkYXRhXQorICogICBvIGhhc2hAMQorICogICAgIHwtIGFsZ28gPSAic2hhMSIKKyAqICAgICB8LSB2YWx1ZSA9IHNoYTEoZGF0YSkKKyAqCisgKiByZXR1cm5zOgorICogICAgIDAgb24gc3VjZXNzCisgKiAgICA8MCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2Vfc2V0X2hhc2hlcyAodm9pZCAqZml0LCBpbnQgaW1hZ2Vfbm9mZnNldCkKK3sKKwljb25zdCB2b2lkICpkYXRhOworCXNpemVfdCBzaXplOworCWNoYXIgKmFsZ287CisJdWludDhfdCB2YWx1ZVtGSVRfTUFYX0hBU0hfTEVOXTsKKwlpbnQgdmFsdWVfbGVuOworCWludCBub2Zmc2V0OworCWludCBuZGVwdGg7CisKKwkvKiBHZXQgaW1hZ2UgZGF0YSBhbmQgZGF0YSBsZW5ndGggKi8KKwlpZiAoZml0X2ltYWdlX2dldF9kYXRhIChmaXQsIGltYWdlX25vZmZzZXQsICZkYXRhLCAmc2l6ZSkpIHsKKwkJcHJpbnRmICgiQ2FuJ3QgZ2V0IGltYWdlIGRhdGEvc2l6ZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBQcm9jZXNzIGFsbCBoYXNoIHN1Ym5vZGVzIG9mIHRoZSBjb21wb25lbnQgaW1hZ2Ugbm9kZSAqLworCWZvciAobmRlcHRoID0gMCwgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJm5kZXB0aCk7CisJICAgICAobm9mZnNldCA+PSAwKSAmJiAobmRlcHRoID4gMCk7CisJICAgICBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBub2Zmc2V0LCAmbmRlcHRoKSkgeworCQlpZiAobmRlcHRoID09IDEpIHsKKwkJCS8qIERpcmVjdCBjaGlsZCBub2RlIG9mIHRoZSBjb21wb25lbnQgaW1hZ2Ugbm9kZSAqLworCisJCQkvKgorCQkJICogQ2hlY2sgc3Vibm9kZSBuYW1lLCBtdXN0IGJlIGVxdWFsIHRvICJoYXNoIi4KKwkJCSAqIE11bHRpcGxlIGhhc2ggbm9kZXMgcmVxdWlyZSB1bmlxdWUgdW5pdCBub2RlCisJCQkgKiBuYW1lcywgZS5nLiBoYXNoQDEsIGhhc2hAMiwgZXRjLgorCQkJICovCisJCQlpZiAoc3RybmNtcCAoZml0X2dldF9uYW1lKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQkJCQlGSVRfSEFTSF9OT0RFTkFNRSwKKwkJCQkJCXN0cmxlbihGSVRfSEFTSF9OT0RFTkFNRSkpICE9IDApIHsKKwkJCQkvKiBOb3QgYSBoYXNoIHN1Ym5vZGUsIHNraXAgaXQgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvIChmaXQsIG5vZmZzZXQsICZhbGdvKSkgeworCQkJCXByaW50ZiAoIkNhbid0IGdldCBoYXNoIGFsZ28gcHJvcGVydHkgZm9yICIKKwkJCQkJIiclcycgaGFzaCBub2RlIGluICclcycgaW1hZ2Ugbm9kZVxuIiwKKwkJCQkJZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJCQlmaXRfZ2V0X25hbWUgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgTlVMTCkpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJaWYgKGNhbGN1bGF0ZV9oYXNoIChkYXRhLCBzaXplLCBhbGdvLCB2YWx1ZSwgJnZhbHVlX2xlbikpIHsKKwkJCQlwcmludGYgKCJVbnN1cHBvcnRlZCBoYXNoIGFsZ29yaXRobSAoJXMpIGZvciAiCisJCQkJCSInJXMnIGhhc2ggbm9kZSBpbiAnJXMnIGltYWdlIG5vZGVcbiIsCisJCQkJCWFsZ28sIGZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCQkJZml0X2dldF9uYW1lIChmaXQsIGltYWdlX25vZmZzZXQsIE5VTEwpKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCWlmIChmaXRfaW1hZ2VfaGFzaF9zZXRfdmFsdWUgKGZpdCwgbm9mZnNldCwgdmFsdWUsCisJCQkJCQkJdmFsdWVfbGVuKSkgeworCQkJCXByaW50ZiAoIkNhbid0IHNldCBoYXNoIHZhbHVlIGZvciAiCisJCQkJCSInJXMnIGhhc2ggbm9kZSBpbiAnJXMnIGltYWdlIG5vZGVcbiIsCisJCQkJCWZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCQkJZml0X2dldF9uYW1lIChmaXQsIGltYWdlX25vZmZzZXQsIE5VTEwpKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfaGFzaF9zZXRfdmFsdWUgLSBzZXQgaGFzaCB2YWx1ZSBpbiByZXF1ZXN0ZWQgaGFzIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogaGFzaCBub2RlIG9mZnNldAorICogQHZhbHVlOiBoYXNoIHZhbHVlIHRvIGJlIHNldAorICogQHZhbHVlX2xlbjogaGFzaCB2YWx1ZSBsZW5ndGgKKyAqCisgKiBmaXRfaW1hZ2VfaGFzaF9zZXRfdmFsdWUoKSBhdHRlbXB0cyB0byBzZXQgaGFzaCB2YWx1ZSBpbiBhIG5vZGUgYXQgb2Zmc2V0CisgKiBnaXZlbiBhbmQgcmV0dXJucyBvcGVyYXRpb24gc3RhdHVzIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJucworICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2hhc2hfc2V0X3ZhbHVlICh2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICp2YWx1ZSwKKwkJCQlpbnQgdmFsdWVfbGVuKQoreworCWludCByZXQ7CisKKwlyZXQgPSBmZHRfc2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfVkFMVUVfUFJPUCwgdmFsdWUsIHZhbHVlX2xlbik7CisJaWYgKHJldCkgeworCQlwcmludGYgKCJDYW4ndCBzZXQgaGFzaCAnJXMnIHByb3BlcnR5IGZvciAnJXMnIG5vZGUgKCVzKVxuIiwKKwkJCUZJVF9WQUxVRV9QUk9QLCBmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQlmZHRfc3RyZXJyb3IgKHJldCkpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogVVNFX0hPU1RDQyAqLworCisvKioKKyAqIGZpdF9pbWFnZV9jaGVja19oYXNoZXMgLSB2ZXJpZnkgZGF0YSBpbnRlcmdpdHkKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAaW1hZ2Vfbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKgorICogZml0X2ltYWdlX2NoZWNrX2hhc2hlcygpIGdvZXMgb3ZlciBjb21wb25lbnQgaW1hZ2UgaGFzaCBub2RlcywKKyAqIHJlLWNhbGN1bGF0ZXMgZWFjaCBkYXRhIGhhc2ggYW5kIGNvbXBhcmVzIHdpdGggdGhlIHZhbHVlIHN0b3JlZCBpbiBoYXNoCisgKiBub2RlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSwgaWYgYWxsIGhhc2hlcyBhcmUgdmFsaWQKKyAqICAgICAwLCBvdGhlcndpc2UgKG9yIG9uIGVycm9yKQorICovCitpbnQgZml0X2ltYWdlX2NoZWNrX2hhc2hlcyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgaW1hZ2Vfbm9mZnNldCkKK3sKKwljb25zdCB2b2lkCSpkYXRhOworCXNpemVfdAkJc2l6ZTsKKwljaGFyCQkqYWxnbzsKKwl1aW50OF90CQkqZml0X3ZhbHVlOworCWludAkJZml0X3ZhbHVlX2xlbjsKKwl1aW50OF90CQl2YWx1ZVtGSVRfTUFYX0hBU0hfTEVOXTsKKwlpbnQJCXZhbHVlX2xlbjsKKwlpbnQJCW5vZmZzZXQ7CisJaW50CQluZGVwdGg7CisJY2hhcgkJKmVycl9tc2cgPSAiIjsKKworCS8qIEdldCBpbWFnZSBkYXRhIGFuZCBkYXRhIGxlbmd0aCAqLworCWlmIChmaXRfaW1hZ2VfZ2V0X2RhdGEgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJmRhdGEsICZzaXplKSkgeworCQlwcmludGYgKCJDYW4ndCBnZXQgaW1hZ2UgZGF0YS9zaXplXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUHJvY2VzcyBhbGwgaGFzaCBzdWJub2RlcyBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUgKi8KKwlmb3IgKG5kZXB0aCA9IDAsIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGltYWdlX25vZmZzZXQsICZuZGVwdGgpOworCSAgICAgKG5vZmZzZXQgPj0gMCkgJiYgKG5kZXB0aCA+IDApOworCSAgICAgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgbm9mZnNldCwgJm5kZXB0aCkpIHsKKwkJaWYgKG5kZXB0aCA9PSAxKSB7CisJCQkvKiBEaXJlY3QgY2hpbGQgbm9kZSBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUgKi8KKworCQkJLyoKKwkJCSAqIENoZWNrIHN1Ym5vZGUgbmFtZSwgbXVzdCBiZSBlcXVhbCB0byAiaGFzaCIuCisJCQkgKiBNdWx0aXBsZSBoYXNoIG5vZGVzIHJlcXVpcmUgdW5pcXVlIHVuaXQgbm9kZQorCQkJICogbmFtZXMsIGUuZy4gaGFzaEAxLCBoYXNoQDIsIGV0Yy4KKwkJCSAqLworCQkJaWYgKHN0cm5jbXAgKGZpdF9nZXRfbmFtZShmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJCQlGSVRfSEFTSF9OT0RFTkFNRSwKKwkJCQkJc3RybGVuKEZJVF9IQVNIX05PREVOQU1FKSkgIT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvIChmaXQsIG5vZmZzZXQsICZhbGdvKSkgeworCQkJCWVycl9tc2cgPSAiIGVycm9yIVxuQ2FuJ3QgZ2V0IGhhc2ggYWxnbyAiCisJCQkJCQkicHJvcGVydHkiOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlwcmludGYgKCIlcyIsIGFsZ28pOworCisJCQlpZiAoZml0X2ltYWdlX2hhc2hfZ2V0X3ZhbHVlIChmaXQsIG5vZmZzZXQsICZmaXRfdmFsdWUsCisJCQkJCQkJJmZpdF92YWx1ZV9sZW4pKSB7CisJCQkJZXJyX21zZyA9ICIgZXJyb3IhXG5DYW4ndCBnZXQgaGFzaCB2YWx1ZSAiCisJCQkJCQkicHJvcGVydHkiOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisKKwkJCWlmIChjYWxjdWxhdGVfaGFzaCAoZGF0YSwgc2l6ZSwgYWxnbywgdmFsdWUsICZ2YWx1ZV9sZW4pKSB7CisJCQkJZXJyX21zZyA9ICIgZXJyb3IhXG5VbnN1cHBvcnRlZCBoYXNoIGFsZ29yaXRobSI7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJaWYgKHZhbHVlX2xlbiAhPSBmaXRfdmFsdWVfbGVuKSB7CisJCQkJZXJyX21zZyA9ICIgZXJyb3IgIVxuQmFkIGhhc2ggdmFsdWUgbGVuIjsKKwkJCQlnb3RvIGVycm9yOworCQkJfSBlbHNlIGlmIChtZW1jbXAgKHZhbHVlLCBmaXRfdmFsdWUsIHZhbHVlX2xlbikgIT0gMCkgeworCQkJCWVycl9tc2cgPSAiIGVycm9yIVxuQmFkIGhhc2ggdmFsdWUiOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlwcmludGYgKCIrICIpOworCQl9CisJfQorCisJcmV0dXJuIDE7CisKK2Vycm9yOgorCXByaW50ZiAoIiVzIGZvciAnJXMnIGhhc2ggbm9kZSBpbiAnJXMnIGltYWdlIG5vZGVcbiIsCisJCQllcnJfbXNnLCBmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQlmaXRfZ2V0X25hbWUgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgTlVMTCkpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9hbGxfaW1hZ2VfY2hlY2tfaGFzaGVzIC0gdmVyaWZ5IGRhdGEgaW50ZXJnaXR5IGZvciBhbGwgaW1hZ2VzCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICoKKyAqIGZpdF9hbGxfaW1hZ2VfY2hlY2tfaGFzaGVzKCkgZ29lcyBvdmVyIGFsbCBpbWFnZXMgaW4gdGhlIEZJVCBhbmQKKyAqIGZvciBldmVyeSBpbWFnZXMgY2hlY2tzIGlmIGFsbCBpdCdzIGhhc2hlcyBhcmUgdmFsaWQuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxLCBpZiBhbGwgaGFzaGVzIG9mIGFsbCBpbWFnZXMgYXJlIHZhbGlkCisgKiAgICAgMCwgb3RoZXJ3aXNlIChvciBvbiBlcnJvcikKKyAqLworaW50IGZpdF9hbGxfaW1hZ2VfY2hlY2tfaGFzaGVzIChjb25zdCB2b2lkICpmaXQpCit7CisJaW50IGltYWdlc19ub2Zmc2V0OworCWludCBub2Zmc2V0OworCWludCBuZGVwdGg7CisJaW50IGNvdW50OworCisJLyogRmluZCBpbWFnZXMgcGFyZW50IG5vZGUgb2Zmc2V0ICovCisJaW1hZ2VzX25vZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZpdCwgRklUX0lNQUdFU19QQVRIKTsKKwlpZiAoaW1hZ2VzX25vZmZzZXQgPCAwKSB7CisJCXByaW50ZiAoIkNhbid0IGZpbmQgaW1hZ2VzIHBhcmVudCBub2RlICclcycgKCVzKVxuIiwKKwkJCUZJVF9JTUFHRVNfUEFUSCwgZmR0X3N0cmVycm9yIChpbWFnZXNfbm9mZnNldCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBQcm9jZXNzIGFsbCBpbWFnZSBzdWJub2RlcywgY2hlY2sgaGFzaGVzIGZvciBlYWNoICovCisJcHJpbnRmICgiIyMgQ2hlY2tpbmcgaGFzaChlcykgZm9yIEZJVCBJbWFnZSBhdCAlMDhseCAuLi5cbiIsCisJCSh1bG9uZylmaXQpOworCWZvciAobmRlcHRoID0gMCwgY291bnQgPSAwLAorCQlub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBpbWFnZXNfbm9mZnNldCwgJm5kZXB0aCk7CisJCShub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkJbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgbm9mZnNldCwgJm5kZXB0aCkpIHsKKwkJaWYgKG5kZXB0aCA9PSAxKSB7CisJCQkvKgorCQkJICogRGlyZWN0IGNoaWxkIG5vZGUgb2YgdGhlIGltYWdlcyBwYXJlbnQgbm9kZSwKKwkJCSAqIGkuZS4gY29tcG9uZW50IGltYWdlIG5vZGUuCisJCQkgKi8KKwkJCXByaW50ZiAoIiAgIEhhc2goZXMpIGZvciBJbWFnZSAldSAoJXMpOiAiLCBjb3VudCsrLAorCQkJCQlmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCkpOworCisJCQlpZiAoIWZpdF9pbWFnZV9jaGVja19oYXNoZXMgKGZpdCwgbm9mZnNldCkpCisJCQkJcmV0dXJuIDA7CisJCQlwcmludGYgKCJcbiIpOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9jaGVja19vcyAtIGNoZWNrIHdoZXRoZXIgaW1hZ2Ugbm9kZSBpcyBvZiBhIGdpdmVuIG9zIHR5cGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAb3M6IHJlcXVlc3RlZCBpbWFnZSBvcworICoKKyAqIGZpdF9pbWFnZV9jaGVja19vcygpIHJlYWRzIGltYWdlIG9zIHByb3BlcnR5IGFuZCBjb21wYXJlcyBpdHMgbnVtZXJpYworICogaWQgd2l0aCB0aGUgcmVxdWVzdGVkIG9zLiBDb21wYXJpc29uIHJlc3VsdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSBpZiBpbWFnZSBpcyBvZiBnaXZlbiBvcyB0eXBlCisgKiAgICAgMCBvdGhlcndpc2UgKG9yIG9uIGVycm9yKQorICovCitpbnQgZml0X2ltYWdlX2NoZWNrX29zIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IG9zKQoreworCXVpbnQ4X3QgaW1hZ2Vfb3M7CisKKwlpZiAoZml0X2ltYWdlX2dldF9vcyAoZml0LCBub2Zmc2V0LCAmaW1hZ2Vfb3MpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKG9zID09IGltYWdlX29zKTsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfY2hlY2tfYXJjaCAtIGNoZWNrIHdoZXRoZXIgaW1hZ2Ugbm9kZSBpcyBvZiBhIGdpdmVuIGFyY2gKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAYXJjaDogcmVxdWVzdGVkIGltYWdlYXJjaAorICoKKyAqIGZpdF9pbWFnZV9jaGVja19hcmNoKCkgcmVhZHMgaW1hZ2UgYXJjaCBwcm9wZXJ0eSBhbmQgY29tcGFyZXMgaXRzIG51bWVyaWMKKyAqIGlkIHdpdGggdGhlIHJlcXVlc3RlZCBhcmNoLiBDb21wYXJpc29uIHJlc3VsdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSBpZiBpbWFnZSBpcyBvZiBnaXZlbiBhcmNoCisgKiAgICAgMCBvdGhlcndpc2UgKG9yIG9uIGVycm9yKQorICovCitpbnQgZml0X2ltYWdlX2NoZWNrX2FyY2ggKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgYXJjaCkKK3sKKwl1aW50OF90IGltYWdlX2FyY2g7CisKKwlpZiAoZml0X2ltYWdlX2dldF9hcmNoIChmaXQsIG5vZmZzZXQsICZpbWFnZV9hcmNoKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChhcmNoID09IGltYWdlX2FyY2gpOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9jaGVja190eXBlIC0gY2hlY2sgd2hldGhlciBpbWFnZSBub2RlIGlzIG9mIGEgZ2l2ZW4gdHlwZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEB0eXBlOiByZXF1ZXN0ZWQgaW1hZ2UgdHlwZQorICoKKyAqIGZpdF9pbWFnZV9jaGVja190eXBlKCkgcmVhZHMgaW1hZ2UgdHlwZSBwcm9wZXJ0eSBhbmQgY29tcGFyZXMgaXRzIG51bWVyaWMKKyAqIGlkIHdpdGggdGhlIHJlcXVlc3RlZCB0eXBlLiBDb21wYXJpc29uIHJlc3VsdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSBpZiBpbWFnZSBpcyBvZiBnaXZlbiB0eXBlCisgKiAgICAgMCBvdGhlcndpc2UgKG9yIG9uIGVycm9yKQorICovCitpbnQgZml0X2ltYWdlX2NoZWNrX3R5cGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgdHlwZSkKK3sKKwl1aW50OF90IGltYWdlX3R5cGU7CisKKwlpZiAoZml0X2ltYWdlX2dldF90eXBlIChmaXQsIG5vZmZzZXQsICZpbWFnZV90eXBlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICh0eXBlID09IGltYWdlX3R5cGUpOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9jaGVja19jb21wIC0gY2hlY2sgd2hldGhlciBpbWFnZSBub2RlIHVzZXMgZ2l2ZW4gY29tcHJlc3Npb24KKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAY29tcDogcmVxdWVzdGVkIGltYWdlIGNvbXByZXNzaW9uIHR5cGUKKyAqCisgKiBmaXRfaW1hZ2VfY2hlY2tfY29tcCgpIHJlYWRzIGltYWdlIGNvbXByZXNzaW9uIHByb3BlcnR5IGFuZCBjb21wYXJlcyBpdHMKKyAqIG51bWVyaWMgaWQgd2l0aCB0aGUgcmVxdWVzdGVkIGNvbXByZXNzaW9uIHR5cGUuIENvbXBhcmlzb24gcmVzdWx0IGlzCisgKiByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSBpZiBpbWFnZSB1c2VzIHJlcXVlc3RlZCBjb21wcmVzc2lvbgorICogICAgIDAgb3RoZXJ3aXNlIChvciBvbiBlcnJvcikKKyAqLworaW50IGZpdF9pbWFnZV9jaGVja19jb21wIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IGNvbXApCit7CisJdWludDhfdCBpbWFnZV9jb21wOworCisJaWYgKGZpdF9pbWFnZV9nZXRfY29tcCAoZml0LCBub2Zmc2V0LCAmaW1hZ2VfY29tcCkpCisJCXJldHVybiAwOworCXJldHVybiAoY29tcCA9PSBpbWFnZV9jb21wKTsKK30KKworLyoqCisgKiBmaXRfY2hlY2tfZm9ybWF0IC0gc2FuaXR5IGNoZWNrIEZJVCBpbWFnZSBmb3JtYXQKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKgorICogZml0X2NoZWNrX2Zvcm1hdCgpIHJ1bnMgYSBiYXNpYyBzYW5pdHkgRklUIGltYWdlIHZlcmlmaWNhdGlvbi4KKyAqIFJvdXRpbmUgY2hlY2tzIGZvciBtYW5kYXRvcnkgcHJvcGVydGllcywgbm9kZXMsIGV0Yy4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEsIG9uIHN1Y2Nlc3MKKyAqICAgICAwLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfY2hlY2tfZm9ybWF0IChjb25zdCB2b2lkICpmaXQpCit7CisJLyogbWFuZGF0b3J5IC8gbm9kZSAnZGVzY3JpcHRpb24nIHByb3BlcnR5ICovCisJaWYgKGZkdF9nZXRwcm9wIChmaXQsIDAsIEZJVF9ERVNDX1BST1AsIE5VTEwpID09IE5VTEwpIHsKKwkJZGVidWcgKCJXcm9uZyBGSVQgZm9ybWF0OiBubyBkZXNjcmlwdGlvblxuIik7CisJCXJldHVybiAwOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKKwkvKiBtYW5kYXRvcnkgLyBub2RlICd0aW1lc3RhbXAnIHByb3BlcnR5ICovCisJaWYgKGZkdF9nZXRwcm9wIChmaXQsIDAsIEZJVF9USU1FU1RBTVBfUFJPUCwgTlVMTCkgPT0gTlVMTCkgeworCQlkZWJ1ZyAoIldyb25nIEZJVCBmb3JtYXQ6IG5vIHRpbWVzdGFtcFxuIik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJLyogbWFuZGF0b3J5IHN1YmltYWdlcyBwYXJlbnQgJy9pbWFnZXMnIG5vZGUgKi8KKwlpZiAoZmR0X3BhdGhfb2Zmc2V0IChmaXQsIEZJVF9JTUFHRVNfUEFUSCkgPCAwKSB7CisJCWRlYnVnICgiV3JvbmcgRklUIGZvcm1hdDogbm8gaW1hZ2VzIHBhcmVudCBub2RlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogZml0X2NvbmZfZ2V0X25vZGUgLSBnZXQgbm9kZSBvZmZzZXQgZm9yIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB1bml0IG5hbWUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAY29uZl91bmFtZTogY29uZmlndXJhdGlvbiBub2RlIHVuaXQgbmFtZQorICoKKyAqIGZpdF9jb25mX2dldF9ub2RlKCkgZmluZHMgYSBjb25maWd1cmF0aW9uICh3aXRoaW5nIHRoZSAnL2NvbmZpZ3VyYXRpb25zJworICogcGFyYW50IG5vZGUpIG9mIGEgcHJvdmlkZWQgdW5pdCBuYW1lLiBJZiBjb25maWd1cmF0aW9uIGlzIGZvdW5kIGl0cyBub2RlIG9mZnNldAorICogaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiBXaGVuIE5VTEwgaXMgcHJvdmlkZWQgaW4gc2Vjb25kIGFyZ3VtZW50IGZpdF9jb25mX2dldF9ub2RlKCkgd2lsbCBzZWFyY2gKKyAqIGZvciBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiBub2RlIGluc3RlYWQuIERlZmF1bHQgY29uZmlndXJhdGlvbiBub2RlIHVuaXQgbmFtZQorICogaXMgcmV0cml2ZWQgZnJvbSBGSVRfREVGQVVMVF9QUk9QIHByb3BlcnR5IG9mIHRoZSAnL2NvbmZpZ3VyYXRpb25zJyBub2RlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgY29uZmlndXJhdGlvbiBub2RlIG9mZnNldCB3aGVuIGZvdW5kICg+PTApCisgKiAgICAgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUgKEZEVF9FUlJfKiBjb2RlKQorICovCitpbnQgZml0X2NvbmZfZ2V0X25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgY29uc3QgY2hhciAqY29uZl91bmFtZSkKK3sKKwlpbnQgbm9mZnNldCwgY29uZnNfbm9mZnNldDsKKwlpbnQgbGVuOworCisJY29uZnNfbm9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZml0LCBGSVRfQ09ORlNfUEFUSCk7CisJaWYgKGNvbmZzX25vZmZzZXQgPCAwKSB7CisJCWRlYnVnICgiQ2FuJ3QgZmluZCBjb25maWd1cmF0aW9ucyBwYXJlbnQgbm9kZSAnJXMnICglcylcbiIsCisJCQlGSVRfQ09ORlNfUEFUSCwgZmR0X3N0cmVycm9yIChjb25mc19ub2Zmc2V0KSk7CisJCXJldHVybiBjb25mc19ub2Zmc2V0OworCX0KKworCWlmIChjb25mX3VuYW1lID09IE5VTEwpIHsKKwkJLyogZ2V0IGNvbmZpZ3VyYXRpb24gdW5pdCBuYW1lIGZyb20gdGhlIGRlZmF1bHQgcHJvcGVydHkgKi8KKwkJZGVidWcgKCJObyBjb25maWd1cmF0aW9uIHNwZWNpZmllZCwgdHJ5aW5nIGRlZmF1bHQuLi5cbiIpOworCQljb25mX3VuYW1lID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBjb25mc19ub2Zmc2V0LCBGSVRfREVGQVVMVF9QUk9QLCAmbGVuKTsKKwkJaWYgKGNvbmZfdW5hbWUgPT0gTlVMTCkgeworCQkJZml0X2dldF9kZWJ1ZyAoZml0LCBjb25mc19ub2Zmc2V0LCBGSVRfREVGQVVMVF9QUk9QLCBsZW4pOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCQlkZWJ1ZyAoIkZvdW5kIGRlZmF1bHQgY29uZmlndXJhdGlvbjogJyVzJ1xuIiwgY29uZl91bmFtZSk7CisJfQorCisJbm9mZnNldCA9IGZkdF9zdWJub2RlX29mZnNldCAoZml0LCBjb25mc19ub2Zmc2V0LCBjb25mX3VuYW1lKTsKKwlpZiAobm9mZnNldCA8IDApIHsKKwkJZGVidWcgKCJDYW4ndCBnZXQgbm9kZSBvZmZzZXQgZm9yIGNvbmZpZ3VyYXRpb24gdW5pdCBuYW1lOiAnJXMnICglcylcbiIsCisJCQljb25mX3VuYW1lLCBmZHRfc3RyZXJyb3IgKG5vZmZzZXQpKTsKKwl9CisKKwlyZXR1cm4gbm9mZnNldDsKK30KKworc3RhdGljIGludCBfX2ZpdF9jb25mX2dldF9wcm9wX25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsCisJCWNvbnN0IGNoYXIgKnByb3BfbmFtZSkKK3sKKwljaGFyICp1bmFtZTsKKwlpbnQgbGVuOworCisJLyogZ2V0IGtlcm5lbCBpbWFnZSB1bml0IG5hbWUgZnJvbSBjb25maWd1cmF0aW9uIGtlcm5lbCBwcm9wZXJ0eSAqLworCXVuYW1lID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBwcm9wX25hbWUsICZsZW4pOworCWlmICh1bmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gbGVuOworCisJcmV0dXJuIGZpdF9pbWFnZV9nZXRfbm9kZSAoZml0LCB1bmFtZSk7Cit9CisKKy8qKgorICogZml0X2NvbmZfZ2V0X2tlcm5lbF9ub2RlIC0gZ2V0IGtlcm5lbCBpbWFnZSBub2RlIG9mZnNldCB0aGF0IGNvcnJlc3BvbmRzIHRvCisgKiBhIGdpdmVuIGNvbmZpZ3VyYXRpb24KKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29uZmlndXJhdGlvbiBub2RlIG9mZnNldAorICoKKyAqIGZpdF9jb25mX2dldF9rZXJuZWxfbm9kZSgpIHJldHJpdmVzIGtlcm5lbCBpbWFnZSBub2RlIHVuaXQgbmFtZSBmcm9tCisgKiBjb25maWd1cmF0aW9uIEZJVF9LRVJORUxfUFJPUCBwcm9wZXJ0eSBhbmQgdHJhbnNsYXRlcyBpdCB0byB0aGUgbm9kZQorICogb2Zmc2V0LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgaW1hZ2Ugbm9kZSBvZmZzZXQgd2hlbiBmb3VuZCAoPj0wKQorICogICAgIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlIChGRFRfRVJSXyogY29kZSkKKyAqLworaW50IGZpdF9jb25mX2dldF9rZXJuZWxfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCkKK3sKKwlyZXR1cm4gX19maXRfY29uZl9nZXRfcHJvcF9ub2RlIChmaXQsIG5vZmZzZXQsIEZJVF9LRVJORUxfUFJPUCk7Cit9CisKKy8qKgorICogZml0X2NvbmZfZ2V0X3JhbWRpc2tfbm9kZSAtIGdldCByYW1kaXNrIGltYWdlIG5vZGUgb2Zmc2V0IHRoYXQgY29ycmVzcG9uZHMgdG8KKyAqIGEgZ2l2ZW4gY29uZmlndXJhdGlvbgorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb25maWd1cmF0aW9uIG5vZGUgb2Zmc2V0CisgKgorICogZml0X2NvbmZfZ2V0X3JhbWRpc2tfbm9kZSgpIHJldHJpdmVzIHJhbWRpc2sgaW1hZ2Ugbm9kZSB1bml0IG5hbWUgZnJvbQorICogY29uZmlndXJhdGlvbiBGSVRfS0VSTkVMX1BST1AgcHJvcGVydHkgYW5kIHRyYW5zbGF0ZXMgaXQgdG8gdGhlIG5vZGUKKyAqIG9mZnNldC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGltYWdlIG5vZGUgb2Zmc2V0IHdoZW4gZm91bmQgKD49MCkKKyAqICAgICBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZSAoRkRUX0VSUl8qIGNvZGUpCisgKi8KK2ludCBmaXRfY29uZl9nZXRfcmFtZGlza19ub2RlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0KQoreworCXJldHVybiBfX2ZpdF9jb25mX2dldF9wcm9wX25vZGUgKGZpdCwgbm9mZnNldCwgRklUX1JBTURJU0tfUFJPUCk7Cit9CisKKy8qKgorICogZml0X2NvbmZfZ2V0X2ZkdF9ub2RlIC0gZ2V0IGZkdCBpbWFnZSBub2RlIG9mZnNldCB0aGF0IGNvcnJlc3BvbmRzIHRvCisgKiBhIGdpdmVuIGNvbmZpZ3VyYXRpb24KKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29uZmlndXJhdGlvbiBub2RlIG9mZnNldAorICoKKyAqIGZpdF9jb25mX2dldF9mZHRfbm9kZSgpIHJldHJpdmVzIGZkdCBpbWFnZSBub2RlIHVuaXQgbmFtZSBmcm9tCisgKiBjb25maWd1cmF0aW9uIEZJVF9LRVJORUxfUFJPUCBwcm9wZXJ0eSBhbmQgdHJhbnNsYXRlcyBpdCB0byB0aGUgbm9kZQorICogb2Zmc2V0LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgaW1hZ2Ugbm9kZSBvZmZzZXQgd2hlbiBmb3VuZCAoPj0wKQorICogICAgIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlIChGRFRfRVJSXyogY29kZSkKKyAqLworaW50IGZpdF9jb25mX2dldF9mZHRfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCkKK3sKKwlyZXR1cm4gX19maXRfY29uZl9nZXRfcHJvcF9ub2RlIChmaXQsIG5vZmZzZXQsIEZJVF9GRFRfUFJPUCk7Cit9CisKKy8qKgorICogZml0X2NvbmZfcHJpbnQgLSBwcmludHMgb3V0IHRoZSBGSVQgY29uZmlndXJhdGlvbiBkZXRhaWxzCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IG9mZnNldCBvZiB0aGUgY29uZmlndXJhdGlvbiBub2RlCisgKiBAcDogcG9pbnRlciB0byBwcmVmaXggc3RyaW5nCisgKgorICogZml0X2NvbmZfcHJpbnQoKSBsaXN0cyBhbGwgbWFuZGF0b3J5IHByb3BlcmllcyBmb3IgdGhlIHByb2Nlc3NlZAorICogY29uZmlndXJhdGlvbiBub2RlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgbm8gcmV0dXJuZWQgcmVzdWx0cworICovCit2b2lkIGZpdF9jb25mX3ByaW50IChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjb25zdCBjaGFyICpwKQoreworCWNoYXIgKmRlc2M7CisJY2hhciAqdW5hbWU7CisJaW50IHJldDsKKworCS8qIE1hbmRhdG9yeSBwcm9wZXJ0aWVzICovCisJcmV0ID0gZml0X2dldF9kZXNjIChmaXQsIG5vZmZzZXQsICZkZXNjKTsKKwlwcmludGYgKCIlcyAgRGVzY3JpcHRpb246ICAiLCBwKTsKKwlpZiAocmV0KQorCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJZWxzZQorCQlwcmludGYgKCIlc1xuIiwgZGVzYyk7CisKKwl1bmFtZSA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0tFUk5FTF9QUk9QLCBOVUxMKTsKKwlwcmludGYgKCIlcyAgS2VybmVsOiAgICAgICAiLCBwKTsKKwlpZiAodW5hbWUgPT0gTlVMTCkKKwkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCWVsc2UKKwkJcHJpbnRmICgiJXNcbiIsIHVuYW1lKTsKKworCS8qIE9wdGlvbmFsIHByb3BlcnRpZXMgKi8KKwl1bmFtZSA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX1JBTURJU0tfUFJPUCwgTlVMTCk7CisJaWYgKHVuYW1lKQorCQlwcmludGYgKCIlcyAgSW5pdCBSYW1kaXNrOiAlc1xuIiwgcCwgdW5hbWUpOworCisJdW5hbWUgPSAoY2hhciAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9GRFRfUFJPUCwgTlVMTCk7CisJaWYgKHVuYW1lKQorCQlwcmludGYgKCIlcyAgRkRUOiAgICAgICAgICAlc1xuIiwgcCwgdW5hbWUpOworfQorCisvKioKKyAqIGZpdF9jaGVja19yYW1kaXNrIC0gdmVyaWZ5IEZJVCBmb3JtYXQgcmFtZGlzayBzdWJpbWFnZQorICogQGZpdF9oZHI6IHBvaW50ZXIgdG8gdGhlIEZJVCByYW1kaXNrIGhlYWRlcgorICogQHJkX25vZmZzZXQ6IHJhbWRpc2sgc3ViaW1hZ2Ugbm9kZSBvZmZzZXQgd2l0aGluIEZJVCBpbWFnZQorICogQGFyY2g6IHJlcXVlc3RlZCByYW1kaXNrIGltYWdlIGFyY2hpdGVjdHVyZSB0eXBlCisgKiBAdmVyaWZ5OiBkYXRhIENSQyB2ZXJpZmljYXRpb24gZmxhZworICoKKyAqIGZpdF9jaGVja19yYW1kaXNrKCkgdmVyaWZpZXMgaW50ZWdyaXR5IG9mIHRoZSByYW1kaXNrIHN1YmltYWdlIGFuZCBmcm9tCisgKiBzcGVjaWZpZWQgRklUIGltYWdlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSwgb24gc3VjY2VzcworICogICAgIDAsIG9uIGZhaWx1cmUKKyAqLworI2lmbmRlZiBVU0VfSE9TVENDCitzdGF0aWMgaW50IGZpdF9jaGVja19yYW1kaXNrIChjb25zdCB2b2lkICpmaXQsIGludCByZF9ub2Zmc2V0LCB1aW50OF90IGFyY2gsIGludCB2ZXJpZnkpCit7CisJZml0X2ltYWdlX3ByaW50IChmaXQsIHJkX25vZmZzZXQsICIgICAiKTsKKworCWlmICh2ZXJpZnkpIHsKKwkJcHV0cyAoIiAgIFZlcmlmeWluZyBIYXNoIEludGVncml0eSAuLi4gIik7CisJCWlmICghZml0X2ltYWdlX2NoZWNrX2hhc2hlcyAoZml0LCByZF9ub2Zmc2V0KSkgeworCQkJcHV0cyAoIkJhZCBEYXRhIEhhc2hcbiIpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTI1KTsKKwkJCXJldHVybiAwOworCQl9CisJCXB1dHMgKCJPS1xuIik7CisJfQorCisJc2hvd19ib290X3Byb2dyZXNzICgxMjYpOworCWlmICghZml0X2ltYWdlX2NoZWNrX29zIChmaXQsIHJkX25vZmZzZXQsIElIX09TX0xJTlVYKSB8fAorCSAgICAhZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZpdCwgcmRfbm9mZnNldCwgYXJjaCkgfHwKKwkgICAgIWZpdF9pbWFnZV9jaGVja190eXBlIChmaXQsIHJkX25vZmZzZXQsIElIX1RZUEVfUkFNRElTSykpIHsKKwkJcHJpbnRmICgiTm8gTGludXggJXMgUmFtZGlzayBJbWFnZVxuIiwKKwkJCQlnZW5pbWdfZ2V0X2FyY2hfbmFtZShhcmNoKSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTEyNik7CisJCXJldHVybiAwOworCX0KKworCXNob3dfYm9vdF9wcm9ncmVzcyAoMTI3KTsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBVU0VfSE9TVENDICovCisjZW5kaWYgLyogQ09ORklHX0ZJVCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY29tbW9uL21haW4uYyBiL3gtbG9hZGVyL2NvbW1vbi9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhNzg4ZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NvbW1vbi9tYWluLmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBBZGQgdG8gcmVhZGxpbmUgY21kbGluZS1lZGl0aW5nIGJ5CisgKiAoQykgQ29weXJpZ2h0IDIwMDUKKyAqIEppbkh1YSBMdW8sIEd1YW5nRG9uZyBMaW51eCBDZW50ZXIsIDxsdW8uamluaHVhQGdkLWxpbnV4LmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiAjZGVmaW5lCURFQlVHCSovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKy8qCisgKiBCb2FyZC1zcGVjaWZpYyBQbGF0Zm9ybSBjb2RlIGNhbiByZWltcGxlbWVudCBzaG93X2Jvb3RfcHJvZ3Jlc3MgKCkgaWYgbmVlZGVkCisgKi8KK3ZvaWQgaW5saW5lIF9fc2hvd19ib290X3Byb2dyZXNzIChpbnQgdmFsKSB7fQordm9pZCBzaG93X2Jvb3RfcHJvZ3Jlc3MgKGludCB2YWwpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3Nob3dfYm9vdF9wcm9ncmVzcyIpKSk7CmRpZmYgLS1naXQgYS94LWxvYWRlci9jb25maWcubWsgYi94LWxvYWRlci9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4MGM2MQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NvbmZpZy5tawpAQCAtMCwwICsxLDI1NCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmbmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCitpZmVxICgkKENVUkRJUiksJChTUkNUUkVFKSkKK2RpciA6PQorZWxzZQorZGlyIDo9ICQoc3Vic3QgJChTUkNUUkVFKS8sLCQoQ1VSRElSKSkKK2VuZGlmCisKK29iaiA6PSAkKGlmICQoZGlyKSwkKE9CSlRSRUUpLyQoZGlyKS8sJChPQkpUUkVFKS8pCitzcmMgOj0gJChpZiAkKGRpciksJChTUkNUUkVFKS8kKGRpcikvLCQoU1JDVFJFRSkvKQorCiskKHNoZWxsIG1rZGlyIC1wICQob2JqKSkKK2Vsc2UKK29iaiA6PQorc3JjIDo9CitlbmRpZgorCisjIGNsZWFuIHRoZSBzbGF0ZSAuLi4KK1BMQVRGT1JNX1JFTEZMQUdTID0KK1BMQVRGT1JNX0NQUEZMQUdTID0KK1BMQVRGT1JNX0xERkxBR1MgPQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0hPU1RDRkxBR1MJPSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciBcCisJCSAgJChIT1NUQ1BQRkxBR1MpCitIT1NUU1RSSVAJPSBzdHJpcAorCisjCisjIE1hYyBPUyBYIC8gRGFyd2luJ3MgQyBwcmVwcm9jZXNzb3IgaXMgQXBwbGUgc3BlY2lmaWMuICBJdAorIyBnZW5lcmF0ZXMgbnVtZXJvdXMgZXJyb3JzIGFuZCB3YXJuaW5ncy4gIFdlIHdhbnQgdG8gYnlwYXNzIGl0CisjIGFuZCB1c2UgR05VIEMncyBjcHAuICBUbyBkbyB0aGlzIHdlIHBhc3MgdGhlIC10cmFkaXRpb25hbC1jcHAKKyMgb3B0aW9uIHRvIHRoZSBjb21waWxlci4gIE5vdGUgdGhhdCB0aGUgLXRyYWRpdGlvbmFsLWNwcCBmbGFnCisjIERPRVMgTk9UIGhhdmUgdGhlIHNhbWUgc2VtYW50aWNzIGFzIEdOVSBDJ3MgZmxhZywgYWxsIGl0IGRvZXMKKyMgaXMgaW52b2tlIHRoZSBHTlUgcHJlcHJvY2Vzc29yIGluIHN0b2NrIEFOU0kvSVNPIEMgZmFzaGlvbi4KKyMKKyMgQXBwbGUncyBsaW5rZXIgaXMgc2ltaWxhciwgdGhhbmtzIHRvIHRoZSBuZXcgMiBzdGFnZSBsaW5raW5nCisjIG11bHRpcGxlIHN5bWJvbCBkZWZpbml0aW9ucyBhcmUgdHJlYXRlZCBhcyBlcnJvcnMsIGhlbmNlIHRoZQorIyAtbXVsdGlwbHlfZGVmaW5lZCBzdXBwcmVzcyBvcHRpb24gdG8gdHVybiBvZmYgdGhpcyBlcnJvci4KKyMKKworaWZlcSAoJChIT1NUT1MpLGRhcndpbikKKyMgZ2V0IG1ham9yIGFuZCBtaW5vciBwcm9kdWN0IHZlcnNpb24gKGUuZy4gJzEwJyBhbmQgJzYnIGZvciBTbm93IExlb3BhcmQpCitEQVJXSU5fTUFKT1JfVkVSU0lPTgk9ICQoc2hlbGwgc3dfdmVycyAtcHJvZHVjdFZlcnNpb24gfCBjdXQgLWYgMSAtZCAnLicpCitEQVJXSU5fTUlOT1JfVkVSU0lPTgk9ICQoc2hlbGwgc3dfdmVycyAtcHJvZHVjdFZlcnNpb24gfCBjdXQgLWYgMiAtZCAnLicpCisKK29zX3hfYmVmb3JlCT0gJChzaGVsbCBpZiBbICQoREFSV0lOX01BSk9SX1ZFUlNJT04pIC1sZSAkKDEpIC1hIFwKKwkkKERBUldJTl9NSU5PUl9WRVJTSU9OKSAtbGUgJCgyKSBdIDsgdGhlbiBlY2hvICIkKDMpIjsgZWxzZSBlY2hvICIkKDQpIjsgZmkgOykKKworIyBTbm93IExlb3BhcmRzIGJ1aWxkIGVudmlyb25tZW50IGhhcyBubyBsb25nZXIgcmVzdHJpY3Rpb25zIGFzIGRlc2NyaWJlZCBhYm92ZQorSE9TVENDCQkgPSAkKGNhbGwgb3NfeF9iZWZvcmUsIDEwLCA1LCAiY2MiLCAiZ2NjIikKK0hPU1RDRkxBR1MJKz0gJChjYWxsIG9zX3hfYmVmb3JlLCAxMCwgNCwgIi10cmFkaXRpb25hbC1jcHAiKQorSE9TVExERkxBR1MJKz0gJChjYWxsIG9zX3hfYmVmb3JlLCAxMCwgNSwgIi1tdWx0aXBseV9kZWZpbmVkIHN1cHByZXNzIikKK2Vsc2UKK0hPU1RDQwkJPSBnY2MKK2VuZGlmCisKK2lmZXEgKCQoSE9TVE9TKSxjeWd3aW4pCitIT1NUQ0ZMQUdTCSs9IC1hbnNpCitlbmRpZgorCisjIFdlIGJ1aWxkIHNvbWUgZmlsZXMgd2l0aCBleHRyYSBwZWRhbnRpYyBmbGFncyB0byB0cnkgdG8gbWluaW1pemUgdGhpbmdzCisjIHRoYXQgd29uJ3QgYnVpbGQgb24gc29tZSB3ZWlyZCBob3N0IGNvbXBpbGVyIC0tIHRob3VnaCB0aGVyZSBhcmUgbG90cyBvZgorIyBleGNlcHRpb25zIGZvciBmaWxlcyB0aGF0IGFyZW4ndCBjb21wbGFpbnQuCisKK0hPU1RDRkxBR1NfTk9QRUQgPSAkKGZpbHRlci1vdXQgLXBlZGFudGljLCQoSE9TVENGTEFHUykpCitIT1NUQ0ZMQUdTCSs9IC1wZWRhbnRpYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE9wdGlvbiBjaGVja2VyIChjb3VydGVzeSBsaW51eCBrZXJuZWwpIHRvIGVuc3VyZQorIyBvbmx5IHN1cHBvcnRlZCBjb21waWxlciBvcHRpb25zIGFyZSB1c2VkCisjCitjYy1vcHRpb24gPSAkKHNoZWxsIGlmICQoQ0MpICQoQ0ZMQUdTKSAkKDEpIC1TIC1vIC9kZXYvbnVsbCAteGMgL2Rldi9udWxsIFwKKwkJPiAvZGV2L251bGwgMj4mMTsgdGhlbiBlY2hvICIkKDEpIjsgZWxzZSBlY2hvICIkKDIpIjsgZmkgOykKKworIworIyBJbmNsdWRlIHRoZSBtYWtlIHZhcmlhYmxlcyAoQ0MsIGV0Yy4uLikKKyMKK0FTCT0gJChDUk9TU19DT01QSUxFKWFzCitMRAk9ICQoQ1JPU1NfQ09NUElMRSlsZAorQ0MJPSAkKENST1NTX0NPTVBJTEUpZ2NjCitDUFAJPSAkKENDKSAtRQorQVIJPSAkKENST1NTX0NPTVBJTEUpYXIKK05NCT0gJChDUk9TU19DT01QSUxFKW5tCitTVFJJUAk9ICQoQ1JPU1NfQ09NUElMRSlzdHJpcAorT0JKQ09QWSA9ICQoQ1JPU1NfQ09NUElMRSlvYmpjb3B5CitPQkpEVU1QID0gJChDUk9TU19DT01QSUxFKW9iamR1bXAKK1JBTkxJQgk9ICQoQ1JPU1NfQ09NUElMRSlSQU5MSUIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIExvYWQgZ2VuZXJhdGVkIGJvYXJkIGNvbmZpZ3VyYXRpb24KK3NpbmNsdWRlICQoT0JKVFJFRSkvaW5jbHVkZS9hdXRvY29uZi5taworCisjIFNvbWUgYXJjaGl0ZWN0dXJlIGNvbmZpZy5tayBmaWxlcyBuZWVkIHRvIGtub3cgd2hhdCBDUFVESVIgaXMgc2V0IHRvLAorIyBzbyBjYWxjdWxhdGUgQ1BVRElSIGJlZm9yZSBpbmNsdWRpbmcgQVJDSC9TT0MvQ1BVIGNvbmZpZy5tayBmaWxlcy4KKyMgQ2hlY2sgaWYgYXJjaC8kQVJDSC9jcHUvJENQVSBleGlzdHMsIG90aGVyd2lzZSBhc3N1bWUgYXJjaC8kQVJDSC9jcHUgY29udGFpbnMKKyMgQ1BVLXNwZWNpZmljIGNvZGUuCitDUFVESVI9Y3B1LyQoQ1BVKQoraWZuZXEgKCQoU1JDVFJFRSkvJChDUFVESVIpLCQod2lsZGNhcmQgJChTUkNUUkVFKS8kKENQVURJUikpKQorQ1BVRElSPWNwdQorZW5kaWYKKworc2luY2x1ZGUgJChUT1BESVIpLyQoQVJDSClfY29uZmlnLm1rCQkjIGluY2x1ZGUgYXJjaGl0ZWN0dXJlIGRlcGVuZGVuZCBydWxlcworc2luY2x1ZGUgJChUT1BESVIpLyQoQ1BVRElSKS9jb25maWcubWsJCSMgaW5jbHVkZSAgQ1BVCXNwZWNpZmljIHJ1bGVzCisKK2lmZGVmCVNPQworc2luY2x1ZGUgJChUT1BESVIpLyQoQ1BVRElSKS8kKFNPQykvY29uZmlnLm1rCSMgaW5jbHVkZSAgU29DCXNwZWNpZmljIHJ1bGVzCitlbmRpZgoraWZkZWYJVkVORE9SCitCT0FSRERJUiA9ICQoVkVORE9SKS8kKEJPQVJEKQorZWxzZQorQk9BUkRESVIgPSAkKEJPQVJEKQorZW5kaWYKK2lmZGVmCUJPQVJECitzaW5jbHVkZSAkKFRPUERJUikvYm9hcmQvJChCT0FSRERJUikvY29uZmlnLm1rCSMgaW5jbHVkZSBib2FyZCBzcGVjaWZpYyBydWxlcworZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZm5lcSAoLCQoZmluZHN0cmluZyBzLCQoTUFLRUZMQUdTKSkpCitBUkZMQUdTID0gY3IKK2Vsc2UKK0FSRkxBR1MgPSBjcnYKK2VuZGlmCitSRUxGTEFHUz0gJChQTEFURk9STV9SRUxGTEFHUykKK0RCR0ZMQUdTPSAtZyAjIC1EREVCVUcKK09QVEZMQUdTPSAtT3MgIy1mb21pdC1mcmFtZS1wb2ludGVyCitpZm5kZWYgTERTQ1JJUFQKKyNMRFNDUklQVCA6PSAkKFRPUERJUikvYm9hcmQvJChCT0FSRERJUikveC1sb2FkLmxkcy5kZWJ1ZworTERTQ1JJUFQgOj0gJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpL3gtbG9hZC5sZHMKK2VuZGlmCitPQkpDRkxBR1MgKz0gLS1nYXAtZmlsbD0weGZmCisKK2djY2luY2RpciA6PSAkKHNoZWxsICQoQ0MpIC1wcmludC1maWxlLW5hbWU9aW5jbHVkZSkKKworQ1BQRkxBR1MgOj0gJChEQkdGTEFHUykgJChPUFRGTEFHUykgJChSRUxGTEFHUykJCVwKKwktRF9fS0VSTkVMX18KK2lmbmVxICgkKFRFWFRfQkFTRSksKQorQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpCitlbmRpZgorCitpZm5lcSAoJChTVEFDS19CQVNFKSwpCitDUFBGTEFHUyArPSAtRFNUQUNLX0JBU0U9JChTVEFDS19CQVNFKQorZW5kaWYKKworaWZuZXEgKCQoUkVTRVRfVkVDVE9SX0FERFJFU1MpLCkKK0NQUEZMQUdTICs9IC1EUkVTRVRfVkVDVE9SX0FERFJFU1M9JChSRVNFVF9WRUNUT1JfQUREUkVTUykKK2VuZGlmCisKK2lmbmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCitDUFBGTEFHUyArPSAtSSQoT0JKVFJFRSkvaW5jbHVkZTIgLUkkKE9CSlRSRUUpL2luY2x1ZGUKK2VuZGlmCisKK0NQUEZMQUdTICs9IC1JJChUT1BESVIpL2luY2x1ZGUKK0NQUEZMQUdTICs9IC1mbm8tYnVpbHRpbiAtZmZyZWVzdGFuZGluZyAtbm9zdGRpbmMJXAorCS1pc3lzdGVtICQoZ2NjaW5jZGlyKSAtcGlwZSAkKFBMQVRGT1JNX0NQUEZMQUdTKQorCitpZmRlZiBCVUlMRF9UQUcKK0NGTEFHUyA6PSAkKENQUEZMQUdTKSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIFwKKwktREJVSUxEX1RBRz0nIiQoQlVJTERfVEFHKSInCitlbHNlCitDRkxBR1MgOj0gJChDUFBGTEFHUykgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcworZW5kaWYKKworQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZuby1zdGFjay1wcm90ZWN0b3IpCisKKyMgJChDUFBGTEFHUykgc2V0cyAtZywgd2hpY2ggY2F1c2VzIGdjYyB0byBwYXNzIGEgc3VpdGFibGUgLWc8Zm9ybWF0PgorIyBvcHRpb24gdG8gdGhlIGFzc2VtYmxlci4KK0FGTEFHU19ERUJVRyA6PQorCitBRkxBR1NfREVCVUcgOj0gLVdhLC1nc3RhYnMKK0FGTEFHUyA6PSAkKEFGTEFHU19ERUJVRykgLURfX0FTU0VNQkxZX18gJChDUFBGTEFHUykKKworTERGTEFHUyArPSAtQnN0YXRpYyAtVCAkKG9iail4LWxvYWQubGRzICQoUExBVEZPUk1fTERGTEFHUykKK2lmbmVxICgkKFRFWFRfQkFTRSksKQorTERGTEFHUyArPSAtVHRleHQgJChURVhUX0JBU0UpCitlbmRpZgorCisjIExvY2F0aW9uIG9mIGEgdXNhYmxlIEJGRCBsaWJyYXJ5LCB3aGVyZSB3ZSBkZWZpbmUgInVzYWJsZSIgYXMKKyMgImJ1aWx0IGZvciAke0hPU1R9LCBzdXBwb3J0cyAke1RBUkdFVH0iLiAgU2Vuc2libGUgdmFsdWVzIGFyZQorIyAtIFdoZW4gY3Jvc3MtY29tcGlsaW5nOiB0aGUgcm9vdCBvZiB0aGUgY3Jvc3MtZW52aXJvbm1lbnQKKyMgLSBMaW51eC9wcGMgKG5hdGl2ZSk6IC91c3IKKyMgLSBOZXRCU0QvcHBjIChuYXRpdmUpOiB5b3UgbG9zZSAuLi4gKG11c3QgZXh0cmFjdCB0aGVzZSBmcm9tIHRoZQorIyAgIGJpbnV0aWxzIGJ1aWxkIGRpcmVjdG9yeSwgcGx1cyB0aGUgbmF0aXZlIGFuZCBVLUJvb3QgaW5jbHVkZQorIyAgIGZpbGVzIGRvbid0IGxpa2UgZWFjaCBvdGhlcikKKyMKKyMgU28gZmFyLCB0aGlzIGlzIHVzZWQgb25seSBieSB0b29scy9nZGIvTWFrZWZpbGUuCisKK2lmZXEgKCQoSE9TVE9TKSxkYXJ3aW4pCitCRkRfUk9PVF9ESVIgPQkJL3Vzci9sb2NhbC90b29scworZWxzZQoraWZlcSAoJChIT1NUQVJDSCksJChBUkNIKSkKKyMgbmF0aXZlCitCRkRfUk9PVF9ESVIgPQkJL3VzcgorZWxzZQorI0JGRF9ST09UX0RJUiA9CQkvTGludXhQUEMvQ0RLCQkjIExpbnV4L2kzODYKKyNCRkRfUk9PVF9ESVIgPQkJL3Vzci9wa2cvY3Jvc3MJCSMgTmV0QlNEL2kzODYKK0JGRF9ST09UX0RJUiA9CQkvb3B0L3Bvd2VycGMKK2VuZGlmCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2V4cG9ydAlIT1NUQ0MgSE9TVENGTEFHUyBIT1NUTERGTEFHUyBQRURDRkxBR1MgSE9TVFNUUklQIENST1NTX0NPTVBJTEUgXAorCUFTIExEIENDIENQUCBBUiBOTSBTVFJJUCBPQkpDT1BZIE9CSkRVTVAgTUFLRQorZXhwb3J0CVRFWFRfQkFTRSBQTEFURk9STV9DUFBGTEFHUyBQTEFURk9STV9SRUxGTEFHUyBDUFBGTEFHUyBDRkxBR1MgQUZMQUdTCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBBbGxvdyBib2FyZHMgdG8gdXNlIGN1c3RvbSBvcHRpbWl6ZSBmbGFncyBvbiBhIHBlciBkaXIvZmlsZSBiYXNpcworQkNVUkRJUiA9ICQoc3Vic3QgJChTUkNUUkVFKS8sLCQoQ1VSRElSOiQob2JqKSU9JSkpCiskKG9iaiklLnM6CSUuUworCSQoQ1BQKSAkKEFGTEFHUykgJChBRkxBR1NfJChCQ1VSRElSKS8kKEBGKSkgJChBRkxBR1NfJChCQ1VSRElSKSkgXAorCQktbyAkQCAkPAorJChvYmopJS5vOgklLlMKKwkkKENDKSAgJChBRkxBR1MpICQoQUZMQUdTXyQoQkNVUkRJUikvJChARikpICQoQUZMQUdTXyQoQkNVUkRJUikpIFwKKwkJLW8gJEAgJDwgLWMKKyQob2JqKSUubzoJJS5jCisJJChDQykgICQoQ0ZMQUdTKSAkKENGTEFHU18kKEJDVVJESVIpLyQoQEYpKSAkKENGTEFHU18kKEJDVVJESVIpKSBcCisJCS1vICRAICQ8IC1jCiskKG9iaiklLmk6CSUuYworCSQoQ1BQKSAkKENGTEFHUykgJChDRkxBR1NfJChCQ1VSRElSKS8kKEBGKSkgJChDRkxBR1NfJChCQ1VSRElSKSkgXAorCQktbyAkQCAkPCAtYworJChvYmopJS5zOgklLmMKKwkkKENDKSAgJChDRkxBR1MpICQoQ0ZMQUdTXyQoQkNVUkRJUikvJChARikpICQoQ0ZMQUdTXyQoQkNVUkRJUikpIFwKKwkJLW8gJEAgJDwgLWMgLVMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTExMzYvTWFrZWZpbGUgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmEzNGFjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTExMzYvTWFrZWZpbGUKQEAgLTAsMCArMSw0MyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMworIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChDUFUpLmEKKworU1RBUlQJPSBzdGFydC5vCitPQkpTCT0gY3B1Lm8KKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9hcm0xMTM2L2NvbmZpZy5tayBiL3gtbG9hZGVyL2NwdS9hcm0xMTM2L2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTA2ODI0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTExMzYvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZm5vLWNvbW1vbiAtZmZpeGVkLXI4CisKK1BMQVRGT1JNX0NQUEZMQUdTICs9IC1tYXJjaD1hcm12NQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFN1cHBseSBvcHRpb25zIGFjY29yZGluZyB0byBjb21waWxlciB2ZXJzaW9uCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1BMQVRGT1JNX0NQUEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbWFwY3MtMzIsLW1hYmk9YXBjcy1nbnUpCitQTEFURk9STV9DUFBGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1uby10aHVtYi1pbnRlcndvcmssKQorUExBVEZPUk1fUkVMRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tc2hvcnQtbG9hZC1ieXRlcywkKGNhbGwgY2Mtb3B0aW9uLC1tYWxpZ25tZW50LXRyYXBzLCkpCisjCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtMTEzNi9jcHUuYyBiL3gtbG9hZGVyL2NwdS9hcm0xMTM2L2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNjhmYjkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9jcHUuYwpAQCAtMCwwICsxLDY1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3R1cm1lbnRzCisgKgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiB1ZGVsYXkoKSBpcyBDUFUgc3BlY2lmaWMgY29kZQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworLyogU2VlIGFsc28gQVJNIFJlZi4gTWFuLiAqLworI2RlZmluZSBDMV9NTVUJCSgxPDwwKQkJLyogbW11IG9mZi9vbiAqLworI2RlZmluZSBDMV9BTElHTgkoMTw8MSkJCS8qIGFsaWdubWVudCBmYXVsdHMgb2ZmL29uICovCisjZGVmaW5lIEMxX0RDCQkoMTw8MikJCS8qIGRjYWNoZSBvZmYvb24gKi8KKyNkZWZpbmUgQzFfV0IJCSgxPDwzKQkJLyogbWVyZ2luZyB3cml0ZSBidWZmZXIgb24vb2ZmICovCisjZGVmaW5lIEMxX0JJR19FTkRJQU4JKDE8PDcpCS8qIGJpZyBlbmRpYW4gb2ZmL29uICovCisjZGVmaW5lIEMxX1NZU19QUk9UCSgxPDw4KQkJLyogc3lzdGVtIHByb3RlY3Rpb24gKi8KKyNkZWZpbmUgQzFfUk9NX1BST1QJKDE8PDkpCQkvKiBST00gcHJvdGVjdGlvbiAqLworI2RlZmluZSBDMV9JQwkJKDE8PDEyKQkJLyogaWNhY2hlIG9mZi9vbiAqLworI2RlZmluZSBDMV9ISUdIX1ZFQ1RPUlMJKDE8PDEzKQkvKiBsb2NhdGlvbiBvZiB2ZWN0b3JzOiBsb3cvaGlnaCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgUkVTRVJWRURfMQkoMHhmIDw8IDMpCS8qIG11c3QgYmUgMTExYiBmb3IgUi9XICovCisKK2ludCBjcHVfaW5pdCAodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qIHR1cm4gb2ZmIEkvRC1jYWNoZSAqLworCWFzbSAoIm1yYyBwMTUsIDAsICUwLCBjMSwgYzAsIDAiOiI9ciIgKGkpKTsKKwlpICY9IH4oQzFfREMgfCBDMV9JQyk7CisJYXNtICgibWNyIHAxNSwgMCwgJTAsIGMxLCBjMCwgMCI6IDoiciIgKGkpKTsKKworCS8qIGZsdXNoIEkvRC1jYWNoZSAqLworCWkgPSAwOworCWFzbSAoIm1jciBwMTUsIDAsICUwLCBjNywgYzcsIDAiOiA6InIiIChpKSk7ICAvLyBpbnZhbGlkYXRlIGJvdGggY2FjaGVzIGFuZCBmbHVzaCBidGIKKwlhc20gKCJtY3IgcDE1LCAwLCAlMCwgYzcsIGMxMCwgNCI6IDoiciIgKGkpKTsgLy8gbWVtIGJhcnJpZXIgdG8gc3luYyB0aGluZ3MKKworCXJldHVybiAwOworfQorCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9hcm0xMTM2L3N0YXJ0LlMgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTA4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9zdGFydC5TCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogIGFybWJvb3QgLSBTdGFydHVwIENvZGUgZm9yIE9NUDI0MjAvQVJNMTEzNiBDUFUtY29yZQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQgIFRleGFzIEluc3RydW1lbnRzCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMQlNYXJpdXMgR3L2Z2VyIDxtYWdAc3lzZ28uZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCUFsZXggWvxwa2UgPGF6dUBzeXNnby5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIJR2FyeSBKZW5uZWpvaG4gPGdqQGRlbnguZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAzCVJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMJS3NoaXRpaiA8a3NoaXRpakB0aS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA0CUppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CQorCWIJcmVzZXQKKyAJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCitfaGFuZzoKKyAJLndvcmQgZG9faGFuZworCQorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzggLyogbm93IDE2KjQ9NjQgKi8KKworLmdsb2JhbCBfZW5kX3ZlY3QKK19lbmRfdmVjdDoKKworCS5iYWxpZ25sIDE2LDB4ZGVhZGJlZWYKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN0YXJ0dXAgQ29kZSAocmVzZXQgdmVjdG9yKQorICoKKyAqIGRvIGltcG9ydGFudCBpbml0IG9ubHkgaWYgd2UgZG9uJ3Qgc3RhcnQgZnJvbSBtZW1vcnkhCisgKiBzZXR1cCBNZW1vcnkgYW5kIGJvYXJkIHNwZWNpZmljIGJpdHMgcHJpb3IgdG8gcmVsb2NhdGlvbi4KKyAqIHJlbG9jYXRlIGFybWJvb3QgdG8gcmFtCisgKiBzZXR1cCBzdGFjaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UKKworLmdsb2JsIF9hcm1ib290X3N0YXJ0CitfYXJtYm9vdF9zdGFydDoKKwkud29yZCBfc3RhcnQKKworLyoKKyAqIFRoZXNlIGFyZSBkZWZpbmVkIGluIHRoZSBib2FyZC1zcGVjaWZpYyBsaW5rZXIgc2NyaXB0LgorICovCisuZ2xvYmwgX2Jzc19zdGFydAorX2Jzc19zdGFydDoKKwkud29yZCBfX2Jzc19zdGFydAorCisuZ2xvYmwgX2Jzc19lbmQKK19ic3NfZW5kOgorCS53b3JkIF9lbmQKKworLyoKKyAqIHRoZSBhY3R1YWwgcmVzZXQgY29kZQorICovCisKK3Jlc2V0OiAKKwkvKgorCSAqIHNldCB0aGUgY3B1IHRvIFNWQzMyIG1vZGUKKwkgKi8KKwltcnMJcjAsY3BzcgorCWJpYwlyMCxyMCwjMHgxZgorCW9ycglyMCxyMCwjMHhkMworCW1zcgljcHNyLHIwCisKKwkvKiBDb3B5IHZlY3RvcnMgdG8gbWFzayBST00gaW5kaXJlY3QgYWRkciAqLyAKKwlhZHIgICAgIHIwLCBfc3RhcnQgICAgICAgICAgICAgIC8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisJYWRkICAgICByMCwgcjAsICM0CQkJCS8qIHNraXAgcmVzZXQgdmVjdG9yCQkJKi8KKwltb3YgICAgIHIyLCAjNjQgICAgICAgICAgICAgICAgIC8qIHIyIDwtIHNpemUgdG8gY29weSAgKi8KKwlhZGQgICAgIHIyLCByMCwgcjIgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovCisJbW92ICAgICByMSwgIzB4NDAwMDAwMDAgICAgICAgICAvKiBidWlsZCB2ZWN0IGFkZHIgKi8KKwltb3YgICAgIHIzLCAjMHgwMDIwMDAwMAorCWFkZCAgICAgcjEsIHIxLCByMworCW1vdiAgICAgcjMsICMweGY4MDAKKwlhZGQgICAgIHIxLCByMSwgcjMKK25leHQ6CisJbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworCXN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKwljbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisJYm5lICAgICBuZXh0ICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVudGlsIGVxdWFsICovCisKKwlibAljcHlfY2xrX2NvZGUgICAgICAgICAgICAvKiBwdXQgZHBsbCBhZGp1c3QgY29kZSBiZWhpbmQgdmVjdG9ycyAqLworIAorCS8qIHRoZSBtYXNrIFJPTSBjb2RlIHNob3VsZCBoYXZlIFBMTCBhbmQgb3RoZXJzIHN0YWJsZSAqLworCWJsICBjcHVfaW5pdF9jcml0CisKK3JlbG9jYXRlOgkJCQkvKiByZWxvY2F0ZSBVLUJvb3QgdG8gUkFNCSAgICAqLworCWFkcglyMCwgX3N0YXJ0CQkvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gKi8KKwljbXAgcjAsIHIxICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgcmVsb2MgZHVyaW5nIGRlYnVnICAgICAgICAgKi8KKwkvKiBiZXEgc3RhY2tfc2V0dXAgKi8KKworCWxkcglyMiwgX2FybWJvb3Rfc3RhcnQKKwlsZHIJcjMsIF9ic3Nfc3RhcnQKKwlzdWIJcjIsIHIzLCByMgkJLyogcjIgPC0gc2l6ZSBvZiBhcm1ib290ICAgICAgICAgICAgKi8KKwlhZGQJcjIsIHIwLCByMgkJLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICAgICAgICAgKi8KKworY29weV9sb29wOgorCWxkbWlhCXIwISwge3IzLXIxMH0JCS8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisJc3RtaWEJcjEhLCB7cjMtcjEwfQkJLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKwljbXAJcjAsIHIyCQkJLyogdW50aWwgc291cmNlIGVuZCBhZGRyZWVlIFtyMl0gICAgKi8KKwlibGUJY29weV9sb29wCisKKwkvKiBTZXQgdXAgdGhlIHN0YWNrCQkJCQkJICAgICovCitzdGFja19zZXR1cDoKKwlsZHIJcjAsIF9URVhUX0JBU0UJCS8qIHVwcGVyIDEyOCBLaUI6IHJlbG9jYXRlZCB1Ym9vdCAgICovCisJc3ViCXNwLCByMCwgIzEyOAkJLyogbGVhdmUgMzIgd29yZHMgZm9yIGFib3J0LXN0YWNrICAgICovCisKK2NsZWFyX2JzczoKKwlsZHIJcjAsIF9ic3Nfc3RhcnQJCS8qIGZpbmQgc3RhcnQgb2YgYnNzIHNlZ21lbnQgICAgICAgICovCisJbGRyCXIxLCBfYnNzX2VuZAkJLyogc3RvcCBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwltb3YgCXIyLCAjMHgwMDAwMDAwMAkJLyogY2xlYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLy9jbGJzc19sOnN0cglyMiwgW3IwXQkJLyogY2xlYXIgbG9vcC4uLiAgICAgICAgICAgICAgICAgICAgKi8KKy8vCWFkZAlyMCwgcjAsICM0CisvLwljbXAJcjAsIHIxCisvLwlibmUJY2xic3NfbAorCisJbGRyCXBjLCBfc3RhcnRfYXJtYm9vdAorCitfc3RhcnRfYXJtYm9vdDoJLndvcmQgc3RhcnRfYXJtYm9vdAorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENQVV9pbml0X2NyaXRpY2FsIHJlZ2lzdGVycworICoKKyAqIHNldHVwIGltcG9ydGFudCByZWdpc3RlcnMKKyAqIHNldHVwIG1lbW9yeSB0aW1pbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitjcHVfaW5pdF9jcml0OgorCS8qCisJICogZmx1c2ggdjQgSS9EIGNhY2hlcworCSAqLworCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM3LCAwCS8qIGZsdXNoIHYzL3Y0IGNhY2hlICovCisJbWNyCXAxNSwgMCwgcjAsIGM4LCBjNywgMAkvKiBmbHVzaCB2NCBUTEIgKi8KKworCS8qCisJICogZGlzYWJsZSBNTVUgc3R1ZmYgYW5kIGNhY2hlcworCSAqLworCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAKKwliaWMJcjAsIHIwLCAjMHgwMDAwMjMwMAlAIGNsZWFyIGJpdHMgMTMsIDk6OCAoLS1WLSAtLVJTKQorCWJpYwlyMCwgcjAsICMweDAwMDAwMDg3CUAgY2xlYXIgYml0cyA3LCAyOjAgKEItLS0gLUNBTSkKKwlvcnIJcjAsIHIwLCAjMHgwMDAwMDAwMglAIHNldCBiaXQgMiAoQSkgQWxpZ24KKyNpZm5kZWYgQ09ORklHX0lDQUNIRV9PRkYKKwlvcnIJcjAsIHIwLCAjMHgwMDAwMTAwMAlAIHNldCBiaXQgMTIgKEkpIEktQ2FjaGUKKyNlbmRpZgorCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAKKworCS8qCisgICAgICAgICAqIEp1bXAgdG8gYm9hcmQgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uLi4gVGhlIE1hc2sgUk9NIHdpbGwgaGF2ZSBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgICAgICAqIGJhc2ljIG1lbW9yeS4gIEdvIGhlcmUgdG8gYnVtcCB1cCBjbG9jayByYXRlIGFuZCBoYW5kbGUgd2FrZSB1cCBjb25kaXRpb25zLgorCSAqLworCWFkcglyMCwgX3N0YXJ0CQkvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gKi8KKwljbXAgICAgIHIwLCByMSAgICAgICAgICAgICAgICAgIC8qIHBhc3Mgb24gaW5mbyBhYm91dCBza2lwcGluZyBzb21lIGluaXQgcG9ydGlvbnMgKi8KKwltb3ZlcSAgIHIwLCMweDEgICAgICAgICAgICAgICAgIC8qIGZsYWcgdG8gc2tpcCBwcmNtIGFuZCBzZHJjIHNldHVwICovCisJbW92bmUgICByMCwjMHgwCisKKy8vbW92IHIwLCAjMSAgICAvKiB0aGlzIHNraXAgbWVtb3J5IGluaXQgKi8KKworCW1vdglpcCwgbHIgICAgICAgICAgLyogcGVyc2V2ZXJlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisJYmwJcGxhdGZvcm1zZXR1cCAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisKKwltb3YJbHIsIGlwICAgICAgICAgIC8qIHJlc3RvcmUgbGluayAqLworCW1vdglwYywgbHIgICAgICAgICAgLyogYmFjayB0byBteSBjYWxsZXIgKi8KKworCisvKgorICogZXhjZXB0aW9uIGhhbmRsZXIKKyAqLworIAkuYWxpZ24gIDUKK2RvX2hhbmc6CisJbGRyCXNwLCBfVEVYVF9CQVNFCQkvKiB1c2UgMzIgd29yZHMgYWJvcnQgc3RhY2sgKi8KKyAgIAlibAloYW5nCQkJCS8qIGhhbmcgYW5kIG5ldmVyIHJldHVybiAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL01ha2VmaWxlIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODNjM2QwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQzIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAzCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKENQVSkuYQorCitTVEFSVAk9IHN0YXJ0Lm8KK09CSlMJPSBjcHUubyAgCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKFNUQVJUKSAkKExJQikKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL2NvbmZpZy5tayBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YWRiMTAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL2NvbmZpZy5tawpAQCAtMCwwICsxLDMyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCitQTEFURk9STV9SRUxGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZyAgLWZuby1jb21tb24gLWZmaXhlZC1yOAorCitQTEFURk9STV9DUFBGTEFHUyArPSAtbWFyY2g9YXJtdjUKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTdXBwbHkgb3B0aW9ucyBhY2NvcmRpbmcgdG8gY29tcGlsZXIgdmVyc2lvbgorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitQTEFURk9STV9DUFBGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1hcGNzLTMyLC1tYWJpPWFwY3MtZ251KQorUExBVEZPUk1fUkVMRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tc2hvcnQtbG9hZC1ieXRlcywkKGNhbGwgY2Mtb3B0aW9uLC1tYWxpZ25tZW50LXRyYXBzLCkpCisjCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL2NwdS5jIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzJmYThhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9jcHUuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMgPHd3dy50aS5jb20+CisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIEFsZXggWnVlcGtlIDxhenVAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorICAKKyNkZWZpbmUgVElNRVJfTE9BRF9WQUwgMHhmZmZmZmZmZgorCisvKiBtYWNybyB0byByZWFkIHRoZSAzMiBiaXQgdGltZXIgKi8KKyNkZWZpbmUgUkVBRF9USU1FUiAoKih2b2xhdGlsZSB1bG9uZyAqKShDRkdfVElNRVJCQVNFKzgpKQorCitzdGF0aWMgdWxvbmcgdGltZXN0YW1wOworc3RhdGljIHVsb25nIGxhc3RkZWM7CisKK3N0YXRpYyB2b2lkIHJlc2V0X3RpbWVyX21hc2tlZCAodm9pZCk7CisKKy8qIG5vdGhpbmcgcmVhbGx5IHRvIGRvIHdpdGggY3B1LCBqdXN0IHN0YXJ0cyB1cCBhIGNvdW50ZXIuICovCitpbnQgY3B1X2luaXQgKHZvaWQpCit7CisgCWludDMyX3QgdmFsOworCisJLyogU3RhcnQgdGhlIGRlY3JlbWVudGVyIHRpY2tpbmcgZG93biBmcm9tIDB4ZmZmZmZmZmYgKi8KKwkqKChpbnQzMl90ICopIChDRkdfVElNRVJCQVNFICsgTE9BRF9USU0pKSA9IFRJTUVSX0xPQURfVkFMOworCXZhbCA9IE1QVVRJTV9TVCB8IE1QVVRJTV9BUiB8IE1QVVRJTV9DTE9DS19FTkFCTEUgfCAoQ0ZHX1BWVCA8PCBNUFVUSU1fUFRWX0JJVCk7CisJKigoaW50MzJfdCAqKSAoQ0ZHX1RJTUVSQkFTRSArIENOVExfVElNRVIpKSA9IHZhbDsKKworCS8qIGluaXQgdGhlIHRpbWVzdGFtcCBhbmQgbGFzdGRlYyB2YWx1ZSAqLworCXJlc2V0X3RpbWVyX21hc2tlZCgpOworIAkKKyAJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfdGltZXJfbWFza2VkICh2b2lkKQoreworCS8qIHJlc2V0IHRpbWUgKi8KKwlsYXN0ZGVjID0gUkVBRF9USU1FUjsgIC8qIGNhcHVyZSBjdXJyZW50IGRlY3JlbWVudGVyIHZhbHVlIHRpbWUgKi8KKwl0aW1lc3RhbXAgPSAwOyAgICAgICAgIC8qIHN0YXJ0ICJhZHZhbmNpbmciIHRpbWUgc3RhbXAgZnJvbSAwICovCit9CisKKyNpZmRlZiAgQ0ZHX1VERUxBWQorCitzdGF0aWMgdWxvbmcgZ2V0X3RpbWVyX21hc2tlZCAodm9pZCk7CitzdGF0aWMgdWxvbmcgZ2V0X3RpbWVyICh1bG9uZyBiYXNlKTsKKworLyogZGVsYXkgeCB1c2Vjb25kcyBBTkQgcGVyc2VydmUgYWR2YW5jZSB0aW1zdGFtcCB2YWx1ZSAqLwordm9pZCB1ZGVsYXkgKHVuc2lnbmVkIGxvbmcgdXNlYykKK3sKKwl1bG9uZyB0bW8sIHRtcDsKKworCWlmKHVzZWMgPj0gMTAwMCl7ICAgICAgICAgICAgICAgLyogaWYgImJpZyIgbnVtYmVyLCBzcHJlYWQgbm9ybWFsaXphdGlvbiB0byBzZWNvbmRzICovCisJCXRtbyA9IHVzZWMgLyAxMDAwOyAgICAgIC8qIHN0YXJ0IHRvIG5vcm1hbGl6ZSBmb3IgdXNlYyB0byB0aWNrcyBwZXIgc2VjICovCisJCXRtbyAqPSBDRkdfSFo7ICAgICAgICAgIC8qIGZpbmQgbnVtYmVyIG9mICJ0aWNrcyIgdG8gd2FpdCB0byBhY2hpZXZlIHRhcmdldCAqLworCQl0bW8gLz0gMTAwMDsgICAgICAgICAgICAvKiBmaW5pc2ggbm9ybWFsaXplLiAqLworCX1lbHNleyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxzZSBzbWFsbCBudW1iZXIsIGRvbid0IGtpbGwgaXQgcHJpb3IgdG8gSFogbXVsdGlwbHkgKi8KKwkJdG1vID0gdXNlYyAqIENGR19IWjsKKwkJdG1vIC89ICgxMDAwKjEwMDApOworCX0KKworCXRtcCA9IGdldF90aW1lciAoMCk7CQkvKiBnZXQgY3VycmVudCB0aW1lc3RhbXAgKi8KKwlpZiggKHRtbyArIHRtcCkgPCB0bXAgKSAJLyogaWYgc2V0dGluZyB0aGlzIGZvcmR3YXJkIHdpbGwgcm9sbCB0aW1lIHN0YW1wICovCisJCXJlc2V0X3RpbWVyX21hc2tlZCAoKTsJLyogcmVzZXQgImFkdmFuY2luZyIgdGltZXN0YW1wIHRvIDAsIHNldCBsYXN0ZGVjIHZhbHVlICovCisJZWxzZQorCQl0bW8gKz0gdG1wOwkJLyogZWxzZSwgc2V0IGFkdmFuY2luZyBzdGFtcCB3YWtlIHVwIHRpbWUgKi8KKworCXdoaWxlIChnZXRfdGltZXJfbWFza2VkICgpIDwgdG1vKS8qIGxvb3AgdGlsbCBldmVudCAqLworCQkvKk5PUCovOworfQorIAorc3RhdGljIHVsb25nIGdldF90aW1lcl9tYXNrZWQgKHZvaWQpCit7CisJdWxvbmcgbm93ID0gUkVBRF9USU1FUjsJCS8qIGN1cnJlbnQgdGljayB2YWx1ZSAqLworCisJaWYgKGxhc3RkZWMgPj0gbm93KSB7CQkvKiBub3JtYWwgbW9kZSAobm9uIHJvbGwpICovCisJCS8qIG5vcm1hbCBtb2RlICovCisJCXRpbWVzdGFtcCArPSBsYXN0ZGVjIC0gbm93OyAvKiBtb3ZlIHN0YW1wIGZvcmR3YXJkIHdpdGggYWJzb3VsdGUgZGlmZiB0aWNrcyAqLworCX0gZWxzZSB7CQkJLyogd2UgaGF2ZSBvdmVyZmxvdyBvZiB0aGUgY291bnQgZG93biB0aW1lciAqLworCQkvKiBudHMgPSB0cyArIGxkICsgKFRMViAtIG5vdykKKwkJICogdHM9b2xkIHN0YW1wLCBsZD10aW1lIHRoYXQgcGFzc2VkIGJlZm9yZSBwYXNzaW5nIHRocm91Z2ggLTEKKwkJICogKFRMVi1ub3cpIGFtb3VudCBvZiB0aW1lIGFmdGVyIHBhc3NpbmcgdGhvdWdoIC0xCisJCSAqIG50cyA9IG5ldyAiYWR2YW5jaW5nIHRpbWUgc3RhbXAiLi4uaXQgY291bGQgYWxzbyByb2xsIGFuZCBjYXVzZSBwcm9ibGVtcy4KKwkJICovCisJCXRpbWVzdGFtcCArPSBsYXN0ZGVjICsgVElNRVJfTE9BRF9WQUwgLSBub3c7CisJfQorCWxhc3RkZWMgPSBub3c7CisKKwlyZXR1cm4gdGltZXN0YW1wOworfQorCitzdGF0aWMgdWxvbmcgZ2V0X3RpbWVyICh1bG9uZyBiYXNlKQoreworCXJldHVybiBnZXRfdGltZXJfbWFza2VkICgpIC0gYmFzZTsKK30KKworI2VuZGlmIAkJLyogQ0ZHX1VERUxBWSAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL3N0YXJ0LlMgYi94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL3N0YXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxMWRhZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvc3RhcnQuUwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqICBhcm1ib290IC0gU3RhcnR1cCBDb2RlIGZvciBBUk05MjZFSlMgQ1BVLWNvcmUKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzICBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqICAtLS0tLSBBZGFwdGVkIGZvciBPTUFQMTYxMCBmcm9tIEFSTTkyNXQgY29kZSAtLS0tLS0KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAxCU1hcml1cyBHcvZnZXIgPG1hZ0BzeXNnby5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIJQWxleCBa/HBrZSA8YXp1QHN5c2dvLmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMglHYXJ5IEplbm5lam9obiA8Z2pAZGVueC5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMJUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICogIENvcHlyaWdodCAoYykgMjAwMwlLc2hpdGlqIDxrc2hpdGlqQHRpLmNvbT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQJSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQMTYxMCkKKyNpbmNsdWRlIDwuL2NvbmZpZ3Mvb21hcDE1MTAuaD4KKyNlbmRpZgorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBKdW1wIHZlY3RvciB0YWJsZSBhcyBpbiB0YWJsZSAzLjEgaW4gWzFdCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKy5nbG9ibCBfc3RhcnQKK19zdGFydDoKKwliCXJlc2V0CisgCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKworX2hhbmc6CisgCS53b3JkIGRvX2hhbmcKKyAgCisJLmJhbGlnbmwgMTYsMHhkZWFkYmVlZgorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN0YXJ0dXAgQ29kZSAocmVzZXQgdmVjdG9yKQorICoKKyAqIGRvIGltcG9ydGFudCBpbml0IG9ubHkgaWYgd2UgZG9uJ3Qgc3RhcnQgZnJvbSBtZW1vcnkhCisgKiBzZXR1cCBNZW1vcnkgYW5kIGJvYXJkIHNwZWNpZmljIGJpdHMgcHJpb3IgdG8gcmVsb2NhdGlvbi4KKyAqIHJlbG9jYXRlIGFybWJvb3QgdG8gcmFtCisgKiBzZXR1cCBzdGFjaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UKKworLmdsb2JsIF9hcm1ib290X3N0YXJ0CitfYXJtYm9vdF9zdGFydDoKKwkud29yZCBfc3RhcnQKKworLyoKKyAqIFRoZXNlIGFyZSBkZWZpbmVkIGluIHRoZSBib2FyZC1zcGVjaWZpYyBsaW5rZXIgc2NyaXB0LgorICovCisuZ2xvYmwgX2Jzc19zdGFydAorX2Jzc19zdGFydDoKKwkud29yZCBfX2Jzc19zdGFydAorCisuZ2xvYmwgX2Jzc19lbmQKK19ic3NfZW5kOgorCS53b3JkIF9lbmQKKworIAorLyoKKyAqIHRoZSBhY3R1YWwgcmVzZXQgY29kZQorICovCisKK3Jlc2V0OgorCS8qCisJICogc2V0IHRoZSBjcHUgdG8gU1ZDMzIgbW9kZQorCSAqLworCW1ycwlyMCxjcHNyCisJYmljCXIwLHIwLCMweDFmCisJb3JyCXIwLHIwLCMweGQzCisJbXNyCWNwc3IscjAKKyAgCisJLyoKKwkgKiB0dXJuIG9mZiB0aGUgd2F0Y2hkb2csIHVubG9jay9kaWFibGUgc2VxdWVuY2UKKwkgKi8KKwltb3YJcjEsICMweEY1CisJbGRyCXIwLCA9V0RUSU1fTU9ERQorCXN0cmgJcjEsIFtyMF0KKwltb3YJcjEsICMweEEwCisJc3RyaAlyMSwgW3IwXQorCisKKwkvKgorCSAqIG1hc2sgYWxsIElSUXMgYnkgc2V0dGluZyBhbGwgYml0cyBpbiB0aGUgSU5UTVIgLSBkZWZhdWx0CisJICovCisKKwltb3YJcjEsICMweGZmZmZmZmZmCisJbGRyCXIwLCA9UkVHX0lITDFfTUlSCisJc3RyCXIxLCBbcjBdCisJbGRyCXIwLCA9UkVHX0lITDJfTUlSCisJc3RyCXIxLCBbcjBdCisgCisJLyoKKwkgKiB3ZSBkbyBzeXMtY3JpdGljYWwgaW5pdHMgYXQgcmVib290LAorIAkgKi8KKyAJYmwJY3B1X2luaXRfY3JpdCAKKyAgCisJLyogCisJICogcmVsb2NhdGUgZXhjZXB0aW9uIHZlY3RvcnMgdG8gU1JBTSB3aGVyZSBST00gY29kZSBleHBlY3RzCisJICovCisjaWZkZWYgQ0ZHX0JPT1RfQ1MwCisKKwlhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KKyAJYWRkICAgICByMCwgcjAsICM0CS8qIHNraXAgcmVzZXQgdmVjdG9yCQkJKi8KKwltb3YJcjIsICMzNgkJLyogcjIgPC0gc2l6ZSBvZiBkYXRhICg4KzEgd29yZHMpICAgICAgICAgICAgKi8KKwlhZGQJcjIsIHIwLCByMgkJLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICAgICAgICAgKi8KKwltb3YgcjEsICMweDIwMDAwMDAwCituZXh0OgorCWxkbWlhCXIwISwge3IzLXIxMH0JCS8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisJc3RtaWEJcjEhLCB7cjMtcjEwfQkJLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKwljbXAJcjAsIHIyCQkJLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKwlibGUJbmV4dAorCisjZW5kaWYKKyAKK3JlbG9jYXRlOgkJCQkvKiByZWxvY2F0ZSBYLUxvYWRlciB0byBSQU0JICAgICovCisJYWRyCXIwLCBfc3RhcnQJCS8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisJbGRyCXIxLCBfVEVYVF9CQVNFCQkvKiB0ZXN0IGlmIHdlIHJ1biBmcm9tIGZsYXNoIG9yIFJBTSAqLworCWNtcCAgICAgcjAsIHIxICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgcmVsb2MgZHVyaW5nIGRlYnVnICAgICAgICAgKi8KKwkvKmJlcSAgICAgc3RhY2tfc2V0dXAqLworCisJbGRyCXIyLCBfYXJtYm9vdF9zdGFydAorCWxkcglyMywgX2Jzc19zdGFydAorCXN1YglyMiwgcjMsIHIyCQkvKiByMiA8LSBzaXplIG9mIGFybWJvb3QgICAgICAgICAgICAqLworCWFkZAlyMiwgcjAsIHIyCQkvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgICAgICAgICAqLworCitjb3B5X2xvb3A6CisJbGRtaWEJcjAhLCB7cjMtcjEwfQkJLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKwlzdG1pYQlyMSEsIHtyMy1yMTB9CQkvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworCWJsZQljb3B5X2xvb3AKKworCS8qIFNldCB1cCB0aGUgc3RhY2sJCQkJCQkgICAgKi8KK3N0YWNrX3NldHVwOgorCWxkcglyMCwgX1RFWFRfQkFTRQkJLyogdXBwZXIgMTI4IEtpQjogcmVsb2NhdGVkIFgtTG9hZGVyICAgKi8KKyAgCXN1YglzcCwgcjAsICMxMjgJCS8qIGxlYXZlIDMyIHdvcmRzIGZvciBhYm9ydC1zdGFjayAgICAqLworCitjbGVhcl9ic3M6CisJbGRyCXIwLCBfYnNzX3N0YXJ0CQkvKiBmaW5kIHN0YXJ0IG9mIGJzcyBzZWdtZW50ICAgICAgICAqLworCWFkZAlyMCwgcjAsICM0CQkvKiBzdGFydCBhdCBmaXJzdCBieXRlIG9mIGJzcyAgICAgICAqLworCWxkcglyMSwgX2Jzc19lbmQJCS8qIHN0b3AgaGVyZSAgICAgICAgICAgICAgICAgICAgICAgICovCisJbW92IAlyMiwgIzB4MDAwMDAwMDAJCS8qIGNsZWFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK2NsYnNzX2w6c3RyCXIyLCBbcjBdCQkvKiBjbGVhciBsb29wLi4uICAgICAgICAgICAgICAgICAgICAqLworCWFkZAlyMCwgcjAsICM0CisJY21wCXIwLCByMQorCWJuZQljbGJzc19sCisKKyAJbGRyCXBjLCBfc3RhcnRfYXJtYm9vdAorCitfc3RhcnRfYXJtYm9vdDoKKwkud29yZCAgc3RhcnRfYXJtYm9vdAorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENQVV9pbml0X2NyaXRpY2FsIHJlZ2lzdGVycworICoKKyAqIHNldHVwIGltcG9ydGFudCByZWdpc3RlcnMKKyAqIHNldHVwIG1lbW9yeSB0aW1pbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKworY3B1X2luaXRfY3JpdDoKKwkvKgorCSAqIGZsdXNoIHY0IEkvRCBjYWNoZXMKKwkgKi8KKwltb3YJcjAsICMwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNywgMAkvKiBmbHVzaCB2My92NCBjYWNoZSAqLworCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcsIDAJLyogZmx1c2ggdjQgVExCICovCisKKwkvKgorCSAqIGRpc2FibGUgTU1VIHN0dWZmIGFuZCBjYWNoZXMKKwkgKi8KKwltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCisJYmljCXIwLCByMCwgIzB4MDAwMDIzMDAJLyogY2xlYXIgYml0cyAxMywgOTo4ICgtLVYtIC0tUlMpICovCisJYmljCXIwLCByMCwgIzB4MDAwMDAwODcJLyogY2xlYXIgYml0cyA3LCAyOjAgKEItLS0gLUNBTSkgKi8KKwlvcnIJcjAsIHIwLCAjMHgwMDAwMDAwMgkvKiBzZXQgYml0IDIgKEEpIEFsaWduICovCisJb3JyCXIwLCByMCwgIzB4MDAwMDEwMDAJLyogc2V0IGJpdCAxMiAoSSkgSS1DYWNoZSAqLworCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAKKworCS8qCisJICogR28gc2V0dXAgTWVtb3J5IGFuZCBib2FyZCBzcGVjaWZpYyBiaXRzIHByaW9yIHRvIHJlbG9jYXRpb24uCisJICovCisJbW92CWlwLCBscgkJLyogcGVyc2VydmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKwlibAlwbGF0Zm9ybXNldHVwCS8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisJbW92CWxyLCBpcAkJLyogcmVzdG9yZSBsaW5rICovCisJbW92CXBjLCBscgkJLyogYmFjayB0byBteSBjYWxsZXIgKi8KKyAgCisvKgorICogZXhjZXB0aW9uIGhhbmRsZXIKKyAqLworIAkuYWxpZ24gIDUKK2RvX2hhbmc6CisJbGRyCXNwLCBfVEVYVF9CQVNFCQkvKiB1c2UgMzIgd29yZHMgYWJvcnQgc3RhY2sgKi8KKyAgIAlibAloYW5nCQkJCS8qIGhhbmcgYW5kIG5ldmVyIHJldHVybiAqLworCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9vbWFwMy9NYWtlZmlsZSBiL3gtbG9hZGVyL2NwdS9vbWFwMy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTFlNzY5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L29tYXAzL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDMKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCisKK1NUQVJUCTo9IHN0YXJ0Lm8KK0NPQkpTCTo9IGNwdS5vIG1tYy5vCisKK1NSQ1MJOj0gJChTVEFSVDoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU1RBUlQJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU1RBUlQpKQorCithbGw6CSQob2JqKS5kZXBlbmQgJChTVEFSVCkgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL2NvbmZpZy5tayBiL3gtbG9hZGVyL2NwdS9vbWFwMy9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiZTMyOAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9jb25maWcubWsKQEAgLTAsMCArMSwzMyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDIKKyMgR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1mbm8tY29tbW9uIC1mZml4ZWQtcjgKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLW1hcmNoPWFybXY3LWEKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTdXBwbHkgb3B0aW9ucyBhY2NvcmRpbmcgdG8gY29tcGlsZXIgdmVyc2lvbgorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitQTEFURk9STV9DUFBGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1hcGNzLTMyLC1tYWJpPWFwY3MtZ251KQorUExBVEZPUk1fQ1BQRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tbm8tdGh1bWItaW50ZXJ3b3JrLCkKK1BMQVRGT1JNX1JFTEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbXNob3J0LWxvYWQtYnl0ZXMsJChjYWxsIGNjLW9wdGlvbiwtbWFsaWdubWVudC10cmFwcywpKQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL2NwdS5jIGIveC1sb2FkZXIvY3B1L29tYXAzL2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjQyMmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvb21hcDMvY3B1LmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2IFRleGFzIEluc3R1cm1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQ1BVIHNwZWNpZmljIGNvZGUKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisvKiBTZWUgYWxzbyBBUk0gUmVmLiBNYW4uICovCisjZGVmaW5lIEMxX01NVQkJKDE8PDApCQkvKiBtbXUgb2ZmL29uICovCisjZGVmaW5lIEMxX0FMSUdOCSgxPDwxKQkJLyogYWxpZ25tZW50IGZhdWx0cyBvZmYvb24gKi8KKyNkZWZpbmUgQzFfREMJCSgxPDwyKQkJLyogZGNhY2hlIG9mZi9vbiAqLworI2RlZmluZSBDMV9XQgkJKDE8PDMpCQkvKiBtZXJnaW5nIHdyaXRlIGJ1ZmZlciBvbi9vZmYgKi8KKyNkZWZpbmUgQzFfQklHX0VORElBTgkoMTw8NykJLyogYmlnIGVuZGlhbiBvZmYvb24gKi8KKyNkZWZpbmUgQzFfU1lTX1BST1QJKDE8PDgpCQkvKiBzeXN0ZW0gcHJvdGVjdGlvbiAqLworI2RlZmluZSBDMV9ST01fUFJPVAkoMTw8OSkJCS8qIFJPTSBwcm90ZWN0aW9uICovCisjZGVmaW5lIEMxX0lDCQkoMTw8MTIpCQkvKiBpY2FjaGUgb2ZmL29uICovCisjZGVmaW5lIEMxX0hJR0hfVkVDVE9SUwkoMTw8MTMpCS8qIGxvY2F0aW9uIG9mIHZlY3RvcnM6IGxvdy9oaWdoIGFkZHJlc3NlcyAqLworI2RlZmluZSBSRVNFUlZFRF8xCSgweGYgPDwgMykJLyogbXVzdCBiZSAxMTFiIGZvciBSL1cgKi8KKworaW50IGNwdV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvb21hcDMvbW1jLmMgYi94LWxvYWRlci9jcHUvb21hcDMvbW1jLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzY1ZGY0OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9tbWMuYwpAQCAtMCwwICsxLDU2MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogU3llZCBNb2hhbW1lZCBLaGFzaW0gPGtoYXNpbUB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ3MgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bW1jLmg+CisjaW5jbHVkZSA8cGFydC5oPgorCisjaWZkZWYgQ0ZHX0NNRF9NTUMKKworI2luY2x1ZGUgIm1tY19ob3N0X2RlZi5oIgorI2luY2x1ZGUgIm1tY19wcm90b2NvbC5oIgorCisjZGVmaW5lIE9NQVBfTU1DX01BU1RFUl9DTE9DSyAgIDk2MDAwMDAwCitleHRlcm4gaW50IGZhdF9yZWdpc3Rlcl9kZXZpY2UoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0X25vKTsKKworbW1jX2NhcmRfZGF0YSBjdXJfY2FyZF9kYXRhOworc3RhdGljIGJsb2NrX2Rldl9kZXNjX3QgbW1jX2Jsa19kZXY7CisKK2Jsb2NrX2Rldl9kZXNjX3QgKm1tY19nZXRfZGV2KGludCBkZXYpCit7CisJcmV0dXJuICgoYmxvY2tfZGV2X2Rlc2NfdCAqKSAmbW1jX2Jsa19kZXYpOworfQorCit1bnNpZ25lZCBjaGFyIG1tY19ib2FyZF9pbml0KHZvaWQpCit7CisjaWYgZGVmaW5lZCAoQ09ORklHX09NQVAzNFhYKSAmJiAhZGVmaW5lZCAoQ09ORklHX0FNMzUxN0VWTSkKKwl1bnNpZ25lZCBpbnQgdmFsdWUgPSAwOworCisJdmFsdWUgPSBDT05UUk9MX1BCSUFTX0xJVEU7CisJQ09OVFJPTF9QQklBU19MSVRFID0gdmFsdWUgfCAoMSA8PCAyKSB8ICgxIDw8IDEpIHwgKDEgPDwgOSk7CisKKwl2YWx1ZSA9IENPTlRST0xfREVWX0NPTkYwOworCUNPTlRST0xfREVWX0NPTkYwID0gdmFsdWUgfCAoMSA8PCAyNCk7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKwordm9pZCBtbWNfaW5pdF9zdHJlYW0odm9pZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbW1jX3N0YXQ7CisKKwlPTUFQX0hTTU1DX0NPTiB8PSBJTklUX0lOSVRTVFJFQU07CisKKwlPTUFQX0hTTU1DX0NNRCA9IE1NQ19DTUQwOworCWRvIHsKKwkJbW1jX3N0YXQgPSBPTUFQX0hTTU1DX1NUQVQ7CisJfSB3aGlsZSAoIShtbWNfc3RhdCAmIENDX01BU0spKTsKKworCU9NQVBfSFNNTUNfU1RBVCA9IENDX01BU0s7CisKKwlPTUFQX0hTTU1DX0NNRCA9IE1NQ19DTUQwOworCWRvIHsKKwkJbW1jX3N0YXQgPSBPTUFQX0hTTU1DX1NUQVQ7CisJfSB3aGlsZSAoIShtbWNfc3RhdCAmIENDX01BU0spKTsKKworCU9NQVBfSFNNTUNfU1RBVCA9IE9NQVBfSFNNTUNfU1RBVDsKKwlPTUFQX0hTTU1DX0NPTiAmPSB+SU5JVF9JTklUU1RSRUFNOworfQorCit1bnNpZ25lZCBjaGFyIG1tY19jbG9ja19jb25maWcodW5zaWduZWQgaW50IGljbGssIHVuc2lnbmVkIHNob3J0IGNsa19kaXYpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCW1tY19yZWdfb3V0KE9NQVBfSFNNTUNfU1lTQ1RMLCAoSUNFX01BU0sgfCBEVE9fTUFTSyB8IENFTl9NQVNLKSwKKwkJICAgIChJQ0VfU1RPUCB8IERUT18xNVRIRFRPIHwgQ0VOX0RJU0FCTEUpKTsKKworCXN3aXRjaCAoaWNsaykgeworCWNhc2UgQ0xLX0lOSVRTRVE6CisJCXZhbCA9IE1NQ19JTklUX1NFUV9DTEsgLyAyOworCQlicmVhazsKKwljYXNlIENMS180MDBLSFo6CisJCXZhbCA9IE1NQ180MDBrSHpfQ0xLOworCQlicmVhazsKKwljYXNlIENMS19NSVNDOgorCQl2YWwgPSBjbGtfZGl2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJbW1jX3JlZ19vdXQoT01BUF9IU01NQ19TWVNDVEwsCisJCSAgICBJQ0VfTUFTSyB8IENMS0RfTUFTSywgKHZhbCA8PCBDTEtEX09GRlNFVCkgfCBJQ0VfT1NDSUxMQVRFKTsKKworCXdoaWxlICgoT01BUF9IU01NQ19TWVNDVEwgJiBJQ1NfTUFTSykgPT0gSUNTX05PVFJFQURZKTsKKworCisJT01BUF9IU01NQ19TWVNDVEwgfD0gQ0VOX0VOQUJMRTsKKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgY2hhciBtbWNfaW5pdF9zZXR1cCh2b2lkKQoreworCXVuc2lnbmVkIGludCByZWdfdmFsOworCisJbW1jX2JvYXJkX2luaXQoKTsKKworCU9NQVBfSFNNTUNfU1lTQ09ORklHIHw9IE1NQ19TT0ZUUkVTRVQ7CisJd2hpbGUgKChPTUFQX0hTTU1DX1NZU1NUQVRVUyAmIFJFU0VURE9ORSkgPT0gMCkgOworCisJT01BUF9IU01NQ19TWVNDVEwgfD0gU09GVFJFU0VUQUxMOworCXdoaWxlICgoT01BUF9IU01NQ19TWVNDVEwgJiBTT0ZUUkVTRVRBTEwpICE9IDB4MCkgOworCisJT01BUF9IU01NQ19IQ1RMID0gRFRXXzFfQklUTU9ERSB8IFNEQlBfUFdST0ZGIHwgU0RWU18zVjA7CisJT01BUF9IU01NQ19DQVBBIHw9IFZTMzBfM1YwU1VQIHwgVlMxOF8xVjhTVVA7CisKKwlyZWdfdmFsID0gT01BUF9IU01NQ19DT04gJiBSRVNFUlZFRF9NQVNLOworCisJT01BUF9IU01NQ19DT04gPSBDVFBMX01NQ19TRCB8IHJlZ192YWwgfCBXUFBfQUNUSVZFSElHSCB8CisJICAgIENEUF9BQ1RJVkVISUdIIHwgTUlUX0NUTyB8IERXOF8xXzRCSVRNT0RFIHwgTU9ERV9GVU5DIHwKKwkgICAgU1RSX0JMT0NLIHwgSFJfTk9IT1NUUkVTUCB8IElOSVRfTk9JTklUIHwgTk9PUEVORFJBSU47CisKKwltbWNfY2xvY2tfY29uZmlnKENMS19JTklUU0VRLCAwKTsKKwlPTUFQX0hTTU1DX0hDVEwgfD0gU0RCUF9QV1JPTjsKKworCU9NQVBfSFNNTUNfSUUgPSAweDMwN2YwMDMzOworCisJbW1jX2luaXRfc3RyZWFtKCk7CisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGNoYXIgbW1jX3NlbmRfY21kKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGludCBhcmcsCisJCQkgICB1bnNpZ25lZCBpbnQgKnJlc3BvbnNlKQoreworCXVuc2lnbmVkIGludCBtbWNfc3RhdDsKKworCXdoaWxlICgoT01BUF9IU01NQ19QU1RBVEUgJiBEQVRJX01BU0spID09IERBVElfQ01ERElTKTsKKworCisJT01BUF9IU01NQ19CTEsgPSBCTEVOXzUxMkJZVEVTTEVOIHwgTkJMS19TVFBDTlQ7CisJT01BUF9IU01NQ19TVEFUID0gMHhGRkZGRkZGRjsKKwlPTUFQX0hTTU1DX0FSRyA9IGFyZzsKKwlPTUFQX0hTTU1DX0NNRCA9IGNtZCB8IENNRF9UWVBFX05PUk1BTCB8IENJQ0VfTk9DSEVDSyB8CisJICAgIENDQ0VfTk9DSEVDSyB8IE1TQlNfU0dMRUJMSyB8IEFDRU5fRElTQUJMRSB8IEJDRV9ESVNBQkxFIHwKKwkgICAgREVfRElTQUJMRTsKKworCXdoaWxlICgxKSB7CisJCWRvIHsKKwkJCW1tY19zdGF0ID0gT01BUF9IU01NQ19TVEFUOworCQl9IHdoaWxlIChtbWNfc3RhdCA9PSAwKTsKKworCQlpZiAoKG1tY19zdGF0ICYgRVJSSV9NQVNLKSAhPSAwKQorCQkJcmV0dXJuICh1bnNpZ25lZCBjaGFyKW1tY19zdGF0OworCisKKwkJaWYgKG1tY19zdGF0ICYgQ0NfTUFTSykgeworCQkJT01BUF9IU01NQ19TVEFUID0gQ0NfTUFTSzsKKwkJCXJlc3BvbnNlWzBdID0gT01BUF9IU01NQ19SU1AxMDsKKwkJCWlmICgoY21kICYgUlNQX1RZUEVfTUFTSykgPT0gUlNQX1RZUEVfTEdIVDEzNikgeworCQkJCXJlc3BvbnNlWzFdID0gT01BUF9IU01NQ19SU1AzMjsKKwkJCQlyZXNwb25zZVsyXSA9IE9NQVBfSFNNTUNfUlNQNTQ7CisJCQkJcmVzcG9uc2VbM10gPSBPTUFQX0hTTU1DX1JTUDc2OworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGNoYXIgbW1jX3JlYWRfZGF0YSh1bnNpZ25lZCBpbnQgKm91dHB1dF9idWYpCit7CisJdW5zaWduZWQgaW50IG1tY19zdGF0OworCXVuc2lnbmVkIGludCByZWFkX2NvdW50ID0gMDsKKworCS8qCisJICogU3RhcnQgUG9sbGVkIFJlYWQKKwkgKi8KKwl3aGlsZSAoMSkgeworCQlkbyB7CisJCQltbWNfc3RhdCA9IE9NQVBfSFNNTUNfU1RBVDsKKwkJfSB3aGlsZSAobW1jX3N0YXQgPT0gMCk7CisKKwkJaWYgKChtbWNfc3RhdCAmIEVSUklfTUFTSykgIT0gMCkKKwkJCXJldHVybiAodW5zaWduZWQgY2hhciltbWNfc3RhdDsKKworCQlpZiAobW1jX3N0YXQgJiBCUlJfTUFTSykgeworCQkJdW5zaWduZWQgaW50IGs7CisKKwkJCU9NQVBfSFNNTUNfU1RBVCB8PSBCUlJfTUFTSzsKKwkJCWZvciAoayA9IDA7IGsgPCBNTUNTRF9TRUNUT1JfU0laRSAvIDQ7IGsrKykgeworCQkJCSpvdXRwdXRfYnVmID0gT01BUF9IU01NQ19EQVRBOworCQkJCW91dHB1dF9idWYrKzsKKwkJCQlyZWFkX2NvdW50ICs9IDQ7CisJCQl9CisJCX0KKworCQlpZiAobW1jX3N0YXQgJiBCV1JfTUFTSykKKwkJCU9NQVBfSFNNTUNfU1RBVCB8PSBCV1JfTUFTSzsKKworCQlpZiAobW1jX3N0YXQgJiBUQ19NQVNLKSB7CisJCQlPTUFQX0hTTU1DX1NUQVQgfD0gVENfTUFTSzsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAxOworfQorCit1bnNpZ25lZCBjaGFyIG1tY19kZXRlY3RfY2FyZChtbWNfY2FyZF9kYXRhICptbWNfY2FyZF9jdXIpCit7CisJdW5zaWduZWQgY2hhciBlcnI7CisJdW5zaWduZWQgaW50IGFyZ3VtZW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgb2NyX3ZhbHVlLCBvY3JfcmVjdmQsIHJldF9jbWQ0MSwgaGNzX3ZhbDsKKwl1bnNpZ25lZCBpbnQgcmVzcFs0XTsKKwl1bnNpZ25lZCBzaG9ydCByZXRyeV9jbnQgPSAyMDAwOworCisJLyogU2V0IHRvIEluaXRpYWxpemF0aW9uIENsb2NrICovCisJZXJyID0gbW1jX2Nsb2NrX2NvbmZpZyhDTEtfNDAwS0haLCAwKTsKKwlpZiAoZXJyICE9IDEpCisJCXJldHVybiBlcnI7CisKKwltbWNfY2FyZF9jdXItPlJDQSA9IE1NQ19SRUxBVElWRV9DQVJEX0FERFJFU1M7CisJYXJndW1lbnQgPSAweDAwMDAwMDAwOworCisJb2NyX3ZhbHVlID0gKDB4MUZGIDw8IDE1KTsKKwllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDAsIGFyZ3VtZW50LCByZXNwKTsKKwlpZiAoZXJyICE9IDEpCisJCXJldHVybiBlcnI7CisKKwlhcmd1bWVudCA9IFNEX0NNRDhfQ0hFQ0tfUEFUVEVSTiB8IFNEX0NNRDhfMl83XzNfNl9WX1JBTkdFOworCWVyciA9IG1tY19zZW5kX2NtZChNTUNfU0RDTUQ4LCBhcmd1bWVudCwgcmVzcCk7CisJaGNzX3ZhbCA9IChlcnIgPT0gMSkgPworCSAgICBNTUNfT0NSX1JFR19IT1NUX0NBUEFDSVRZX1NVUFBPUlRfU0VDVE9SIDoKKwkgICAgTU1DX09DUl9SRUdfSE9TVF9DQVBBQ0lUWV9TVVBQT1JUX0JZVEU7CisKKwlhcmd1bWVudCA9IDB4MDAwMCA8PCAxNjsKKwllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDU1LCBhcmd1bWVudCwgcmVzcCk7CisJaWYgKGVyciA9PSAxKSB7CisJCW1tY19jYXJkX2N1ci0+Y2FyZF90eXBlID0gU0RfQ0FSRDsKKwkJb2NyX3ZhbHVlIHw9IGhjc192YWw7CisJCXJldF9jbWQ0MSA9IE1NQ19BQ01ENDE7CisJfSBlbHNlIHsKKwkJbW1jX2NhcmRfY3VyLT5jYXJkX3R5cGUgPSBNTUNfQ0FSRDsKKwkJb2NyX3ZhbHVlIHw9IE1NQ19PQ1JfUkVHX0FDQ0VTU19NT0RFX1NFQ1RPUjsKKwkJcmV0X2NtZDQxID0gTU1DX0NNRDE7CisJCU9NQVBfSFNNTUNfQ09OICY9IH5PRDsKKwkJT01BUF9IU01NQ19DT04gfD0gT1BFTkRSQUlOOworCX0KKworCWFyZ3VtZW50ID0gb2NyX3ZhbHVlOworCWVyciA9IG1tY19zZW5kX2NtZChyZXRfY21kNDEsIGFyZ3VtZW50LCByZXNwKTsKKwlpZiAoZXJyICE9IDEpCisJCXJldHVybiBlcnI7CisKKwlvY3JfcmVjdmQgPSAoKG1tY19yZXNwX3IzICopIHJlc3ApLT5vY3I7CisKKwl3aGlsZSAoIShvY3JfcmVjdmQgJiAoMHgxIDw8IDMxKSkgJiYgKHJldHJ5X2NudCA+IDApKSB7CisJCXJldHJ5X2NudC0tOworCQlpZiAobW1jX2NhcmRfY3VyLT5jYXJkX3R5cGUgPT0gU0RfQ0FSRCkgeworCQkJYXJndW1lbnQgPSAweDAwMDAgPDwgMTY7CisJCQllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDU1LCBhcmd1bWVudCwgcmVzcCk7CisJCX0KKworCQlhcmd1bWVudCA9IG9jcl92YWx1ZTsKKwkJZXJyID0gbW1jX3NlbmRfY21kKHJldF9jbWQ0MSwgYXJndW1lbnQsIHJlc3ApOworCQlpZiAoZXJyICE9IDEpCisJCQlyZXR1cm4gZXJyOworCQlvY3JfcmVjdmQgPSAoKG1tY19yZXNwX3IzICopIHJlc3ApLT5vY3I7CisJfQorCisJaWYgKCEob2NyX3JlY3ZkICYgKDB4MSA8PCAzMSkpKQorCQlyZXR1cm4gMDsKKworCWlmIChtbWNfY2FyZF9jdXItPmNhcmRfdHlwZSA9PSBNTUNfQ0FSRCkgeworCQlpZiAoKG9jcl9yZWN2ZCAmIE1NQ19PQ1JfUkVHX0FDQ0VTU19NT0RFX01BU0spID09CisJCSAgICBNTUNfT0NSX1JFR19BQ0NFU1NfTU9ERV9TRUNUT1IpIHsKKwkJCW1tY19jYXJkX2N1ci0+bW9kZSA9IFNFQ1RPUl9NT0RFOworCQl9IGVsc2UgeworCQkJbW1jX2NhcmRfY3VyLT5tb2RlID0gQllURV9NT0RFOworCQl9CisKKwkJb2NyX3JlY3ZkICY9IH5NTUNfT0NSX1JFR19BQ0NFU1NfTU9ERV9NQVNLOworCX0gZWxzZSB7CisJCWlmICgob2NyX3JlY3ZkICYgTU1DX09DUl9SRUdfSE9TVF9DQVBBQ0lUWV9TVVBQT1JUX01BU0spCisJCSAgICA9PSBNTUNfT0NSX1JFR19IT1NUX0NBUEFDSVRZX1NVUFBPUlRfU0VDVE9SKSB7CisJCQltbWNfY2FyZF9jdXItPm1vZGUgPSBTRUNUT1JfTU9ERTsKKwkJfSBlbHNlIHsKKwkJCW1tY19jYXJkX2N1ci0+bW9kZSA9IEJZVEVfTU9ERTsKKwkJfQorCQlvY3JfcmVjdmQgJj0gfk1NQ19PQ1JfUkVHX0hPU1RfQ0FQQUNJVFlfU1VQUE9SVF9NQVNLOworCX0KKworCW9jcl9yZWN2ZCAmPSB+KDB4MSA8PCAzMSk7CisJaWYgKCEob2NyX3JlY3ZkICYgb2NyX3ZhbHVlKSkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDIsIGFyZ3VtZW50LCByZXNwKTsKKwlpZiAoZXJyICE9IDEpCisJCXJldHVybiBlcnI7CisKKwlpZiAobW1jX2NhcmRfY3VyLT5jYXJkX3R5cGUgPT0gTU1DX0NBUkQpIHsKKwkJYXJndW1lbnQgPSBtbWNfY2FyZF9jdXItPlJDQSA8PCAxNjsKKwkJZXJyID0gbW1jX3NlbmRfY21kKE1NQ19DTUQzLCBhcmd1bWVudCwgcmVzcCk7CisJCWlmIChlcnIgIT0gMSkKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIHsKKwkJYXJndW1lbnQgPSAweDAwMDAwMDAwOworCQllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX1NEQ01EMywgYXJndW1lbnQsIHJlc3ApOworCQlpZiAoZXJyICE9IDEpCisJCQlyZXR1cm4gZXJyOworCisJCW1tY19jYXJkX2N1ci0+UkNBID0gKChtbWNfcmVzcF9yNiAqKSByZXNwKS0+bmV3cHVibGlzaGVkcmNhOworCX0KKworCU9NQVBfSFNNTUNfQ09OICY9IH5PRDsKKwlPTUFQX0hTTU1DX0NPTiB8PSBOT09QRU5EUkFJTjsKKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgY2hhciBtbWNfcmVhZF9jYXJkc2l6ZShtbWNfY2FyZF9kYXRhICptbWNfZGV2X2RhdGEsCisJCQkJbW1jX2NzZF9yZWdfdCAqY3VyX2NzZCkKK3sKKwltbWNfZXh0ZW5kZWRfY3NkX3JlZ190IGV4dF9jc2Q7CisJdW5zaWduZWQgaW50IHNpemUsIGNvdW50LCBibGtfbGVuLCBibGtfbm8sIGNhcmRfc2l6ZSwgYXJndW1lbnQ7CisJdW5zaWduZWQgY2hhciBlcnI7CisJdW5zaWduZWQgaW50IHJlc3BbNF07CisKKwlpZiAobW1jX2Rldl9kYXRhLT5tb2RlID09IFNFQ1RPUl9NT0RFKSB7CisJCWlmIChtbWNfZGV2X2RhdGEtPmNhcmRfdHlwZSA9PSBTRF9DQVJEKSB7CisJCQljYXJkX3NpemUgPQorCQkJICAgICgoKG1tY19zZDJfY3NkX3JlZ190ICopIGN1cl9jc2QpLT4KKwkJCSAgICAgY19zaXplX2xzYiAmIE1NQ19TRDJfQ1NEX0NfU0laRV9MU0JfTUFTSykgfAorCQkJICAgICgoKChtbWNfc2QyX2NzZF9yZWdfdCAqKSBjdXJfY3NkKS0+CisJCQkgICAgICBjX3NpemVfbXNiICYgTU1DX1NEMl9DU0RfQ19TSVpFX01TQl9NQVNLKQorCQkJICAgICA8PCBNTUNfU0QyX0NTRF9DX1NJWkVfTVNCX09GRlNFVCk7CisJCQltbWNfZGV2X2RhdGEtPnNpemUgPSBjYXJkX3NpemUgKiAxMDI0OworCQkJaWYgKG1tY19kZXZfZGF0YS0+c2l6ZSA9PSAwKQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJYXJndW1lbnQgPSAweDAwMDAwMDAwOworCQkJZXJyID0gbW1jX3NlbmRfY21kKE1NQ19DTUQ4LCBhcmd1bWVudCwgcmVzcCk7CisJCQlpZiAoZXJyICE9IDEpCisJCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IG1tY19yZWFkX2RhdGEoKHVuc2lnbmVkIGludCAqKSZleHRfY3NkKTsKKwkJCWlmIChlcnIgIT0gMSkKKwkJCQlyZXR1cm4gZXJyOworCQkJbW1jX2Rldl9kYXRhLT5zaXplID0gZXh0X2NzZC5zZWN0b3Jjb3VudDsKKworCQkJaWYgKG1tY19kZXZfZGF0YS0+c2l6ZSA9PSAwKQorCQkJCW1tY19kZXZfZGF0YS0+c2l6ZSA9IDgzODg2MDg7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY3VyX2NzZC0+Y19zaXplX211bHQgPj0gOCkKKwkJCXJldHVybiAwOworCisJCWlmIChjdXJfY3NkLT5yZWFkX2JsX2xlbiA+PSAxMikKKwkJCXJldHVybiAwOworCisJCS8qIENvbXB1dGUgc2l6ZSAqLworCQljb3VudCA9IDEgPDwgKGN1cl9jc2QtPmNfc2l6ZV9tdWx0ICsgMik7CisJCWNhcmRfc2l6ZSA9IChjdXJfY3NkLT5jX3NpemVfbHNiICYgTU1DX0NTRF9DX1NJWkVfTFNCX01BU0spIHwKKwkJICAgICgoY3VyX2NzZC0+Y19zaXplX21zYiAmIE1NQ19DU0RfQ19TSVpFX01TQl9NQVNLKQorCQkgICAgIDw8IE1NQ19DU0RfQ19TSVpFX01TQl9PRkZTRVQpOworCisJCWJsa19ubyA9IChjYXJkX3NpemUgKyAxKSAqIGNvdW50OworCQlibGtfbGVuID0gMSA8PCBjdXJfY3NkLT5yZWFkX2JsX2xlbjsKKwkJc2l6ZSA9IGJsa19ubyAqIGJsa19sZW47CisKKwkJbW1jX2Rldl9kYXRhLT5zaXplID0gc2l6ZSAvIE1NQ1NEX1NFQ1RPUl9TSVpFOworCQlpZiAobW1jX2Rldl9kYXRhLT5zaXplID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGNoYXIgb21hcF9tbWNfcmVhZF9zZWN0KHVuc2lnbmVkIGludCBzdGFydF9zZWMsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMsCisJCQkJIG1tY19jYXJkX2RhdGEgKm1tY19jLAorCQkJCSB1bnNpZ25lZCBpbnQgKm91dHB1dF9idWYpCit7CisJdW5zaWduZWQgY2hhciBlcnI7CisJdW5zaWduZWQgaW50IGFyZ3VtZW50OworCXVuc2lnbmVkIGludCByZXNwWzRdOworCXVuc2lnbmVkIGludCBudW1fc2VjX3ZhbCA9CisJICAgIChudW1fYnl0ZXMgKyAoTU1DU0RfU0VDVE9SX1NJWkUgLSAxKSkgLyBNTUNTRF9TRUNUT1JfU0laRTsKKwl1bnNpZ25lZCBpbnQgc2VjX2luY192YWw7CisKKwlpZiAobnVtX3NlY192YWwgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAobW1jX2MtPm1vZGUgPT0gU0VDVE9SX01PREUpIHsKKwkJYXJndW1lbnQgPSBzdGFydF9zZWM7CisJCXNlY19pbmNfdmFsID0gMTsKKwl9IGVsc2UgeworCQlhcmd1bWVudCA9IHN0YXJ0X3NlYyAqIE1NQ1NEX1NFQ1RPUl9TSVpFOworCQlzZWNfaW5jX3ZhbCA9IE1NQ1NEX1NFQ1RPUl9TSVpFOworCX0KKworCXdoaWxlIChudW1fc2VjX3ZhbCkgeworCQllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDE3LCBhcmd1bWVudCwgcmVzcCk7CisJCWlmIChlcnIgIT0gMSkKKwkJCXJldHVybiBlcnI7CisKKworCQllcnIgPSBtbWNfcmVhZF9kYXRhKG91dHB1dF9idWYpOworCQlpZiAoZXJyICE9IDEpCisJCQlyZXR1cm4gZXJyOworCisJCW91dHB1dF9idWYgKz0gKE1NQ1NEX1NFQ1RPUl9TSVpFIC8gNCk7CisJCWFyZ3VtZW50ICs9IHNlY19pbmNfdmFsOworCQludW1fc2VjX3ZhbC0tOworCX0KKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgY2hhciBjb25maWd1cmVfbW1jKG1tY19jYXJkX2RhdGEgKm1tY19jYXJkX2N1cikKK3sKKwl1bnNpZ25lZCBjaGFyIHJldF92YWw7CisJdW5zaWduZWQgaW50IGFyZ3VtZW50OworCXVuc2lnbmVkIGludCByZXNwWzRdOworCXVuc2lnbmVkIGludCB0cmFuc19mYWN0LCB0cmFuc191bml0LCByZXRyaWVzID0gMjsKKwl1bnNpZ25lZCBpbnQgbWF4X2R0cjsKKwlpbnQgZHNvcjsKKwl2b2xhdGlsZSBtbWNfY3NkX3JlZ190IENhcmRfQ1NEOworCXVuc2lnbmVkIGNoYXIgdHJhbnNfc3BlZWQ7CisKKwltbWNfaW5pdF9zZXR1cCgpOworCisJZG8geworCQlyZXRfdmFsID0gbW1jX2RldGVjdF9jYXJkKG1tY19jYXJkX2N1cik7CisJCXJldHJpZXMtLTsKKwl9IHdoaWxlICgocmV0cmllcyA+IDApICYmIChyZXRfdmFsICE9IDEpKTsKKworCWFyZ3VtZW50ID0gbW1jX2NhcmRfY3VyLT5SQ0EgPDwgMTY7CisJcmV0X3ZhbCA9IG1tY19zZW5kX2NtZChNTUNfQ01EOSwgYXJndW1lbnQsIHJlc3ApOworCWlmIChyZXRfdmFsICE9IDEpCisJCXJldHVybiByZXRfdmFsOworCisJKCh1bnNpZ25lZCBpbnQgKikmQ2FyZF9DU0QpWzNdID0gcmVzcFszXTsKKwkoKHVuc2lnbmVkIGludCAqKSZDYXJkX0NTRClbMl0gPSByZXNwWzJdOworCSgodW5zaWduZWQgaW50ICopJkNhcmRfQ1NEKVsxXSA9IHJlc3BbMV07CisJKCh1bnNpZ25lZCBpbnQgKikmQ2FyZF9DU0QpWzBdID0gcmVzcFswXTsKKworCWlmIChtbWNfY2FyZF9jdXItPmNhcmRfdHlwZSA9PSBNTUNfQ0FSRCkKKwkJbW1jX2NhcmRfY3VyLT52ZXJzaW9uID0gQ2FyZF9DU0Quc3BlY192ZXJzOworCisJdHJhbnNfc3BlZWQgPSBDYXJkX0NTRC50cmFuX3NwZWVkOworCisJcmV0X3ZhbCA9IG1tY19zZW5kX2NtZChNTUNfQ01ENCwgTU1DX0RTUl9ERUZBVUxUIDw8IDE2LCByZXNwKTsKKwlpZiAocmV0X3ZhbCAhPSAxKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXRyYW5zX3VuaXQgPSB0cmFuc19zcGVlZCAmIE1NQ19DU0RfVFJBTl9TUEVFRF9VTklUX01BU0s7CisJdHJhbnNfZmFjdCA9IHRyYW5zX3NwZWVkICYgTU1DX0NTRF9UUkFOX1NQRUVEX0ZBQ1RPUl9NQVNLOworCisJaWYgKHRyYW5zX3VuaXQgPiBNTUNfQ1NEX1RSQU5fU1BFRURfVU5JVF8xMDBNSFopCisJCXJldHVybiAwOworCisJaWYgKCh0cmFuc19mYWN0IDwgTU1DX0NTRF9UUkFOX1NQRUVEX0ZBQ1RPUl8xXzApIHx8CisJICAgICh0cmFuc19mYWN0ID4gTU1DX0NTRF9UUkFOX1NQRUVEX0ZBQ1RPUl84XzApKQorCQlyZXR1cm4gMDsKKworCXRyYW5zX3VuaXQgPj49IDA7CisJdHJhbnNfZmFjdCA+Pj0gMzsKKworCW1heF9kdHIgPSB0cmFuX2V4cFt0cmFuc191bml0XSAqIHRyYW5fbWFudFt0cmFuc19mYWN0XTsKKwlkc29yID0gT01BUF9NTUNfTUFTVEVSX0NMT0NLIC8gbWF4X2R0cjsKKworCWlmIChkc29yID09IDQpCisJCWRzb3IgPSA1OworCWlmIChkc29yID09IDMpCisJCWRzb3IgPSA0OworCisJcmV0X3ZhbCA9IG1tY19jbG9ja19jb25maWcoQ0xLX01JU0MsIGRzb3IpOworCWlmIChyZXRfdmFsICE9IDEpCisJCXJldHVybiByZXRfdmFsOworCisJYXJndW1lbnQgPSBtbWNfY2FyZF9jdXItPlJDQSA8PCAxNjsKKwlyZXRfdmFsID0gbW1jX3NlbmRfY21kKE1NQ19DTUQ3X1NFTEVDVCwgYXJndW1lbnQsIHJlc3ApOworCWlmIChyZXRfdmFsICE9IDEpCisJCXJldHVybiByZXRfdmFsOworCisJLyogQ29uZmlndXJlIHRoZSBibG9jayBsZW5ndGggdG8gNTEyIGJ5dGVzICovCisJYXJndW1lbnQgPSBNTUNTRF9TRUNUT1JfU0laRTsKKwlyZXRfdmFsID0gbW1jX3NlbmRfY21kKE1NQ19DTUQxNiwgYXJndW1lbnQsIHJlc3ApOworCWlmIChyZXRfdmFsICE9IDEpCisJCXJldHVybiByZXRfdmFsOworCisJLyogZ2V0IHRoZSBjYXJkIHNpemUgaW4gc2VjdG9ycyAqLworCXJldF92YWwgPSBtbWNfcmVhZF9jYXJkc2l6ZShtbWNfY2FyZF9jdXIsIChtbWNfY3NkX3JlZ190ICopJkNhcmRfQ1NEKTsKKwlpZiAocmV0X3ZhbCAhPSAxKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXJldHVybiAxOworfQorCit1bnNpZ25lZCBsb25nIG1tY19icmVhZChpbnQgZGV2X251bSwgdWxvbmcgYmxrbnIsIHVsb25nIGJsa2NudCwgdWxvbmcgKmRzdCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwlyZXQgPSBvbWFwX21tY19yZWFkX3NlY3QoYmxrbnIsIChibGtjbnQgKiBNTUNTRF9TRUNUT1JfU0laRSksCisJCQkmY3VyX2NhcmRfZGF0YSwgKHVuc2lnbmVkIGludCAqKWRzdCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IG1tY19pbml0KGludCB2ZXJib3NlKQoreworCXVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKKworCXJldCA9IGNvbmZpZ3VyZV9tbWMoJmN1cl9jYXJkX2RhdGEpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwltbWNfYmxrX2Rldi5pZl90eXBlID0gSUZfVFlQRV9NTUM7CisJbW1jX2Jsa19kZXYucGFydF90eXBlID0gUEFSVF9UWVBFX0RPUzsKKwltbWNfYmxrX2Rldi5kZXYgPSAwOworCW1tY19ibGtfZGV2Lmx1biA9IDA7CisJbW1jX2Jsa19kZXYudHlwZSA9IDA7CisKKwkvKiBGSVhNRSBmaWxsIGluIHRoZSBjb3JyZWN0IHNpemUgKGlzIHNldCB0byAzMk1CeXRlKSAqLworCW1tY19ibGtfZGV2LmJsa3N6ID0gTU1DU0RfU0VDVE9SX1NJWkU7CisJbW1jX2Jsa19kZXYubGJhID0gMHgxMDAwMDsKKwltbWNfYmxrX2Rldi5yZW1vdmFibGUgPSAwOworCW1tY19ibGtfZGV2LmJsb2NrX3JlYWQgPSBtbWNfYnJlYWQ7CisKKwlmYXRfcmVnaXN0ZXJfZGV2aWNlKCZtbWNfYmxrX2RldiwgMSk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IG1tY19yZWFkKHVuc2lnbmVkIGludCBzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHNpemUpCit7CisJLyoKKwkgKiBOT1QgSW1wbGVtZW50ZWQKKwkgKi8KKwlyZXR1cm4gMDsKK30KK2ludCBtbWNfd3JpdGUodW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBsb25nIGRzdCwgaW50IHNpemUpCit7CisJLyoKKwkgKiBOT1QgSW1wbGVtZW50ZWQKKwkgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IG1tYzJpbmZvKHVuc2lnbmVkIGludCBhZGRyKQoreworCS8qCisJICogTk9UIEltcGxlbWVudGVkCisJICovCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL21tY19ob3N0X2RlZi5oIGIveC1sb2FkZXIvY3B1L29tYXAzL21tY19ob3N0X2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1MjZmOTEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvb21hcDMvbW1jX2hvc3RfZGVmLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDgKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFN5ZWQgTW9oYW1tZWQgS2hhc2ltIDxraGFzaW1AdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgTU1DX0hPU1RfREVGSU5JVElPTlNfSAorI2RlZmluZSBNTUNfSE9TVF9ERUZJTklUSU9OU19ICisKKy8qCisgKiBPTUFQIEhTTU1DIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgT01BUF9IU01NQ19TWVNDT05GSUcJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMwMTApCisjZGVmaW5lIE9NQVBfSFNNTUNfU1lTU1RBVFVTCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMDE0KQorI2RlZmluZSBPTUFQX0hTTU1DX0NPTgkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMDJDKQorI2RlZmluZSBPTUFQX0hTTU1DX0JMSwkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTA0KQorI2RlZmluZSBPTUFQX0hTTU1DX0FSRwkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTA4KQorI2RlZmluZSBPTUFQX0hTTU1DX0NNRAkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTBDKQorI2RlZmluZSBPTUFQX0hTTU1DX1JTUDEwCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzExMCkKKyNkZWZpbmUgT01BUF9IU01NQ19SU1AzMgkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMTQpCisjZGVmaW5lIE9NQVBfSFNNTUNfUlNQNTQJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTE4KQorI2RlZmluZSBPTUFQX0hTTU1DX1JTUDc2CQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzExQykKKyNkZWZpbmUgT01BUF9IU01NQ19EQVRBCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMjApCisjZGVmaW5lIE9NQVBfSFNNTUNfUFNUQVRFCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzEyNCkKKyNkZWZpbmUgT01BUF9IU01NQ19IQ1RMCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMjgpCisjZGVmaW5lIE9NQVBfSFNNTUNfU1lTQ1RMCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzEyQykKKyNkZWZpbmUgT01BUF9IU01NQ19TVEFUCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMzApCisjZGVmaW5lIE9NQVBfSFNNTUNfSUUJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzEzNCkKKyNkZWZpbmUgT01BUF9IU01NQ19DQVBBCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxNDApCisKKy8qIFQyIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIENPTlRST0xfREVWX0NPTkYwCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODAwMjI3NCkKKyNkZWZpbmUgQ09OVFJPTF9QQklBU19MSVRFCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODAwMjUyMCkKKworLyoKKyAqIE9NQVAgSFMgTU1DIEJpdCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIE1NQ19TT0ZUUkVTRVQJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSRVNFVERPTkUJCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgTk9PUEVORFJBSU4JCQkJCSgweDAgPDwgMCkKKyNkZWZpbmUgT1BFTkRSQUlOCQkJCQkoMHgxIDw8IDApCisjZGVmaW5lIE9ECQkJCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgSU5JVF9OT0lOSVQJCQkJCSgweDAgPDwgMSkKKyNkZWZpbmUgSU5JVF9JTklUU1RSRUFNCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgSFJfTk9IT1NUUkVTUAkJCQkoMHgwIDw8IDIpCisjZGVmaW5lIFNUUl9CTE9DSyAJCQkJCSgweDAgPDwgMykKKyNkZWZpbmUgTU9ERV9GVU5DCQkJCQkoMHgwIDw8IDQpCisjZGVmaW5lIERXOF8xXzRCSVRNT0RFIAkJCQkoMHgwIDw8IDUpCisjZGVmaW5lIE1JVF9DVE8JCQkJCQkoMHgwIDw8IDYpCisjZGVmaW5lIENEUF9BQ1RJVkVISUdICQkJCSgweDAgPDwgNykKKyNkZWZpbmUgV1BQX0FDVElWRUhJR0ggCQkJCSgweDAgPDwgOCkKKyNkZWZpbmUgUkVTRVJWRURfTUFTSwkJCQkoMHgzIDw8IDkpCisjZGVmaW5lIENUUExfTU1DX1NEIAkJCQkoMHgwIDw8IDExKQorI2RlZmluZSBCTEVOXzUxMkJZVEVTTEVOCQkJKDB4MjAwIDw8IDApCisjZGVmaW5lIE5CTEtfU1RQQ05UCQkJCQkoMHgwIDw8IDE2KQorI2RlZmluZSBERV9ESVNBQkxFCQkJCQkoMHgwIDw8IDApCisjZGVmaW5lIEJDRV9ESVNBQkxFCQkJCQkoMHgwIDw8IDEpCisjZGVmaW5lIEFDRU5fRElTQUJMRQkJCQkoMHgwIDw8IDIpCisjZGVmaW5lIERESVJfT0ZGU0VUCQkJCQkoNCkKKyNkZWZpbmUgRERJUl9NQVNLCQkJCQkoMHgxIDw8IDQpCisjZGVmaW5lIERESVJfV1JJVEUJCQkJCSgweDAgPDwgNCkKKyNkZWZpbmUgRERJUl9SRUFECQkJCQkoMHgxIDw8IDQpCisjZGVmaW5lIE1TQlNfU0dMRUJMSwkJCQkoMHgwIDw8IDUpCisjZGVmaW5lIFJTUF9UWVBFX09GRlNFVAkJCQkoMTYpCisjZGVmaW5lIFJTUF9UWVBFX01BU0sJCQkJKDB4MyA8PCAxNikKKyNkZWZpbmUgUlNQX1RZUEVfTk9SU1AJCQkJKDB4MCA8PCAxNikKKyNkZWZpbmUgUlNQX1RZUEVfTEdIVDEzNgkJCSgweDEgPDwgMTYpCisjZGVmaW5lIFJTUF9UWVBFX0xHSFQ0OAkJCQkoMHgyIDw8IDE2KQorI2RlZmluZSBSU1BfVFlQRV9MR0hUNDhCCQkJKDB4MyA8PCAxNikKKyNkZWZpbmUgQ0NDRV9OT0NIRUNLCQkJCSgweDAgPDwgMTkpCisjZGVmaW5lIENDQ0VfQ0hFQ0sJCQkJCSgweDEgPDwgMTkpCisjZGVmaW5lIENJQ0VfTk9DSEVDSwkJCQkoMHgwIDw8IDIwKQorI2RlZmluZSBDSUNFX0NIRUNLCQkJCQkoMHgxIDw8IDIwKQorI2RlZmluZSBEUF9PRkZTRVQJCQkJCSgyMSkKKyNkZWZpbmUgRFBfTUFTSwkJCQkJCSgweDEgPDwgMjEpCisjZGVmaW5lIERQX05PX0RBVEEJCQkJCSgweDAgPDwgMjEpCisjZGVmaW5lIERQX0RBVEEJCQkJCQkoMHgxIDw8IDIxKQorI2RlZmluZSBDTURfVFlQRV9OT1JNQUwJCQkJKDB4MCA8PCAyMikKKyNkZWZpbmUgSU5ERVhfT0ZGU0VUCQkJCSgyNCkKKyNkZWZpbmUgSU5ERVhfTUFTSwkJCQkJKDB4M2YgPDwgMjQpCisjZGVmaW5lIElOREVYKGkpCQkJCQkoaSA8PCAyNCkKKyNkZWZpbmUgREFUSV9NQVNLCQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIERBVElfQ01ERElTCQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIERUV18xX0JJVE1PREUJCQkJKDB4MCA8PCAxKQorI2RlZmluZSBEVFdfNF9CSVRNT0RFCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgU0RCUF9QV1JPRkYJCQkJCSgweDAgPDwgOCkKKyNkZWZpbmUgU0RCUF9QV1JPTgkJCQkJKDB4MSA8PCA4KQorI2RlZmluZSBTRFZTXzFWOAkJCQkJKDB4NSA8PCA5KQorI2RlZmluZSBTRFZTXzNWMAkJCQkJKDB4NiA8PCA5KQorI2RlZmluZSBJQ0VfTUFTSwkJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBJQ0VfU1RPUAkJCQkJKDB4MCA8PCAwKQorI2RlZmluZSBJQ1NfTUFTSwkJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBJQ1NfTk9UUkVBRFkJCQkJKDB4MCA8PCAxKQorI2RlZmluZSBJQ0VfT1NDSUxMQVRFCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgQ0VOX01BU0sJCQkJCSgweDEgPDwgMikKKyNkZWZpbmUgQ0VOX0RJU0FCTEUJCQkJCSgweDAgPDwgMikKKyNkZWZpbmUgQ0VOX0VOQUJMRQkJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBDTEtEX09GRlNFVAkJCQkJKDYpCisjZGVmaW5lIENMS0RfTUFTSwkJCQkJKDB4M0ZGIDw8IDYpCisjZGVmaW5lIERUT19NQVNLCQkJCQkoMHhGIDw8IDE2KQorI2RlZmluZSBEVE9fMTVUSERUTwkJCQkJKDB4RSA8PCAxNikKKyNkZWZpbmUgU09GVFJFU0VUQUxMCQkJCSgweDEgPDwgMjQpCisjZGVmaW5lIENDX01BU0sJCQkJCQkoMHgxIDw8IDApCisjZGVmaW5lIFRDX01BU0sJCQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIEJXUl9NQVNLCQkJCQkoMHgxIDw8IDQpCisjZGVmaW5lIEJSUl9NQVNLCQkJCQkoMHgxIDw8IDUpCisjZGVmaW5lIEVSUklfTUFTSwkJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgSUVfQ0MJCQkJCQkoMHgwMSA8PCAwKQorI2RlZmluZSBJRV9UQwkJCQkJCSgweDAxIDw8IDEpCisjZGVmaW5lIElFX0JXUgkJCQkJCSgweDAxIDw8IDQpCisjZGVmaW5lIElFX0JSUgkJCQkJCSgweDAxIDw8IDUpCisjZGVmaW5lIElFX0NUTwkJCQkJCSgweDAxIDw8IDE2KQorI2RlZmluZSBJRV9DQ1JDCQkJCQkJKDB4MDEgPDwgMTcpCisjZGVmaW5lIElFX0NFQgkJCQkJCSgweDAxIDw8IDE4KQorI2RlZmluZSBJRV9DSUUJCQkJCQkoMHgwMSA8PCAxOSkKKyNkZWZpbmUgSUVfRFRPCQkJCQkJKDB4MDEgPDwgMjApCisjZGVmaW5lIElFX0RDUkMJCQkJCQkoMHgwMSA8PCAyMSkKKyNkZWZpbmUgSUVfREVCCQkJCQkJKDB4MDEgPDwgMjIpCisjZGVmaW5lIElFX0NFUlIJCQkJCQkoMHgwMSA8PCAyOCkKKyNkZWZpbmUgSUVfQkFEQQkJCQkJCSgweDAxIDw8IDI5KQorCisjZGVmaW5lIFZTMzBfM1YwU1VQCQkJCQkoMSA8PCAyNSkKKyNkZWZpbmUgVlMxOF8xVjhTVVAJCQkJCSgxIDw8IDI2KQorCisvKiBEcml2ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTU1DU0RfU0VDVE9SX1NJWkUJCSg1MTIpCisjZGVmaW5lIE1NQ19DQVJECQkJCTAKKyNkZWZpbmUgU0RfQ0FSRAkJCQkJMQorI2RlZmluZSBCWVRFX01PREUJCQkJMAorI2RlZmluZSBTRUNUT1JfTU9ERQkJCQkxCisjZGVmaW5lIENMS19JTklUU0VRCQkJCTAKKyNkZWZpbmUgQ0xLXzQwMEtIWgkJCQkxCisjZGVmaW5lIENMS19NSVNDCQkJCTIKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBjYXJkX3R5cGU7CisJdW5zaWduZWQgaW50IHZlcnNpb247CisJdW5zaWduZWQgaW50IG1vZGU7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IFJDQTsKK30gbW1jX2NhcmRfZGF0YTsKKworI2RlZmluZSBtbWNfcmVnX291dChhZGRyLCBtYXNrLCB2YWwpIFwKKwkoYWRkcikgPSAoKChhZGRyKSkgJiAofihtYXNrKSkgKSB8ICggKHZhbCkgJiAobWFzaykpOworCisjZW5kaWYJCQkJLyogTU1DX0hPU1RfREVGSU5JVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL21tY19wcm90b2NvbC5oIGIveC1sb2FkZXIvY3B1L29tYXAzL21tY19wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwN2ViMmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvb21hcDMvbW1jX3Byb3RvY29sLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDgKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFN5ZWQgTW9oYW1tZWQgS2hhc2ltIDxraGFzaW1AdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgTU1DX1BST1RPQ09MX0gKKyNkZWZpbmUgTU1DX1BST1RPQ09MX0gKKworI2luY2x1ZGUgIm1tY19ob3N0X2RlZi5oIgorCisvKiBSZXNwb25zZXMgKi8KKyNkZWZpbmUgUlNQX1RZUEVfTk9ORQkoUlNQX1RZUEVfTk9SU1AgICB8IENDQ0VfTk9DSEVDSyB8IENJQ0VfTk9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjEJCShSU1BfVFlQRV9MR0hUNDggIHwgQ0NDRV9DSEVDSyAgIHwgQ0lDRV9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjFCCShSU1BfVFlQRV9MR0hUNDhCIHwgQ0NDRV9DSEVDSyAgIHwgQ0lDRV9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjIJCShSU1BfVFlQRV9MR0hUMTM2IHwgQ0NDRV9DSEVDSyAgIHwgQ0lDRV9OT0NIRUNLKQorI2RlZmluZSBSU1BfVFlQRV9SMwkJKFJTUF9UWVBFX0xHSFQ0OCAgfCBDQ0NFX05PQ0hFQ0sgfCBDSUNFX05PQ0hFQ0spCisjZGVmaW5lIFJTUF9UWVBFX1I0CQkoUlNQX1RZUEVfTEdIVDQ4ICB8IENDQ0VfTk9DSEVDSyB8IENJQ0VfTk9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjUJCShSU1BfVFlQRV9MR0hUNDggIHwgQ0NDRV9DSEVDSyAgIHwgQ0lDRV9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjYJCShSU1BfVFlQRV9MR0hUNDggIHwgQ0NDRV9DSEVDSyAgIHwgQ0lDRV9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjcgICAgIChSU1BfVFlQRV9MR0hUNDggIHwgQ0NDRV9DSEVDSyAgIHwgQ0lDRV9DSEVDSykKKworLyogQWxsIHN1cHBvcnRlZCBjb21tYW5kcyAqLworI2RlZmluZSBNTUNfQ01EMAkoSU5ERVgoMCkgIHwgUlNQX1RZUEVfTk9ORSB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMQkoSU5ERVgoMSkgIHwgUlNQX1RZUEVfUjMgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMgkoSU5ERVgoMikgIHwgUlNQX1RZUEVfUjIgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMwkoSU5ERVgoMykgIHwgUlNQX1RZUEVfUjEgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfU0RDTUQzCShJTkRFWCgzKSAgfCBSU1BfVFlQRV9SNiAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQ0CShJTkRFWCg0KSAgfCBSU1BfVFlQRV9OT05FIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQ2CShJTkRFWCg2KSAgfCBSU1BfVFlQRV9SMUIgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQ3X1NFTEVDVAkoSU5ERVgoNykgIHwgUlNQX1RZUEVfUjFCICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EN19ERVNFTEVDVCBcCisJKElOREVYKDcpICB8IFJTUF9UWVBFX05PTkUgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDgJKElOREVYKDgpICB8IFJTUF9UWVBFX1IxICAgfCBEUF9EQVRBICAgIHwgRERJUl9SRUFEKQorI2RlZmluZSBNTUNfU0RDTUQ4CShJTkRFWCg4KSAgfCBSU1BfVFlQRV9SNyAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQ5CShJTkRFWCg5KSAgfCBSU1BfVFlQRV9SMiAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQxMgkoSU5ERVgoMTIpIHwgUlNQX1RZUEVfUjFCICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMTMJKElOREVYKDEzKSB8IFJTUF9UWVBFX1IxICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDE1CShJTkRFWCgxNSkgfCBSU1BfVFlQRV9OT05FIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQxNgkoSU5ERVgoMTYpIHwgUlNQX1RZUEVfUjEgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMTcJKElOREVYKDE3KSB8IFJTUF9UWVBFX1IxICAgfCBEUF9EQVRBICAgIHwgRERJUl9SRUFEKQorI2RlZmluZSBNTUNfQ01EMjQJKElOREVYKDI0KSB8IFJTUF9UWVBFX1IxICAgfCBEUF9EQVRBICAgIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0FDTUQ2CShJTkRFWCg2KSAgfCBSU1BfVFlQRV9SMSAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19BQ01ENDEJKElOREVYKDQxKSB8IFJTUF9UWVBFX1IzICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0FDTUQ1MQkoSU5ERVgoNTEpIHwgUlNQX1RZUEVfUjEgICB8IERQX0RBVEEgICAgfCBERElSX1JFQUQpCisjZGVmaW5lIE1NQ19DTUQ1NQkoSU5ERVgoNTUpIHwgUlNQX1RZUEVfUjEgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorCisjZGVmaW5lIE1NQ19BQ19DTURfUkNBX01BU0sgICAgICh1bnNpZ25lZCBpbnQpKDB4RkZGRiA8PCAxNikKKyNkZWZpbmUgTU1DX0JDX0NNRF9EU1JfTUFTSyAgICAgKHVuc2lnbmVkIGludCkoMHhGRkZGIDw8IDE2KQorI2RlZmluZSBNTUNfRFNSX0RFRkFVTFQgICAgICAgICAoMHgwNDA0KQorI2RlZmluZSBTRF9DTUQ4X0NIRUNLX1BBVFRFUk4gICAgICAgKDB4QUEpCisjZGVmaW5lIFNEX0NNRDhfMl83XzNfNl9WX1JBTkdFICAgICAoMHgwMSA8PCA4KQorCisvKiBDbG9jayBDb25maWd1cmF0aW9ucyBhbmQgTWFjcm9zICovCisKKyNkZWZpbmUgTU1DX0NMT0NLX1JFRkVSRU5DRQkJKDk2KQorI2RlZmluZSBNTUNfUkVMQVRJVkVfQ0FSRF9BRERSRVNTCSgweDEyMzQpCisjZGVmaW5lIE1NQ19JTklUX1NFUV9DTEsJCShNTUNfQ0xPQ0tfUkVGRVJFTkNFICogMTAwMCAvIDgwKQorI2RlZmluZSBNTUNfNDAwa0h6X0NMSwkJCShNTUNfQ0xPQ0tfUkVGRVJFTkNFICogMTAwMCAvIDQwMCkKKyNkZWZpbmUgQ0xLRFIociwgZiwgdSkJCQkoKCgocikqMTAwKSAvICgoZikqKHUpKSkgKyAxKQorI2RlZmluZSBDTEtEKGYsIHUpCQkJKENMS0RSKE1NQ19DTE9DS19SRUZFUkVOQ0UsIGYsIHUpKQorCisjZGVmaW5lIE1NQ19PQ1JfUkVHX0FDQ0VTU19NT0RFX01BU0sJKDB4MyA8PCAyOSkKKyNkZWZpbmUgTU1DX09DUl9SRUdfQUNDRVNTX01PREVfQllURSAgICAoMHgwIDw8IDI5KQorI2RlZmluZSBNTUNfT0NSX1JFR19BQ0NFU1NfTU9ERV9TRUNUT1IgICgweDIgPDwgMjkpCisKKyNkZWZpbmUgTU1DX09DUl9SRUdfSE9TVF9DQVBBQ0lUWV9TVVBQT1JUX01BU0sJCSgweDEgPDwgMzApCisjZGVmaW5lIE1NQ19PQ1JfUkVHX0hPU1RfQ0FQQUNJVFlfU1VQUE9SVF9CWVRFCQkoMHgwIDw8IDMwKQorI2RlZmluZSBNTUNfT0NSX1JFR19IT1NUX0NBUEFDSVRZX1NVUFBPUlRfU0VDVE9SCSgweDEgPDwgMzApCisKKyNkZWZpbmUgTU1DX1NEMl9DU0RfQ19TSVpFX0xTQl9NQVNLICAgICAgICAgKDB4RkZGRikKKyNkZWZpbmUgTU1DX1NEMl9DU0RfQ19TSVpFX01TQl9NQVNLICAgICAgICAgKDB4MDAzRikKKyNkZWZpbmUgTU1DX1NEMl9DU0RfQ19TSVpFX01TQl9PRkZTRVQgICAgICAgKDE2KQorI2RlZmluZSBNTUNfQ1NEX0NfU0laRV9MU0JfTUFTSyAgICAgICAgICAgICAoMHgwMDAzKQorI2RlZmluZSBNTUNfQ1NEX0NfU0laRV9NU0JfTUFTSyAgICAgICAgICAgICAoMHgwM0ZGKQorI2RlZmluZSBNTUNfQ1NEX0NfU0laRV9NU0JfT0ZGU0VUICAgICAgICAgICAoMikKKworI2RlZmluZSBNTUNfQ1NEX1RSQU5fU1BFRURfVU5JVF9NQVNLICAgICAgICAoMHgwNyA8PCAwKQorI2RlZmluZSBNTUNfQ1NEX1RSQU5fU1BFRURfRkFDVE9SX01BU0sgICAgICAoMHgwRiA8PCAzKQorI2RlZmluZSBNTUNfQ1NEX1RSQU5fU1BFRURfVU5JVF8xMDBNSFogICAgICAoMHgzIDw8IDApCisjZGVmaW5lIE1NQ19DU0RfVFJBTl9TUEVFRF9GQUNUT1JfMV8wICAgICAgICgweDAxIDw8IDMpCisjZGVmaW5lIE1NQ19DU0RfVFJBTl9TUEVFRF9GQUNUT1JfOF8wICAgICAgICgweDBGIDw8IDMpCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHJhbl9leHBbXSA9IHsKKwkxMDAwMCwgICAgICAgICAgMTAwMDAwLCAgICAgICAgIDEwMDAwMDAsICAgICAgICAxMDAwMDAwMCwKKwkwLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAwCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0cmFuX21hbnRbXSA9IHsKKwkwLCAgICAgIDEwLCAgICAgMTIsICAgICAxMywgICAgIDE1LCAgICAgMjAsICAgICAyNSwgICAgIDMwLAorCTM1LCAgICAgNDAsICAgICA0NSwgICAgIDUwLCAgICAgNTUsICAgICA2MCwgICAgIDcwLCAgICAgODAsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbm90X3VzZWQ6MTsKKwl1bnNpZ25lZCBjcmM6NzsKKwl1bnNpZ25lZCBlY2M6MjsKKwl1bnNpZ25lZCBmaWxlX2Zvcm1hdDoyOworCXVuc2lnbmVkIHRtcF93cml0ZV9wcm90ZWN0OjE7CisJdW5zaWduZWQgcGVybV93cml0ZV9wcm90ZWN0OjE7CisJdW5zaWduZWQgY29weToxOworCXVuc2lnbmVkIGZpbGVfZm9ybWF0X2dycDoxOworCXVuc2lnbmVkIGNvbnRlbnRfcHJvdF9hcHA6MTsKKwl1bnNpZ25lZCByZXNlcnZlZF8xOjQ7CisJdW5zaWduZWQgd3JpdGVfYmxfcGFydGlhbDoxOworCXVuc2lnbmVkIHdyaXRlX2JsX2xlbjo0OworCXVuc2lnbmVkIHIyd19mYWN0b3I6MzsKKwl1bnNpZ25lZCBkZWZhdWx0X2VjYzoyOworCXVuc2lnbmVkIHdwX2dycF9lbmFibGU6MTsKKwl1bnNpZ25lZCB3cF9ncnBfc2l6ZTo1OworCXVuc2lnbmVkIGVyYXNlX2dycF9tdWx0OjU7CisJdW5zaWduZWQgZXJhc2VfZ3JwX3NpemU6NTsKKwl1bnNpZ25lZCBjX3NpemVfbXVsdDozOworCXVuc2lnbmVkIHZkZF93X2N1cnJfbWF4OjM7CisJdW5zaWduZWQgdmRkX3dfY3Vycl9taW46MzsKKwl1bnNpZ25lZCB2ZGRfcl9jdXJyX21heDozOworCXVuc2lnbmVkIHZkZF9yX2N1cnJfbWluOjM7CisJdW5zaWduZWQgY19zaXplX2xzYjoyOworCXVuc2lnbmVkIGNfc2l6ZV9tc2I6MTA7CisJdW5zaWduZWQgcmVzZXJ2ZWRfMjoyOworCXVuc2lnbmVkIGRzcl9pbXA6MTsKKwl1bnNpZ25lZCByZWFkX2Jsa19taXNhbGlnbjoxOworCXVuc2lnbmVkIHdyaXRlX2Jsa19taXNhbGlnbjoxOworCXVuc2lnbmVkIHJlYWRfYmxfcGFydGlhbDoxOworCXVuc2lnbmVkIHJlYWRfYmxfbGVuOjQ7CisJdW5zaWduZWQgY2NjOjEyOworCXVuc2lnbmVkIHRyYW5fc3BlZWQ6ODsKKwl1bnNpZ25lZCBuc2FjOjg7CisJdW5zaWduZWQgdGFhYzo4OworCXVuc2lnbmVkIHJlc2VydmVkXzM6MjsKKwl1bnNpZ25lZCBzcGVjX3ZlcnM6NDsKKwl1bnNpZ25lZCBjc2Rfc3RydWN0dXJlOjI7Cit9IG1tY19jc2RfcmVnX3Q7CisKKy8qIGNzZCBmb3Igc2QyLjAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBub3RfdXNlZDoxOworCXVuc2lnbmVkIGNyYzo3OworCXVuc2lnbmVkIHJlc2VydmVkXzE6MjsKKwl1bnNpZ25lZCBmaWxlX2Zvcm1hdDoyOworCXVuc2lnbmVkIHRtcF93cml0ZV9wcm90ZWN0OjE7CisJdW5zaWduZWQgcGVybV93cml0ZV9wcm90ZWN0OjE7CisJdW5zaWduZWQgY29weToxOworCXVuc2lnbmVkIGZpbGVfZm9ybWF0X2dycDoxOworCXVuc2lnbmVkIHJlc2VydmVkXzI6NTsKKwl1bnNpZ25lZCB3cml0ZV9ibF9wYXJ0aWFsOjE7CisJdW5zaWduZWQgd3JpdGVfYmxfbGVuOjQ7CisJdW5zaWduZWQgcjJ3X2ZhY3RvcjozOworCXVuc2lnbmVkIHJlc2VydmVkXzM6MjsKKwl1bnNpZ25lZCB3cF9ncnBfZW5hYmxlOjE7CisJdW5zaWduZWQgd3BfZ3JwX3NpemU6NzsKKwl1bnNpZ25lZCBzZWN0b3Jfc2l6ZTo3OworCXVuc2lnbmVkIGVyYXNlX2Jsa19sZW46MTsKKwl1bnNpZ25lZCByZXNlcnZlZF80OjE7CisJdW5zaWduZWQgY19zaXplX2xzYjoxNjsKKwl1bnNpZ25lZCBjX3NpemVfbXNiOjY7CisJdW5zaWduZWQgcmVzZXJ2ZWRfNTo2OworCXVuc2lnbmVkIGRzcl9pbXA6MTsKKwl1bnNpZ25lZCByZWFkX2Jsa19taXNhbGlnbjoxOworCXVuc2lnbmVkIHdyaXRlX2Jsa19taXNhbGlnbjoxOworCXVuc2lnbmVkIHJlYWRfYmxfcGFydGlhbDoxOworCXVuc2lnbmVkIHJlYWRfYmxfbGVuOjQ7CisJdW5zaWduZWQgY2NjOjEyOworCXVuc2lnbmVkIHRyYW5fc3BlZWQ6ODsKKwl1bnNpZ25lZCBuc2FjOjg7CisJdW5zaWduZWQgdGFhYzo4OworCXVuc2lnbmVkIHJlc2VydmVkXzY6NjsKKwl1bnNpZ25lZCBjc2Rfc3RydWN0dXJlOjI7Cit9IG1tY19zZDJfY3NkX3JlZ190OworCisvKiBleHRlbmRlZCBjc2QgLSA1MTIgYnl0ZXMgbG9uZyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfMVsxODFdOworCXVuc2lnbmVkIGNoYXIgZXJhc2VkbWVtb3J5Y29udGVudDsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzI7CisJdW5zaWduZWQgY2hhciBidXN3aWR0aG1vZGU7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF8zOworCXVuc2lnbmVkIGNoYXIgaGlnaHNwZWVkaW50ZXJmYWNldGltaW5nOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfNDsKKwl1bnNpZ25lZCBjaGFyIHBvd2VyY2xhc3M7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF81OworCXVuc2lnbmVkIGNoYXIgY29tbWFuZHNldHJldmlzaW9uOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfNjsKKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmRzZXQ7CisJdW5zaWduZWQgY2hhciBleHRlbmRlZGNzZHJldmlzaW9uOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfNzsKKwl1bnNpZ25lZCBjaGFyIGNzZHN0cnVjdHVyZXZlcnNpb247CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF84OworCXVuc2lnbmVkIGNoYXIgY2FyZHR5cGU7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF85WzNdOworCXVuc2lnbmVkIGNoYXIgcG93ZXJjbGFzc181Mm1oel8xXzk1djsKKwl1bnNpZ25lZCBjaGFyIHBvd2VyY2xhc3NfMjZtaHpfMV85NXY7CisJdW5zaWduZWQgY2hhciBwb3dlcmNsYXNzXzUybWh6XzNfNnY7CisJdW5zaWduZWQgY2hhciBwb3dlcmNsYXNzXzI2bWh6XzNfNnY7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF8xMDsKKwl1bnNpZ25lZCBjaGFyIG1pbnJlYWRwZXJmXzRiXzI2bWh6OworCXVuc2lnbmVkIGNoYXIgbWlud3JpdGVwZXJmXzRiXzI2bWh6OworCXVuc2lnbmVkIGNoYXIgbWlucmVhZHBlcmZfOGJfMjZtaHpfNGJfNTJtaHo7CisJdW5zaWduZWQgY2hhciBtaW53cml0ZXBlcmZfOGJfMjZtaHpfNGJfNTJtaHo7CisJdW5zaWduZWQgY2hhciBtaW5yZWFkcGVyZl84Yl81Mm1oejsKKwl1bnNpZ25lZCBjaGFyIG1pbndyaXRlcGVyZl84Yl81Mm1oejsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzExOworCXVuc2lnbmVkIGludCBzZWN0b3Jjb3VudDsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzEyWzI4OF07CisJdW5zaWduZWQgY2hhciBzdXBwb3J0ZWRjb21tYW5kc2V0czsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzEzWzddOworfSBtbWNfZXh0ZW5kZWRfY3NkX3JlZ190OworCisvKiBtbWMgc2QgcmVzcG9uY2UgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgb2NyOworfSBtbWNfcmVzcF9yMzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IGNhcmRzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgbmV3cHVibGlzaGVkcmNhOworfSBtbWNfcmVzcF9yNjsKKworZXh0ZXJuIG1tY19jYXJkX2RhdGEgbW1jX2RldjsKKwordW5zaWduZWQgY2hhciBtbWNfbG93bGV2ZWxfaW5pdCh2b2lkKTsKK3Vuc2lnbmVkIGNoYXIgbW1jX3NlbmRfY29tbWFuZCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgYXJnLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqcmVzcG9uc2UpOwordW5zaWduZWQgY2hhciBtbWNfc2V0dXBfY2xvY2sodW5zaWduZWQgaW50IGljbGssIHVuc2lnbmVkIHNob3J0IGNsa2QpOwordW5zaWduZWQgY2hhciBtbWNfc2V0X29wZW5kcmFpbih1bnNpZ25lZCBjaGFyIHN0YXRlKTsKK3Vuc2lnbmVkIGNoYXIgbW1jX3JlYWRfZGF0YSh1bnNpZ25lZCBpbnQgKm91dHB1dF9idWYpOworCisjZW5kaWYJCQkJLypNTUNfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL3N0YXJ0LlMgYi94LWxvYWRlci9jcHUvb21hcDMvc3RhcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTg4OTM1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L29tYXAzL3N0YXJ0LlMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiAgYXJtYm9vdCAtIFN0YXJ0dXAgQ29kZSBmb3IgT01QMjQyMC9BUk0xMTM2IENQVS1jb3JlCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNC0yMDA2ICBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEJTWFyaXVzIEdy9mdlciA8bWFnQHN5c2dvLmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMglBbGV4IFr8cGtlIDxhenVAc3lzZ28uZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCUdhcnkgSmVubmVqb2huIDxnakBkZW54LmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMwlSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAzCUtzaGl0aWogPGtzaGl0aWpAdGkuY29tPgorICogIENvcHlyaWdodCAoYykgMjAwNAlKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKworLmdsb2JsIF9zdGFydAorX3N0YXJ0OgorCWIJcmVzZXQKKyAJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCitfaGFuZzoKKyAJLndvcmQgZG9faGFuZworCisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OCAvKiBub3cgMTYqND02NCAqLworCisuZ2xvYmFsIF9lbmRfdmVjdAorX2VuZF92ZWN0OgorCisJLmJhbGlnbmwgMTYsMHhkZWFkYmVlZgorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU3RhcnR1cCBDb2RlIChyZXNldCB2ZWN0b3IpCisgKgorICogZG8gaW1wb3J0YW50IGluaXQgb25seSBpZiB3ZSBkb24ndCBzdGFydCBmcm9tIG1lbW9yeSEKKyAqIHNldHVwIE1lbW9yeSBhbmQgYm9hcmQgc3BlY2lmaWMgYml0cyBwcmlvciB0byByZWxvY2F0aW9uLgorICogcmVsb2NhdGUgYXJtYm9vdCB0byByYW0KKyAqIHNldHVwIHN0YWNrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQorCisjaWZuZGVmIFNUQUNLX0JBU0UKKyNkZWZpbmUgU1RBQ0tfQkFTRSBURVhUX0JBU0UKKyNlbmRpZgorCQorX1NUQUNLX0JBU0U6CisgICAgLndvcmQgICBTVEFDS19CQVNFCisKKy5nbG9ibCBfYXJtYm9vdF9zdGFydAorX2FybWJvb3Rfc3RhcnQ6CisJLndvcmQgX3N0YXJ0CisKKy8qCisgKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgbGlua2VyIHNjcmlwdC4KKyAqLworLmdsb2JsIF9ic3Nfc3RhcnQKK19ic3Nfc3RhcnQ6CisJLndvcmQgX19ic3Nfc3RhcnQKKworLmdsb2JsIF9ic3NfZW5kCitfYnNzX2VuZDoKKwkud29yZCBfZW5kCisKKy8qCisgKiB0aGUgYWN0dWFsIHJlc2V0IGNvZGUKKyAqLworCityZXNldDoKKwkvKgorCSAqIHNldCB0aGUgY3B1IHRvIFNWQzMyIG1vZGUKKwkgKi8KKwltcnMJcjAsY3BzcgorCWJpYwlyMCxyMCwjMHgxZgorCW9ycglyMCxyMCwjMHhkMworCW1zcgljcHNyLHIwCisKKwkvKiBDb3B5IHZlY3RvcnMgdG8gbWFzayBST00gaW5kaXJlY3QgYWRkciAqLworCWFkciAgICAgcjAsIF9zdGFydCAgICAgICAgICAgICAgLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KKwlhZGQgICAgIHIwLCByMCwgIzQJCQkJLyogc2tpcCByZXNldCB2ZWN0b3IJCQkqLworCW1vdiAgICAgcjIsICM2NCAgICAgICAgICAgICAgICAgLyogcjIgPC0gc2l6ZSB0byBjb3B5ICAqLworCWFkZCAgICAgcjIsIHIwLCByMiAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICAgICAgICAgKi8KKwltb3YgICAgIHIxLCAjU1JBTV9PRkZTRVQwICAgICAgICAgLyogYnVpbGQgdmVjdCBhZGRyICovCisJbW92ICAgICByMywgI1NSQU1fT0ZGU0VUMQorCWFkZCAgICAgcjEsIHIxLCByMworCW1vdiAgICAgcjMsICNTUkFNX09GRlNFVDIKKwlhZGQgICAgIHIxLCByMSwgcjMKK25leHQ6CisJbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworCXN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKwljbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisJYm5lICAgICBuZXh0ICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVudGlsIGVxdWFsICovCisKKwlibAljcHlfY2xrX2NvZGUgICAgICAgICAgICAvKiBwdXQgZHBsbCBhZGp1c3QgY29kZSBiZWhpbmQgdmVjdG9ycyAqLworCisJLyogdGhlIG1hc2sgUk9NIGNvZGUgc2hvdWxkIGhhdmUgUExMIGFuZCBvdGhlcnMgc3RhYmxlICovCisJYmwgIGNwdV9pbml0X2NyaXQKKworcmVsb2NhdGU6CQkJCS8qIHJlbG9jYXRlIFUtQm9vdCB0byBSQU0JICAgICovCisJYWRyCXIwLCBfc3RhcnQJCS8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisJbGRyCXIxLCBfVEVYVF9CQVNFCQkvKiB0ZXN0IGlmIHdlIHJ1biBmcm9tIGZsYXNoIG9yIFJBTSAqLworCWNtcCByMCwgcjEgICAgICAgICAgICAgICAgICAJLyogbm8gbmVlZCB0byByZWxvY2F0ZSBpZiBYSVAgICAgICAgKi8KKwliZXEgc3RhY2tfc2V0dXAJCQkvKiBza2lwIHR4dCBjcHkgaWYgWElQKFNSQU0sIFNEUkFNKSAqLworCisJbGRyCXIyLCBfYXJtYm9vdF9zdGFydAorCWxkcglyMywgX2Jzc19zdGFydAorCXN1YglyMiwgcjMsIHIyCQkvKiByMiA8LSBzaXplIG9mIGFybWJvb3QgICAgICAgICAgICAqLworCWFkZAlyMiwgcjAsIHIyCQkvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgICAgICAgICAqLworCitjb3B5X2xvb3A6CisJbGRtaWEJcjAhLCB7cjMtcjEwfQkJLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKwlzdG1pYQlyMSEsIHtyMy1yMTB9CQkvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlZWUgW3IyXSAgICAqLworCWJsZQljb3B5X2xvb3AKKworCS8qIFNldCB1cCB0aGUgc3RhY2sJCQkJCQkgICAgKi8KK3N0YWNrX3NldHVwOgorCWxkcglyMCwgX1NUQUNLX0JBU0UJCS8qIHVwcGVyIDEyOCBLaUI6IHJlbG9jYXRlZCB1Ym9vdCAgICovCisJc3ViCXNwLCByMCwgIzEyOAkJLyogbGVhdmUgMzIgd29yZHMgZm9yIGFib3J0LXN0YWNrICAgKi8KKwlhbmQJc3AsIHNwLCAjfjcJCS8qIDggYnl0ZSBhbGluZ2VkIGZvciAobGRyL3N0cilkICAgICovCisKKwkvKiBDbGVhciBCU1MgKGlmIGFueSkuICBJcyBiZWxvdyB0eCAod2F0Y2ggbG9hZCBhZGRyIC0gbmVlZCBzcGFjZSkgICovCitjbGVhcl9ic3M6CisJbGRyCXIwLCBfYnNzX3N0YXJ0CQkvKiBmaW5kIHN0YXJ0IG9mIGJzcyBzZWdtZW50ICAgICAgICAqLworCWxkcglyMSwgX2Jzc19lbmQJCS8qIHN0b3AgaGVyZSAgICAgICAgICAgICAgICAgICAgICAgICovCisJbW92IAlyMiwgIzB4MDAwMDAwMDAJCS8qIGNsZWFyIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICovCitjbGJzc19sOgorCXN0cglyMiwgW3IwXQkJLyogY2xlYXIgQlNTIGxvY2F0aW9uICAgICAgICAgICAgICAgKi8KKwljbXAJcjAsIHIxCQkJLyogYXJlIHdlIGF0IHRoZSBlbmQgeWV0ICAgICAgICAgICAgKi8KKwlhZGQJcjAsIHIwLCAjNAkJLyogaW5jcmVtZW50IGNsZWFyIGluZGV4IHBvaW50ZXIgICAgKi8KKwlibmUJY2xic3NfbCAgICAgICAgICAgICAgICAgLyoga2VlcCBjbGVhcmluZyB0aWxsIGF0IGVuZCAgICAgICAgKi8KKworCWxkcglwYywgX3N0YXJ0X2FybWJvb3QJLyoganVtcCB0byBDIGNvZGUgICAgICAgICAgICAgICAgICAgKi8KKworX3N0YXJ0X2FybWJvb3Q6CS53b3JkIHN0YXJ0X2FybWJvb3QKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDUFVfaW5pdF9jcml0aWNhbCByZWdpc3RlcnMKKyAqCisgKiBzZXR1cCBpbXBvcnRhbnQgcmVnaXN0ZXJzCisgKiBzZXR1cCBtZW1vcnkgdGltaW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworY3B1X2luaXRfY3JpdDoKKwkvKgorCSAqIEludmFsaWRhdGUgTDEgSS9ECisJICovCisgICAgICAgIG1vdglyMCwgIzAgICAgICAgICAgICAgICAgIC8qIHNldCB1cCBmb3IgTUNSICovCisgICAgICAgIG1jcglwMTUsIDAsIHIwLCBjOCwgYzcsIDAgIC8qIGludmFsaWRhdGUgVExCcyAqLworICAgICAgICBtY3IJcDE1LCAwLCByMCwgYzcsIGM1LCAxICAvKiBpbnZhbGlkYXRlIGljYWNoZSAqLworCisJLyogSW52YWxpZGUgTDIgY2FjaGUgKGdwIGRldmljZSBjYWxsIHBvaW50KQorCSAqIC0gd2FybmluZywgdGhpcyBtYXkgaGF2ZSBpc3N1ZXMgb24gRU1VL0hTIGRldmljZXMKKwkgKiB0aGlzIGNhbGwgY2FuIGNvcnJ1cHQgcjAtcjUKKwkgKi8KKwltb3YgcjEyLCAjMHgxCQlAIHNldCB1cCB0byBpbnZhbGlkZSBMMgorLyoKKyAqIFRPRE86IE5lZWQgdG8gcmV2ZXJ0IGJhY2sgb24gR1AgZGV2aWNlLgorICovCisvKgorc21pOiAJLndvcmQgMHhFMTYwMDA3MAlAIENhbGwgU01JIG1vbml0b3IKKyovCisJLyoKKwkgKiBkaXNhYmxlIE1NVSBzdHVmZiBhbmQgY2FjaGVzCisJICovCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAorCWJpYwlyMCwgcjAsICMweDAwMDAyMDAwCUAgY2xlYXIgYml0cyAxMyAoLS1WLSkKKwliaWMJcjAsIHIwLCAjMHgwMDAwMDAwNwlAIGNsZWFyIGJpdHMgMjowICgtQ0FNKQorCW9ycglyMCwgcjAsICMweDAwMDAwMDAyCUAgc2V0IGJpdCAxICgtLUEtKSBBbGlnbgorI2lmbmRlZiBDT05GSUdfSUNBQ0hFX09GRgorCW9ycglyMCwgcjAsICMweDAwMDAxODAwCUAgc2V0IGJpdCAxMSwxMiAoLS0tSSBaLS0tKSBCVEIsSS1DYWNoZQorI2VuZGlmCisJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAorCisJLyoKKyAgICAgICAgICogSnVtcCB0byBib2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4uLiBUaGUgTWFzayBST00gd2lsbCBoYXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQKKyAgICAgICAgICogYmFzaWMgbWVtb3J5LiAgR28gaGVyZSB0byBidW1wIHVwIGNsb2NrIHJhdGUgYW5kIGhhbmRsZSB3YWtlIHVwIGNvbmRpdGlvbnMuCisJICovCisJYWRyCXIwLCBfc3RhcnQJCS8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisJbGRyCXIxLCBfVEVYVF9CQVNFCQkvKiB0ZXN0IGlmIHdlIHJ1biBmcm9tIGZsYXNoIG9yIFJBTSAqLworCWNtcCAgICAgcjAsIHIxICAgICAgICAgICAgICAgICAgLyogcGFzcyBvbiBpbmZvIGFib3V0IHNraXBwaW5nIHNvbWUgaW5pdCBwb3J0aW9ucyAqLworCW1vdmVxICAgcjAsIzB4MSAgICAgICAgICAgICAgICAgLyogZmxhZyB0byBza2lwIHByY20gYW5kIHNkcmMgc2V0dXAgKi8KKwltb3ZuZSAgIHIwLCMweDAKKworCW1vdglpcCwgbHIgICAgICAgICAgLyogcGVyc2V2ZXJlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisJYmwJbG93bGV2ZWxfaW5pdCAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisJbW92CWxyLCBpcCAgICAgICAgICAvKiByZXN0b3JlIGxpbmsgKi8KKwltb3YJcGMsIGxyICAgICAgICAgIC8qIGJhY2sgdG8gbXkgY2FsbGVyICovCisKKy8qCisgKiBleGNlcHRpb24gaGFuZGxlcgorICovCisgCS5hbGlnbiAgNQorZG9faGFuZzoKKwlsZHIJc3AsIF9URVhUX0JBU0UJCS8qIHVzZSAzMiB3b3JkcyBhYm9ydCBzdGFjayAqLworICAgCWJsCWhhbmcJCQkvKiBoYW5nIGFuZCBuZXZlciByZXR1cm4gKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZGlzay9NYWtlZmlsZSBiL3gtbG9hZGVyL2Rpc2svTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWY0MDlkOAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2Rpc2svTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworI0NGTEFHUyArPSAtREVUX0RFQlVHIC1EREVCVUcKKworTElCCT0gJChvYmopbGliZGlzay5hCisKK0NPQkpTCT0gcGFydC5vCisKK1NSQ1MJOj0gJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorCithbGw6CSQoTElCKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZGlzay9wYXJ0LmMgYi94LWxvYWRlci9kaXNrL3BhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMzY3ZjEzCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZGlzay9wYXJ0LmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxpZGUuaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+CisKKyN1bmRlZglQQVJUX0RFQlVHCisKKyNpZmRlZglQQVJUX0RFQlVHCisjZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikJcHJpbnRmIChmbXQgLCMjYXJncykKKyNlbHNlCisjZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikKKyNlbmRpZgorCisjaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAorICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCisgICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19NTUMpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiByZXBvcnRzIGRldmljZSBpbmZvIHRvIHRoZSB1c2VyCisgKi8KK3ZvaWQgZGV2X3ByaW50IChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYykKK3sKKyNpZmRlZiBDT05GSUdfTEJBNDgKKwl1aW50NjRfdCBsYmE1MTI7IC8qIG51bWJlciBvZiBibG9ja3MgaWYgNTEyYnl0ZXMgYmxvY2sgc2l6ZSAqLworI2Vsc2UKKwlsYmFpbnRfdCBsYmE1MTI7CisjZW5kaWYKKworCWlmIChkZXZfZGVzYy0+dHlwZT09REVWX1RZUEVfVU5LTk9XTikgeworCQlyZXR1cm47CisJfQorCWlmIChkZXZfZGVzYy0+aWZfdHlwZT09SUZfVFlQRV9TQ1NJKSAgeworCQlwcmludGYgKCIoJWQ6JWQpICIsIGRldl9kZXNjLT50YXJnZXQsZGV2X2Rlc2MtPmx1bik7CisJfQorCWlmIChkZXZfZGVzYy0+aWZfdHlwZT09SUZfVFlQRV9JREUpIHsKKwkJcHJpbnRmICgiTW9kZWw6ICVzIEZpcm06ICVzIFNlciM6ICVzXG4iLAorCQkJZGV2X2Rlc2MtPnZlbmRvciwKKwkJCWRldl9kZXNjLT5yZXZpc2lvbiwKKwkJCWRldl9kZXNjLT5wcm9kdWN0KTsKKwl9IGVsc2UgeworCQlwcmludGYgKCJWZW5kb3I6ICVzIFByb2QuOiAlcyBSZXY6ICVzXG4iLAorCQkJZGV2X2Rlc2MtPnZlbmRvciwKKwkJCWRldl9kZXNjLT5wcm9kdWN0LAorCQkJZGV2X2Rlc2MtPnJldmlzaW9uKTsKKwl9CisJcHJpbnRmICgiICAgICAgICAgICAgVHlwZTogIik7CisJc3dpdGNoIChkZXZfZGVzYy0+dHlwZSAmIDB4MUYpIHsKKwkJY2FzZSBERVZfVFlQRV9IQVJERElTSzogcHJpbnRmICgiSGFyZCBEaXNrIik7CisJCQkJCWJyZWFrOworCQljYXNlIERFVl9UWVBFX0NEUk9NOiAJcHJpbnRmICgiQ0QgUk9NIik7CisJCQkJCWJyZWFrOworCQljYXNlIERFVl9UWVBFX09QRElTSzogCXByaW50ZiAoIk9wdGljYWwgRGV2aWNlIik7CisJCQkJCWJyZWFrOworCQljYXNlIERFVl9UWVBFX1RBUEU6IAlwcmludGYgKCJUYXBlIik7CisJCQkJCWJyZWFrOworCQlkZWZhdWx0OgkJcHJpbnRmICgiIyAlMDJYICMiLCBkZXZfZGVzYy0+dHlwZSAmIDB4MUYpOworCQkJCQlicmVhazsKKwl9CisJaWYgKChkZXZfZGVzYy0+bGJhICogZGV2X2Rlc2MtPmJsa3N6KT4wTCkgeworCQl1bG9uZyBtYiwgbWJfcXVvdCwgbWJfcmVtLCBnYiwgZ2JfcXVvdCwgZ2JfcmVtOworCQlsYmFpbnRfdCBsYmE7CisKKwkJbGJhID0gZGV2X2Rlc2MtPmxiYTsKKworCQlsYmE1MTIgPSAobGJhICogKGRldl9kZXNjLT5ibGtzei81MTIpKTsKKwkJbWIgPSAoMTAgKiBsYmE1MTIpIC8gMjA0ODsJLyogMjA0OCA9ICgxMDI0ICogMTAyNCkgLyA1MTIgTUIgKi8KKwkJLyogcm91bmQgdG8gMSBkaWdpdCAqLworCQltYl9xdW90CT0gbWIgLyAxMDsKKwkJbWJfcmVtCT0gbWIgLSAoMTAgKiBtYl9xdW90KTsKKworCQlnYiA9IG1iIC8gMTAyNDsKKwkJZ2JfcXVvdAk9IGdiIC8gMTA7CisJCWdiX3JlbQk9IGdiIC0gKDEwICogZ2JfcXVvdCk7CisjaWZkZWYgQ09ORklHX0xCQTQ4CisJCWlmIChkZXZfZGVzYy0+bGJhNDgpCisJCQlwcmludGYgKCIgICAgICAgICAgICBTdXBwb3J0cyA0OC1iaXQgYWRkcmVzc2luZ1xuIik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENGR182NEJJVF9MQkEpICYmIGRlZmluZWQoQ0ZHXzY0QklUX1ZTUFJJTlRGKQorCQlwcmludGYgKCIgICAgICAgICAgICBDYXBhY2l0eTogJWxkLiVsZCBNQiA9ICVsZC4lbGQgR0IgKCVxZCB4ICVsZClcbiIsCisJCQltYl9xdW90LCBtYl9yZW0sCisJCQlnYl9xdW90LCBnYl9yZW0sCisJCQlsYmEsCisJCQlkZXZfZGVzYy0+Ymxrc3opOworI2Vsc2UKKwkJcHJpbnRmICgiICAgICAgICAgICAgQ2FwYWNpdHk6ICVsZC4lbGQgTUIgPSAlbGQuJWxkIEdCICglbGQgeCAlbGQpXG4iLAorCQkJbWJfcXVvdCwgbWJfcmVtLAorCQkJZ2JfcXVvdCwgZ2JfcmVtLAorCQkJKHVsb25nKWxiYSwKKwkJCWRldl9kZXNjLT5ibGtzeik7CisjZW5kaWYKKwl9IGVsc2UgeworCQlwcmludGYgKCIgICAgICAgICAgICBDYXBhY2l0eTogbm90IGF2YWlsYWJsZVxuIik7CisJfQorfQorI2VuZGlmCS8qIENGR19DTURfSURFIHx8IENGR19DTURfU0NTSSB8fCBDRkdfQ01EX1VTQiB8fCBDT05GSUdfTU1DICovCisKKyNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQl8fCBcCisgICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCXx8IFwKKyAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKQl8fCBcCisgICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01NQykJfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19TWVNURU1BQ0UpICAgICAgICAgICkKKworI2lmIGRlZmluZWQoQ09ORklHX01BQ19QQVJUSVRJT04pIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19ET1NfUEFSVElUSU9OKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfSVNPX1BBUlRJVElPTikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0FNSUdBX1BBUlRJVElPTikKKwordm9pZCBpbml0X3BhcnQgKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYykKK3sKKyNpZmRlZiBDT05GSUdfSVNPX1BBUlRJVElPTgorCWlmICh0ZXN0X3BhcnRfaXNvKGRldl9kZXNjKSA9PSAwKSB7CisJCWRldl9kZXNjLT5wYXJ0X3R5cGUgPSBQQVJUX1RZUEVfSVNPOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgorCWlmICh0ZXN0X3BhcnRfbWFjKGRldl9kZXNjKSA9PSAwKSB7CisJCWRldl9kZXNjLT5wYXJ0X3R5cGUgPSBQQVJUX1RZUEVfTUFDOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgorCWlmICh0ZXN0X3BhcnRfZG9zKGRldl9kZXNjKSA9PSAwKSB7CisJCWRldl9kZXNjLT5wYXJ0X3R5cGUgPSBQQVJUX1RZUEVfRE9TOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQU1JR0FfUEFSVElUSU9OCisJaWYgKHRlc3RfcGFydF9hbWlnYShkZXZfZGVzYykgPT0gMCkgeworCSAgICBkZXZfZGVzYy0+cGFydF90eXBlID0gUEFSVF9UWVBFX0FNSUdBOworCSAgICByZXR1cm47CisJfQorI2VuZGlmCit9CisKKworaW50IGdldF9wYXJ0aXRpb25faW5mbyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKQoreworCQlzd2l0Y2ggKGRldl9kZXNjLT5wYXJ0X3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX01BQzoKKwkJaWYgKGdldF9wYXJ0aXRpb25faW5mb19tYWMoZGV2X2Rlc2MscGFydCxpbmZvKSA9PSAwKSB7CisJCQlQUklOVEYgKCIjIyBWYWxpZCBNQUMgcGFydGl0aW9uIGZvdW5kICMjXG4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfRE9TOgorCQlpZiAoZ2V0X3BhcnRpdGlvbl9pbmZvX2RvcyhkZXZfZGVzYyxwYXJ0LGluZm8pID09IDApIHsKKwkJCVBSSU5URiAoIiMjIFZhbGlkIERPUyBwYXJ0aXRpb24gZm91bmQgIyNcbiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lTT19QQVJUSVRJT04KKwljYXNlIFBBUlRfVFlQRV9JU086CisJCWlmIChnZXRfcGFydGl0aW9uX2luZm9faXNvKGRldl9kZXNjLHBhcnQsaW5mbykgPT0gMCkgeworCQkJUFJJTlRGICgiIyMgVmFsaWQgSVNPIGJvb3QgcGFydGl0aW9uIGZvdW5kICMjXG4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BTUlHQV9QQVJUSVRJT04KKwljYXNlIFBBUlRfVFlQRV9BTUlHQToKKwkgICAgaWYgKGdldF9wYXJ0aXRpb25faW5mb19hbWlnYShkZXZfZGVzYywgcGFydCwgaW5mbykgPT0gMCkKKwkgICAgeworCQlQUklOVEYgKCIjIyBWYWxpZCBBbWlnYSBwYXJ0aXRpb24gZm91bmQgIyNcbiIpOworCQlyZXR1cm4gKDApOworCSAgICB9CisJICAgIGJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAoLTEpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9wYXJ0X2hlYWRlciAoY29uc3QgY2hhciAqdHlwZSwgYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjKQoreworCXN3aXRjaCAoZGV2X2Rlc2MtPmlmX3R5cGUpIHsKKwkJY2FzZSBJRl9UWVBFX0lERTogIAlwcmludGYgKCJJREUiKTsKKwkJCQkJYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9TQ1NJOiAJcHJpbnRmICgiU0NTSSIpOworCQkJCQlicmVhazsKKwkJY2FzZSBJRl9UWVBFX0FUQVBJOglwcmludGYgKCJBVEFQSSIpOworCQkJCQlicmVhazsKKwkJY2FzZSBJRl9UWVBFX1VTQjoJcHJpbnRmICgiVVNCIik7CisJCQkJCWJyZWFrOworCQljYXNlIElGX1RZUEVfRE9DOglwcmludGYgKCJET0MiKTsKKwkJCQkJYnJlYWs7CisJCWRlZmF1bHQ6IAkJcHJpbnRmICgiVU5LTk9XTiIpOworCQkJCQlicmVhazsKKwl9CisJcHJpbnRmICgiIGRldmljZSAlZCAgLS0gICBQYXJ0aXRpb24gVHlwZTogJXNcblxuIiwKKwkJCWRldl9kZXNjLT5kZXYsIHR5cGUpOworfQorCit2b2lkIHByaW50X3BhcnQgKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYykKK3sKKworCQlzd2l0Y2ggKGRldl9kZXNjLT5wYXJ0X3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX01BQzoKKwkJUFJJTlRGICgiIyMgVGVzdGluZyBmb3IgdmFsaWQgTUFDIHBhcnRpdGlvbiAjI1xuIik7CisJCXByaW50X3BhcnRfaGVhZGVyICgiTUFDIiwgZGV2X2Rlc2MpOworCQlwcmludF9wYXJ0X21hYyAoZGV2X2Rlc2MpOworCQlyZXR1cm47CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX0RPUzoKKwkJUFJJTlRGICgiIyMgVGVzdGluZyBmb3IgdmFsaWQgRE9TIHBhcnRpdGlvbiAjI1xuIik7CisJCXByaW50X3BhcnRfaGVhZGVyICgiRE9TIiwgZGV2X2Rlc2MpOworCQlwcmludF9wYXJ0X2RvcyAoZGV2X2Rlc2MpOworCQlyZXR1cm47CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JU09fUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfSVNPOgorCQlQUklOVEYgKCIjIyBUZXN0aW5nIGZvciB2YWxpZCBJU08gQm9vdCBwYXJ0aXRpb24gIyNcbiIpOworCQlwcmludF9wYXJ0X2hlYWRlciAoIklTTyIsIGRldl9kZXNjKTsKKwkJcHJpbnRfcGFydF9pc28gKGRldl9kZXNjKTsKKwkJcmV0dXJuOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQU1JR0FfUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfQU1JR0E6CisJICAgIFBSSU5URiAoIiMjIFRlc3RpbmcgZm9yIGEgdmFsaWQgQW1pZ2EgcGFydGl0aW9uICMjXG4iKTsKKwkgICAgcHJpbnRfcGFydF9oZWFkZXIgKCJBTUlHQSIsIGRldl9kZXNjKTsKKwkgICAgcHJpbnRfcGFydF9hbWlnYSAoZGV2X2Rlc2MpOworCSAgICByZXR1cm47CisjZW5kaWYKKwl9Cit9CisKKworI2Vsc2UJLyogbmVpdGhlciBNQUMgbm9yIERPUyBub3IgSVNPIHBhcnRpdGlvbiBjb25maWd1cmVkICovCisjIGVycm9yIG5laXRoZXIgQ09ORklHX01BQ19QQVJUSVRJT04gbm9yIENPTkZJR19ET1NfUEFSVElUSU9OIG5vciBDT05GSUdfSVNPX1BBUlRJVElPTiBjb25maWd1cmVkIQorI2VuZGlmCisKKyNlbmRpZgkvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpIHx8IENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MGQ5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCkBAIC0wLDAgKzEsOTAgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk6PSAkKG9iailsaWJuYW5kLmEKKworaWZlcSAoJChCT0FSRCksIG9tYXAzNDMwc2RwKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwMzQzMGxhYnJhZG9yKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwM2V2bSkKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgYW0zNTE3ZXZtKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwMjQyMGg0KQorQ09CSlMteQkrPSBrOWsxMjE2Lm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwMjQzMHNkcCkKK0NPQkpTLXkJKz0gazlrMTIxNi5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgb21hcDE3MTBoMykKK0NPQkpTLXkJKz0gazlmNTYxNi5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgZGlhbW9uZCkKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgajQ5KQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBqNDktdXNiLWxvYWRlcikKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCisjIyBEaXNhYmxlZCBmb3Igbm93OgorIyMJICBjczg5MDAubyBjdDY5MDAwLm8gZGF0YWZsYXNoLm8gZGMyMTE0eC5vIGRzMTcyMi5vIFwKKyMjCSAgbGFuOTFjOTYubyBtd19lZXByb20ubyBuYXRzZW1pLm8gXAorIyMJICBzbWM5MTExMS5vIHNtaUx5bnhFTS5vIHNwaV9lZXByb20ubyBzeW01M2M4eHgubyBcCisjIworCitDT0JKUwk6PSAkKENPQkpTLXkpCitTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKKworYWxsOgkkKExJQikKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlmMWcwOHIwYS5jIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWYxZzA4cjBhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmZjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlmMWcwOHIwYS5jCkBAIC0wLDAgKzEsNDI1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqICBTYW1zdW5nIEs5RjFHMDhSMEFRMEMgTkFORCBjaGlwIGRyaXZlciBmb3IgYW4gT01BUDI0MjAgYm9hcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyB1LWJvb3QgZmlsZToKKyAqCWNvbW1vbi9jbWRfbmFuZC5jCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKworI2lmIGRlZmluZWQoQ0ZHX05BTkRfSzlGMUcwOFIwQSkgfHwJXAorICAgIGRlZmluZWQoQ0ZHX05BTkRfSzlGNEcwOFUwQykgfHwJXAorICAgIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KQorCisjZGVmaW5lIEs5RjFHMDhSMEFfTUZSCQkweGVjICAvKiBTYW1zdW5nICovCisjZGVmaW5lIEs5RjFHMDhSMEFfSUQJCTB4YTEgIC8qIHBhcnQgIyAqLworCisjZGVmaW5lIFMzNE1TMDFHMV9NRlIJCTB4MDEgIC8qIFNwYW5zaW9uICovCisjZGVmaW5lIFMzNE1TMDFHMV9JRAkJMHhiYSAgLyogcGFydCAjIC0gMTZiaXQsIDJHQiAqLworCisvKiBTaW5jZSBNaWNyb24gYW5kIFNhbXN1bmcgcGFydHMgYXJlIHNpbWlsYXIgaW4gZ2VvbWV0cnkgYW5kIGJ1cyB3aWR0aAorICogd2UgY2FuIHVzZSB0aGUgc2FtZSBkcml2ZXIuIE5lZWQgdG8gcmV2aXNpdCB0byBtYWtlIHRoaXMgZmlsZSBpbmRlcGVuZGVudAorICogb2YgcGFydC9tYW51ZmFjdHVyZXIKKyAqLworI2RlZmluZSBNVDI5RjFHX01GUgkJMHgyYyAgLyogTWljcm9uICovCisjZGVmaW5lIE1UMjlGMUdfSUQJCTB4YTEgIC8qIHg4LCAxR2lCICovCisjZGVmaW5lIE1UMjlGMkdfSUQJCTB4YmEgIC8qIHgxNiwgMkdpQiAqLworCisjZGVmaW5lIEhZTklYNEdpQl9NRlIJCTB4QUQgIC8qIEh5bml4ICovCisjZGVmaW5lIEhZTklYNEdpQl9JRAkJMHhCQyAgLyogeDE2LCA0R2lCICovCisKKyNkZWZpbmUgQUREUl9DT0xVTU4JCTEKKyNkZWZpbmUgQUREUl9QQUdFCQkyCisjZGVmaW5lIEFERFJfQ09MVU1OX1BBR0UJKEFERFJfQ09MVU1OIHwgQUREUl9QQUdFKQorCisjZGVmaW5lIEFERFJfT09CCQkoMHg0IHwgQUREUl9DT0xVTU5fUEFHRSkKKworI2RlZmluZSBQQUdFX1NJWkUJCTIwNDgKKyNkZWZpbmUgT09CX1NJWkUJCTY0CisjZGVmaW5lIE1BWF9OVU1fUEFHRVMJCTY0CisKKyNkZWZpbmUgRUNDX0NIRUNLX0VOQUJMRQorCisjaWYgQ0ZHX05BTkRfRUNDXzFCSVQKKyNkZWZpbmUgRUNDX1NJWkUJCTI0CisjZGVmaW5lIEVDQ19TVEVQUwkJMworI2RlZmluZSBvbWFwX2VuYWJsZV9od2VjYworI2RlZmluZSBvbWFwX2NvcnJlY3RfZGF0YQorI2RlZmluZSBvbWFwX2NhbGN1bGF0ZV9lY2MKKyNlbGlmIENGR19OQU5EX0VDQ180QklUCisjZGVmaW5lIEVDQ19TSVpFCQkyOCAKKyNkZWZpbmUgRUNDX1NURVBTCQkyOCAKKworZXh0ZXJuIGVuYWJsZV9od2VjY19iY2g0KHVpbnQzMl90IGJ1c193aWR0aCwgaW50MzJfdCBtb2RlKTsKK2V4dGVybiBpbnQgb21hcF9jb3JyZWN0X2RhdGFfYmNoNCh1aW50OF90ICpkYXQsIHVpbnQ4X3QgKnJlYWRfZWNjLCB1aW50OF90ICpjYWxjX2VjYyk7CitleHRlcm4gaW50IG9tYXBfY2FsY3VsYXRlX2VjY19iY2g0KGNvbnN0IHVpbnQ4X3QgKmRhdCwgdWludDhfdCAqZWNjX2NvZGUpOworCisjZGVmaW5lIG9tYXBfZW5hYmxlX2h3ZWNjCW9tYXBfZW5hYmxlX2h3ZWNjX2JjaDQKKyNkZWZpbmUgb21hcF9jb3JyZWN0X2RhdGEJb21hcF9jb3JyZWN0X2RhdGFfYmNoNAorI2RlZmluZSBvbWFwX2NhbGN1bGF0ZV9lY2MJb21hcF9jYWxjdWxhdGVfZWNjX2JjaDQKKyNlbGlmIENGR19OQU5EX0VDQ184QklUCisjZGVmaW5lIEVDQ19TSVpFCQk1MgorI2RlZmluZSBFQ0NfU1RFUFMJCTUyIAorCitleHRlcm4gdm9pZCBvbWFwX2VuYWJsZV9od2VjY19iY2g4KHVpbnQzMl90IGJ1c193aWR0aCwgaW50MzJfdCBtb2RlKTsKK2V4dGVybiBpbnQgb21hcF9jb3JyZWN0X2RhdGFfYmNoOCh1aW50OF90ICpkYXQsIHVpbnQ4X3QgKnJlYWRfZWNjLCB1aW50OF90ICpjYWxjX2VjYyk7CitleHRlcm4gaW50IG9tYXBfY2FsY3VsYXRlX2VjY19iY2g4KGNvbnN0IHVpbnQ4X3QgKmRhdCwgdWludDhfdCAqZWNjX2NvZGUpOworCisjZGVmaW5lIG9tYXBfZW5hYmxlX2h3ZWNjCW9tYXBfZW5hYmxlX2h3ZWNjX2JjaDgKKyNkZWZpbmUgb21hcF9jb3JyZWN0X2RhdGEJb21hcF9jb3JyZWN0X2RhdGFfYmNoOAorI2RlZmluZSBvbWFwX2NhbGN1bGF0ZV9lY2MJb21hcF9jYWxjdWxhdGVfZWNjX2JjaDgKKyNlbHNlCisjZXJyb3IgIk5vbmUgb2YgQ0ZHX05BTkRfRUNDX3sxLDQsOH1CSVQgaXMgZGVmaW5lZC4iCisjZW5kaWYgLyogQ0ZHX05BTkRfRUNDXzFCSVQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkgKHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iCisJCQkJCSAgInN1YnMgJTAsICUwLCAjMVxuIgorCQkJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIgKGxvb3BzKSk7Cit9CisKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcik7CitzdGF0aWMgaW50IG5hbmRfcmVhZF9vb2IodV9jaGFyICogYnVmLCB1bG9uZyBwYWdlX2FkZHIpOworCisjaWZkZWYgQ0ZHX05BTkRfRUNDXzFCSVQKK3N0YXRpYyB1X2NoYXIgZWNjX3Bvc1tdID0KKwkJezQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKKwkJNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LAorCQk1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjN9OworI2VsaWYgQ0ZHX05BTkRfRUNDXzRCSVQKK3N0YXRpYyB1X2NoYXIgZWNjX3Bvc1tdID0KKwkJezM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCAKKwkJNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIAorCQk1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgCisJCTU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzfTsKKyNlbGlmIENGR19OQU5EX0VDQ184QklUCitzdGF0aWMgdV9jaGFyIGVjY19wb3NbXSA9CisJCXsxMiwgMTMsIDE0LAorCQkxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwKKwkJMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsCisJCTI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LAorCQkzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgCisJCTQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCAKKwkJNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIAorCQk1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2M307CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hpcHNpemUgPSAoMjU2IDw8IDIwKTsKKworI2lmZGVmIE5BTkRfMTZCSVQKK3N0YXRpYyBpbnQgYnVzX3dpZHRoID0gMTY7CisjZWxzZQorc3RhdGljIGludCBidXNfd2lkdGggPSA4OworI2VuZGlmCisKKy8qIE5hbkRfQ29tbWFuZDogU2VuZCBhIGZsYXNoIGNvbW1hbmQgdG8gdGhlIGZsYXNoIGNoaXAgKi8KK3N0YXRpYyBpbnQgTmFuRF9Db21tYW5kKHVuc2lnbmVkIGNoYXIgY29tbWFuZCkKK3sKKyAJTkFORF9DVExfU0VUQ0xFKE5BTkRfQUREUik7CisKKyAJV1JJVEVfTkFORF9DT01NQU5EKGNvbW1hbmQsIE5BTkRfQUREUik7CisgCU5BTkRfQ1RMX0NMUkNMRShOQU5EX0FERFIpOworCisgIAlpZihjb21tYW5kID09IE5BTkRfQ01EX1JFU0VUKXsKKwkJdW5zaWduZWQgY2hhciByZXRfdmFsOworCQlOYW5EX0NvbW1hbmQoTkFORF9DTURfU1RBVFVTKTsKKwkJZG97CisJCQlyZXRfdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7Lyogd2FpdCB0aWxsIHJlYWR5ICovCisgIAkJfSB3aGlsZSgocmV0X3ZhbCAmIDB4NDApICE9IDB4NDApOworIAl9CisKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBOYW5EX0FkZHJlc3M6IFNldCB0aGUgY3VycmVudCBhZGRyZXNzIGZvciB0aGUgZmxhc2ggY2hpcCAqLworc3RhdGljIGludCBOYW5EX0FkZHJlc3ModW5zaWduZWQgaW50IG51bWJ5dGVzLCB1bnNpZ25lZCBsb25nIG9mcykKK3sKKwl1Y2hhciB1OworCisgCU5BTkRfQ1RMX1NFVEFMRShOQU5EX0FERFIpOworCisJaWYgKG51bWJ5dGVzID09IEFERFJfQ09MVU1OIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UKKwkJCQl8fCBudW1ieXRlcyA9PSBBRERSX09PQikKKwl7CisJCXVzaG9ydCBjb2wgPSBvZnM7CisKKwkJdSA9IGNvbCAgJiAweGZmOworCQlXUklURV9OQU5EX0FERFJFU1ModSwgTkFORF9BRERSKTsKKworCQl1ID0gKGNvbCA+PiA4KSAmIDB4MDc7CisJCWlmIChudW1ieXRlcyA9PSBBRERSX09PQikKKwkJCXUgPSB1IHwgKChidXNfd2lkdGggPT0gMTYpID8gKDEgPDwgMikgOiAoMSA8PCAzKSk7CisJCVdSSVRFX05BTkRfQUREUkVTUyh1LCBOQU5EX0FERFIpOworCX0KKworCWlmIChudW1ieXRlcyA9PSBBRERSX1BBR0UgfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRQorCQkJCXx8IG51bWJ5dGVzID09IEFERFJfT09CKQorCXsKKwkJdSA9IChvZnMgPj4gMTEpICYgMHhmZjsKKwkJV1JJVEVfTkFORF9BRERSRVNTKHUsIE5BTkRfQUREUik7CisJCXUgPSAob2ZzID4+IDE5KSAmIDB4ZmY7CisJCVdSSVRFX05BTkRfQUREUkVTUyh1LCBOQU5EX0FERFIpOworCisJCS8qIE9uZSBtb3JlIGFkZHJlc3MgY3ljbGUgZm9yIGRldmljZXMgPiAxMjhNaUIgKi8KKwkJaWYgKGNoaXBzaXplID4gKDEyOCA8PCAyMCkpIHsKKwkJCXUgPSAob2ZzID4+IDI3KSAmIDB4ZmY7CisJCQlXUklURV9OQU5EX0FERFJFU1ModSwgTkFORF9BRERSKTsKKwkJfQorCX0KKworIAlOQU5EX0NUTF9DTFJBTEUoTkFORF9BRERSKTsKKworIAlOQU5EX1dBSVRfUkVBRFkoKTsKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBjaGlwIG1mciBhbmQgaWQKKyAqIHJldHVybiAwIGlmIHRoZXkgbWF0Y2ggYm9hcmQgY29uZmlnCisgKiByZXR1cm4gMSBpZiBub3QKKyAqLworaW50IG5hbmRfY2hpcCgpCit7CisJY29uc3QgaW50IHN1cHBvcnRlZCA9IDA7CisJaW50IG1mciwgaWQ7CisKKyAJTkFORF9FTkFCTEVfQ0UoKTsKKworIAlpZiAoTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFU0VUKSkgeworIAkJcHJpbnRmKCJFcnI6IFJFU0VUXG4iKTsKKyAJCU5BTkRfRElTQUJMRV9DRSgpOworCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworCX0KKworIAlpZiAoTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURJRCkpIHsKKyAJCXByaW50ZigiRXJyOiBSRUFESURcbiIpOworIAkJTkFORF9ESVNBQkxFX0NFKCk7CisJCXJldHVybiAoIXN1cHBvcnRlZCk7CisgCX0KKworIAlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU4sIDApOworCisgCW1mciA9IFJFQURfTkFORChOQU5EX0FERFIpOworCWlkID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisKKwlkZWJ1ZygiTkFORDogJXg6JXhcbiIsIG1mciwgaWQpOworCisJTkFORF9ESVNBQkxFX0NFKCk7CisKKwlzd2l0Y2ggKG1mcikgeworCisJY2FzZSBLOUYxRzA4UjBBX01GUjoKKwkJc3dpdGNoIChpZCkgeworCisJCWNhc2UgSzlGMUcwOFIwQV9JRDoJCXJldHVybiAoc3VwcG9ydGVkKTsKKwkJZGVmYXVsdDoJCQkJcmV0dXJuICghc3VwcG9ydGVkKTsKKworCQl9CisJCWJyZWFrOworCisJY2FzZSBNVDI5RjFHX01GUjoKKwkJc3dpdGNoIChpZCkgeworCisJCWNhc2UgTVQyOUYxR19JRDoJCQorCQljYXNlIE1UMjlGMkdfSUQ6CQlyZXR1cm4gKHN1cHBvcnRlZCk7CisJCWRlZmF1bHQ6CQkJCXJldHVybiAoIXN1cHBvcnRlZCk7CisKKwkJfQorCQlicmVhazsKKworCWNhc2UgSFlOSVg0R2lCX01GUjoKKwkJc3dpdGNoIChpZCkgeworCisJCWNhc2UgSFlOSVg0R2lCX0lEOgkJcmV0dXJuIChzdXBwb3J0ZWQpOworCQlkZWZhdWx0OgkJCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworCisJCX0KKwkJYnJlYWs7CisJY2FzZSBTMzRNUzAxRzFfTUZSOgorCQlzd2l0Y2ggKGlkKSB7CisKKwkJY2FzZSBTMzRNUzAxRzFfSUQ6CQlyZXR1cm4gKHN1cHBvcnRlZCk7CisJCWRlZmF1bHQ6CQkJCXJldHVybiAoIXN1cHBvcnRlZCk7CisKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CQkJCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworCisJfQorCisJcmV0dXJuICghc3VwcG9ydGVkKTsKK30KKworLyogcmVhZCBhIGJsb2NrIGRhdGEgdG8gYnVmCisgKiByZXR1cm4gMSBpZiB0aGUgYmxvY2sgaXMgYmFkIG9yIEVDQyBlcnJvciBjYW4ndCBiZSBjb3JyZWN0ZWQgZm9yIGFueSBwYWdlCisgKiByZXR1cm4gMCBvbiBzdWNlc3MKKyAqLworaW50IG5hbmRfcmVhZF9ibG9jayh1bnNpZ25lZCBjaGFyICpidWYsIHVsb25nIGJsb2NrX2FkZHIpCit7CisJaW50IGksIG9mZnNldCA9IDA7CisKKyNpZmRlZiBFQ0NfQ0hFQ0tfRU5BQkxFCisJdTE2IG9vYl9idWZbT09CX1NJWkUgPj4gMV07CisKKwkvKiBjaGVjayBiYWQgYmxvY2sgKi8KKwkvKiAwdGggd29yZCBpbiBzcGFyZSBhcmVhIG5lZWRzIGJlIDB4ZmYgKi8KKwlpZiAobmFuZF9yZWFkX29vYigodW5zaWduZWQgY2hhciAqKW9vYl9idWYsIGJsb2NrX2FkZHIpCisJCXx8IChvb2JfYnVmWzBdICYgMHhmZikgIT0gMHhmZikgeworCQlwcmludGYoIlNraXBwZWQgYmFkIGJsb2NrIGF0IDB4JXhcbiIsIGJsb2NrX2FkZHIpOworCQlyZXR1cm4gTkFORF9SRUFEX1NLSVBQRURfQkFEX0JMT0NLOyAgICAvKiBza2lwIGJhZCBibG9jayAqLworCX0KKyNlbmRpZgorCS8qIHJlYWQgdGhlIGJsb2NrIHBhZ2UgYnkgcGFnZSovCisJZm9yIChpPTA7IGk8TUFYX05VTV9QQUdFUzsgaSsrKXsKKwkJaWYgKG5hbmRfcmVhZF9wYWdlKGJ1ZitvZmZzZXQsIGJsb2NrX2FkZHIgKyBvZmZzZXQpKQorCQkJcmV0dXJuIE5BTkRfUkVBRF9FQ0NfRkFJTFVSRTsKKwkJb2Zmc2V0ICs9IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gTkFORF9SRUFEX1NVQ0NFU1M7Cit9CitzdGF0aWMgaW50IGNvdW50OworLyogcmVhZCBhIHBhZ2Ugd2l0aCBFQ0MgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcikKK3sKKyNpZmRlZiBFQ0NfQ0hFQ0tfRU5BQkxFCisJLyogaW5jcmVhc2VkIHNpemUgb2YgZWNjX2NvZGUgYW5kIGVjY19jYWxjIHRvIG1hdGNoIHRoZSBPT0Igc2l6ZSwgCisJICAgYXMgaXMgZG9uZSBpbiB0aGUga2VybmVsICovCisJdV9jaGFyIGVjY19jb2RlW09PQl9TSVpFXTsKKwl1X2NoYXIgZWNjX2NhbGNbT09CX1NJWkVdOworCXVfY2hhciBvb2JfYnVmW09PQl9TSVpFXTsKKyNlbmRpZgorCXUxNiB2YWw7CisJaW50IGNudHI7CisJaW50IGxlbjsKKworI2lmZGVmIE5BTkRfMTZCSVQKKwl1MTYgKnA7CisjZWxzZQorCXVfY2hhciAqcDsKKyNlbmRpZgorCisJTkFORF9FTkFCTEVfQ0UoKTsKKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRDApOworCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHIpOworCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFEU1RBUlQpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisJLyogQSBkZWxheSBzZWVtcyB0byBiZSBoZWxwaW5nIGhlcmUuIG5lZWRzIG1vcmUgaW52ZXN0aWdhdGlvbiAqLworCWRlbGF5KDEwMDAwKTsKKworCW9tYXBfZW5hYmxlX2h3ZWNjKGJ1c193aWR0aCwgMCk7CisKKwkvKiByZWFkIHRoZSBwYWdlICovCisJbGVuID0gKGJ1c193aWR0aCA9PSAxNikgPyBQQUdFX1NJWkUgPj4gMSA6IFBBR0VfU0laRTsKKwlwID0gKHUxNiAqKWJ1ZjsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgbGVuOyBjbnRyKyspeworCQkqcCsrID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCWRlbGF5KDEwKTsKKyAgIAl9CisKKyNpZmRlZiBFQ0NfQ0hFQ0tfRU5BQkxFCisJb21hcF9jYWxjdWxhdGVfZWNjKGJ1ZiwgJmVjY19jYWxjWzBdKTsKKworCS8qIHJlYWQgdGhlIE9PQiBhcmVhICovCisJcCA9ICh1MTYgKilvb2JfYnVmOworICAgICAgICBsZW4gPSAoYnVzX3dpZHRoID09IDE2KSA/IE9PQl9TSVpFID4+IDEgOiBPT0JfU0laRTsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgbGVuOyBjbnRyKyspeworCQkqcCsrID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCWRlbGF5KDEwKTsKKyAJfQorCWNvdW50ID0gMDsKKyAJTkFORF9ESVNBQkxFX0NFKCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKworCS8qIE5lZWQgdG8gZW5hYmxlIEhXRUNDIGZvciBSRUFESU5HICovCisKKyAJLyogUGljayB0aGUgRUNDIGJ5dGVzIG91dCBvZiB0aGUgb29iIGRhdGEgKi8KKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgRUNDX1NJWkU7IGNudHIrKykKKwkJZWNjX2NvZGVbY250cl0gPSAgb29iX2J1ZltlY2NfcG9zW2NudHJdXTsKKworCWZvcihjb3VudCA9IDA7IGNvdW50IDwgRUNDX1NJWkU7IGNvdW50ICs9IEVDQ19TVEVQUykgeworI2lmIENGR19OQU5EX0VDQ18xQklUCisgCQluYW5kX2NhbGN1bGF0ZV9lY2MgKGJ1ZiwgJmVjY19jYWxjWzBdKTsKKwkJaWYgKG5hbmRfY29ycmVjdF9kYXRhIChidWYsICZlY2NfY29kZVtjb3VudF0sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyNlbHNlCisJCWlmIChvbWFwX2NvcnJlY3RfZGF0YShidWYsICZlY2NfY29kZVtjb3VudF0sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyNlbmRpZgorIAkJCXByaW50ZiAoIkVDQyBGYWlsZWQsIHBhZ2UgMHglMDh4XG4iLCBwYWdlX2FkZHIpOworCQkJZm9yICh2YWw9MDsgdmFsIDwyNTY7IHZhbCsrKQorCQkJCXByaW50ZigiJXggIiwgYnVmW3ZhbF0pOworCQkJcHJpbnRmKCJcbiIpOworICAJCQlyZXR1cm4gMTsKKyAJCX0KKwkJYnVmICs9IDI1NjsKKwkJcGFnZV9hZGRyICs9IDI1NjsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBmcm9tIHRoZSAxNiBieXRlcyBvZiBvb2IgZGF0YSB0aGF0IGNvcnJlc3BvbmQgdG8gYSA1MTIgLyAyMDQ4IGJ5dGUgcGFnZS4KKyAqLworc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpCit7CisJaW50IGNudHI7CisJaW50IGxlbjsKKworI2lmZGVmIE5BTkRfMTZCSVQKKwl1MTYgKnA7CisjZWxzZQorCXVfY2hhciAqcDsKKyNlbmRpZgorCXAgPSAodTE2ICopYnVmOworICAgICAgICBsZW4gPSAoYnVzX3dpZHRoID09IDE2KSA/IE9PQl9TSVpFID4+IDEgOiBPT0JfU0laRTsKKworICAJTkFORF9FTkFCTEVfQ0UoKTsgIC8qIHNldCBwaW4gbG93ICovCisJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQUQwKTsKKyAJTmFuRF9BZGRyZXNzKEFERFJfT09CLCBwYWdlX2FkZHIpOworCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFEU1RBUlQpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisJLyogQSBkZWxheSBzZWVtcyB0byBiZSBoZWxwaW5nIGhlcmUuIG5lZWRzIG1vcmUgaW52ZXN0aWdhdGlvbiAqLworCWRlbGF5KDEwMDAwKTsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgbGVuOyBjbnRyKyspCisJCSpwKysgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKworCU5BTkRfV0FJVF9SRUFEWSgpOworCU5BTkRfRElTQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBoaWdoICovCisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX0s5RjFHMDhSMEEpIHx8CisJCSogZGVmaW5lZChDRkdfTkFORF9LOUY0RzA4VTBDKSB8fAorCQkqIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KQorCQkqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWY1NjE2LmMgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5ZjU2MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGIxNDJiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWY1NjE2LmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogIFNhbXN1bmcgSzlGNTYxNlEwQyBOQU5EIGNoaXAgZHJpdmVyIGZvciBhbiBPTUFQMTZ4eCBib2FyZAorICogCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyB1LWJvb3QgZmlsZToKKyAqCWNvbW1vbi9jbWRfbmFuZC5jCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ0ZHX05BTkRfSzlGNTYxNgorCisjZGVmaW5lIEs5RjU2MTZfTUZSCQkweGVjCisjZGVmaW5lIEs5RjU2MTZfSUQJCTB4NDUKKworI2RlZmluZSBBRERSX0NPTFVNTgkJMSAgICAgICAgICAKKyNkZWZpbmUgQUREUl9QQUdFCQkyICAgICAgICAgICAgIAorI2RlZmluZSBBRERSX0NPTFVNTl9QQUdFCTMKKworI2RlZmluZSBQQUdFX1NJWkUJCTUxMgorCitzdGF0aWMgaW50IG5hbmRfcmVhZF9wYWdlKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpOworc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHVfY2hhciAqIGJ1ZiwgdWxvbmcgcGFnZV9hZGRyKTsKKworLyogSkZGUzIgNTEyLWJ5dGUtcGFnZSBFQ0MgbGF5b3V0ICovCitzdGF0aWMgdV9jaGFyIGVjY19wb3NbXSA9IHswLDEsMiwzLDYsN307CitzdGF0aWMgdV9jaGFyIGVjY3ZhbGlkX3BvcyA9IDQ7CisKKy8qIE5hbkRfQ29tbWFuZDogU2VuZCBhIGZsYXNoIGNvbW1hbmQgdG8gdGhlIGZsYXNoIGNoaXAgKi8KK3N0YXRpYyBpbnQgTmFuRF9Db21tYW5kKHVuc2lnbmVkIGNoYXIgY29tbWFuZCkKK3sKKyAJTkFORF9DVExfU0VUQ0xFKE5BTkRfQUREUik7CisgCVdSSVRFX05BTkRfQ09NTUFORChjb21tYW5kLCBOQU5EX0FERFIpOworIAlOQU5EX0NUTF9DTFJDTEUoTkFORF9BRERSKTsKKworICAJaWYoY29tbWFuZCA9PSBOQU5EX0NNRF9SRVNFVCl7CisJCXVuc2lnbmVkIGNoYXIgcmV0X3ZhbDsKKwkJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1NUQVRVUyk7CisJCWRveworCQkJcmV0X3ZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOy8qIHdhaXQgdGlsbCByZWFkeSAqLworICAJCX0gd2hpbGUoKHJldF92YWwgJiAweDQwKSAhPSAweDQwKTsKKyAJfQorIAkKKyAJTkFORF9XQUlUX1JFQURZKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE5hbkRfQWRkcmVzczogU2V0IHRoZSBjdXJyZW50IGFkZHJlc3MgZm9yIHRoZSBmbGFzaCBjaGlwICovCitzdGF0aWMgaW50IE5hbkRfQWRkcmVzcyhpbnQgbnVtYnl0ZXMsIHVuc2lnbmVkIGxvbmcgb2ZzKQoreworIAlpbnQgaTsKKworIAlOQU5EX0NUTF9TRVRBTEUoTkFORF9BRERSKTsKKyAKKwlpZiAobnVtYnl0ZXMgPT0gQUREUl9DT0xVTU4gfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRSkKKwkJV1JJVEVfTkFORF9BRERSRVNTKG9mcywgTkFORF9BRERSKTsKKworCW9mcyA9IG9mcyA+PiA4OworCisJaWYgKG51bWJ5dGVzID09IEFERFJfUEFHRSB8fCBudW1ieXRlcyA9PSBBRERSX0NPTFVNTl9QQUdFKQorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrLCBvZnMgPSBvZnMgPj4gOCkKKwkJCVdSSVRFX05BTkRfQUREUkVTUyhvZnMsIE5BTkRfQUREUik7CisKKyAJTkFORF9DVExfQ0xSQUxFKE5BTkRfQUREUik7CisKKyAJTkFORF9XQUlUX1JFQURZKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgY2hpcCBtZnIgYW5kIGlkCisgKiByZXR1cm4gMCBpZiB0aGV5IG1hdGNoIGJvYXJkIGNvbmZpZworICogcmV0dXJuIDEgaWYgbm90CisgKi8KK2ludCBuYW5kX2NoaXAoKQoreworCWludCBtZnIsIGlkOworCisgCU5BTkRfRU5BQkxFX0NFKCk7CisKKyAJaWYgKE5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRVNFVCkpIHsKKyAJCXByaW50ZigiRXJyOiBSRVNFVFxuIik7CisgCQlOQU5EX0RJU0FCTEVfQ0UoKTsgICAKKwkJcmV0dXJuIDE7CisJfQorIAorIAlpZiAoTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURJRCkpIHsKKyAJCXByaW50ZigiRXJyOiBSRUFESURcbiIpOworIAkJTkFORF9ESVNBQkxFX0NFKCk7CisJCXJldHVybiAxOworIAl9CisgCisgCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTiwgMCk7CisKKyAJbWZyID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJaWQgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKworCU5BTkRfRElTQUJMRV9DRSgpOworCisgIAlyZXR1cm4gKG1mciAhPSBLOUY1NjE2X01GUiB8fCBpZCAhPSBLOUY1NjE2X0lEKTsKK30KKworLyogcmVhZCBhIGJsb2NrIGRhdGEgdG8gYnVmCisgKiByZXR1cm4gMSBpZiB0aGUgYmxvY2sgaXMgYmFkIG9yIEVDQyBlcnJvciBjYW4ndCBiZSBjb3JyZWN0ZWQgZm9yIGFueSBwYWdlCisgKiByZXR1cm4gMCBvbiBzdWNlc3MKKyAqLyAKK2ludCBuYW5kX3JlYWRfYmxvY2sodW5zaWduZWQgY2hhciAqYnVmLCB1bG9uZyBibG9ja19hZGRyKQoreworCWludCBpLCBvZmZzZXQgPSAwOworCXVjaGFyIG9vYl9idWZbMTZdOworIAkKKwkvKiBjaGVjayBiYWQgYmxvY2sgKi8KKwkvKiAwdGggYW5kIDV0aCB3b3JkcyBuZWVkIGJlIDB4ZmZmZiAqLworCWlmIChuYW5kX3JlYWRfb29iKG9vYl9idWYsIGJsb2NrX2FkZHIpIHx8CisvLwkJb29iX2J1ZlswXSAhPSAweGZmIHx8IG9vYl9idWZbMV0gIT0gMHhmZiB8fAorLy8JCW9vYl9idWZbMTBdICE9IDB4ZmYgfHwgb29iX2J1ZlsxMV0gIT0gMHhmZiApeworCQlvb2JfYnVmWzVdICE9IDB4ZmYpeworCQlwcmludGYoIlNraXBwZWQgYmFkIGJsb2NrIGF0IDB4JXhcbiIsIGJsb2NrX2FkZHIpOworIAkJcmV0dXJuIE5BTkRfUkVBRF9TS0lQUEVEX0JBRF9CTE9DSzsgICAgLyogc2tpcCBiYWQgYmxvY2sgKi8KKwl9CisKKwkvKiByZWFkIHRoZSBibG9jayBwYWdlIGJ5IHBhZ2UqLworCWZvciAoaT0wOyBpPDMyOyBpKyspeworCQlpZiAobmFuZF9yZWFkX3BhZ2UoYnVmK29mZnNldCwgYmxvY2tfYWRkciArIG9mZnNldCkpCisJCQlyZXR1cm4gTkFORF9SRUFEX0VDQ19GQUlMVVJFOworCQlvZmZzZXQgKz0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBOQU5EX1JFQURfU1VDQ0VTUzsKK30KKworLyogcmVhZCBhIHBhZ2Ugd2l0aCBFQ0MgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcikKK3sKKyAJdV9jaGFyIGVjY19jb2RlWzZdOworCXVfY2hhciBlY2NfY2FsY1szXTsKKyAJdV9jaGFyIG9vYl9idWZbMTZdOworCXVfY2hhciAqcDsKKwl1MTYgdmFsOworCWludCBjbnRyOworCisJTkFORF9FTkFCTEVfQ0UoKTsgICAKKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRDApOworCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHI+PjEpOworCisJTkFORF9XQUlUX1JFQURZKCk7CisgCXAgPSBidWY7CisJZm9yIChjbnRyID0gMDsgY250ciA8IDI1NjsgY250cisrKXsKKwkJdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCSpwKysgPSB2YWwgJiAweGZmOworCQkqcCsrID0gdmFsID4+IDg7CisgCX0KKworCXAgPSBvb2JfYnVmOworCWZvciAoY250ciA9IDA7IGNudHIgPCA4OyBjbnRyKyspeworIAkJdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCSpwKysgPSB2YWwgJiAweGZmOworCQkqcCsrID0gdmFsID4+IDg7CisgCX0KKyAJTkFORF9ESVNBQkxFX0NFKCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKworIAkvKiBQaWNrIHRoZSBFQ0MgYnl0ZXMgb3V0IG9mIHRoZSBvb2IgZGF0YSAqLworCWZvciAoY250ciA9IDA7IGNudHIgPCA2OyBjbnRyKyspCisJCWVjY19jb2RlW2NudHJdID0gIG9vYl9idWZbZWNjX3Bvc1tjbnRyXV07CisKKworCWlmICgob29iX2J1ZltlY2N2YWxpZF9wb3NdICYgMHgwZikgIT0gMHgwZikgeworIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmLCAmZWNjX2NvZGVbMF0sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKTsKKyAgCQkJcmV0dXJuIDE7CisgCQl9CisJfQorCQorCWlmICgob29iX2J1ZltlY2N2YWxpZF9wb3NdICYgMHhmMCkgIT0gMHhmMCkgeworIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYgKyAyNTYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmICsgMjU2LCAmZWNjX2NvZGVbM10sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKzB4MTAwKTsKKyAgCQkJcmV0dXJuIDE7CisgCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgZnJvbSB0aGUgMTYgYnl0ZXMgb2Ygb29iIGRhdGEgdGhhdCBjb3JyZXNwb25kIHRvIGEgNTEyIGJ5dGUgcGFnZS4KKyAqLworc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpCit7CisJdTE2IHZhbDsKKwlpbnQgY250cjsKKyAgICAJCisgIAlOQU5EX0VOQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBsb3cgKi8KKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRE9PQik7CisgCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHI+PjEpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisJZm9yIChjbnRyID0gMDsgY250ciA8IDg7IGNudHIrKyl7CisJCXZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOworCQkqYnVmKysgPSB2YWwgJiAweGZmOworCQkqYnVmKysgPSB2YWwgPj4gODsKKyAgCX0KKworCU5BTkRfV0FJVF9SRUFEWSgpOworCU5BTkRfRElTQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBoaWdoICovCisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5azEyMTYuYyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlrMTIxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZTMwNWQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5azEyMTYuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiAgU2Ftc3VuZyBLOUsxMjE2UTBDIE5BTkQgY2hpcCBkcml2ZXIgZm9yIGFuIE9NQVAyNDIwIGJvYXJkCisgKiAKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHUtYm9vdCBmaWxlOgorICoJY29tbW9uL2NtZF9uYW5kLmMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfTkFORF9LOUsxMjE2CisKKyNkZWZpbmUgSzlLMTIxNl9NRlIJCTB4ZWMKKyNkZWZpbmUgSzlLMTIxNl9JRAkJMHg0NgorCisjZGVmaW5lIEFERFJfQ09MVU1OCQkxICAgICAgICAgIAorI2RlZmluZSBBRERSX1BBR0UJCTIgICAgICAgICAgICAgCisjZGVmaW5lIEFERFJfQ09MVU1OX1BBR0UJMworCisjZGVmaW5lIFBBR0VfU0laRQkJNTEyCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSAodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIKKwkJCQkJICAic3VicyAlMCwgJTEsICMxXG4iCisJCQkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIiAobG9vcHMpKTsKK30KKworc3RhdGljIGludCBuYW5kX3JlYWRfcGFnZSh1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKTsKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX29vYih1X2NoYXIgKiBidWYsIHVsb25nIHBhZ2VfYWRkcik7CisKKy8qIEpGRlMyIDUxMi1ieXRlLXBhZ2UgRUNDIGxheW91dCAqLworc3RhdGljIHVfY2hhciBlY2NfcG9zW10gPSB7MCwxLDIsMyw2LDd9Oworc3RhdGljIHVfY2hhciBlY2N2YWxpZF9wb3MgPSA0OworCisvKiBOYW5EX0NvbW1hbmQ6IFNlbmQgYSBmbGFzaCBjb21tYW5kIHRvIHRoZSBmbGFzaCBjaGlwICovCitzdGF0aWMgaW50IE5hbkRfQ29tbWFuZCh1bnNpZ25lZCBjaGFyIGNvbW1hbmQpCit7CisgCU5BTkRfQ1RMX1NFVENMRShOQU5EX0FERFIpOworIAlXUklURV9OQU5EX0NPTU1BTkQoY29tbWFuZCwgTkFORF9BRERSKTsKKyAJTkFORF9DVExfQ0xSQ0xFKE5BTkRfQUREUik7CisKKyAgCWlmKGNvbW1hbmQgPT0gTkFORF9DTURfUkVTRVQpeworCQl1bnNpZ25lZCBjaGFyIHJldF92YWw7CisJCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9TVEFUVVMpOworCQlkb3sKKwkJCXJldF92YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsvKiB3YWl0IHRpbGwgcmVhZHkgKi8KKyAgCQl9IHdoaWxlKChyZXRfdmFsICYgMHg0MCkgIT0gMHg0MCk7CisgCX0KKyAJCisgCU5BTkRfV0FJVF9SRUFEWSgpOworCXJldHVybiAwOworfQorCisvKiBOYW5EX0FkZHJlc3M6IFNldCB0aGUgY3VycmVudCBhZGRyZXNzIGZvciB0aGUgZmxhc2ggY2hpcCAqLworc3RhdGljIGludCBOYW5EX0FkZHJlc3MoaW50IG51bWJ5dGVzLCB1bnNpZ25lZCBsb25nIG9mcykKK3sKKyAJaW50IGk7CisKKyAJTkFORF9DVExfU0VUQUxFKE5BTkRfQUREUik7CisgCisJaWYgKG51bWJ5dGVzID09IEFERFJfQ09MVU1OIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UpCisJCVdSSVRFX05BTkRfQUREUkVTUyhvZnMsIE5BTkRfQUREUik7CisKKwlvZnMgPSBvZnMgPj4gOTsKKworCWlmIChudW1ieXRlcyA9PSBBRERSX1BBR0UgfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRSkKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKywgb2ZzID0gb2ZzID4+IDgpCisJCQlXUklURV9OQU5EX0FERFJFU1Mob2ZzLCBOQU5EX0FERFIpOworCisgCU5BTkRfQ1RMX0NMUkFMRShOQU5EX0FERFIpOworCisgCU5BTkRfV0FJVF9SRUFEWSgpOworCXJldHVybiAwOworfQorCisvKiByZWFkIGNoaXAgbWZyIGFuZCBpZAorICogcmV0dXJuIDAgaWYgdGhleSBtYXRjaCBib2FyZCBjb25maWcKKyAqIHJldHVybiAxIGlmIG5vdAorICovCitpbnQgbmFuZF9jaGlwKCkKK3sKKwlpbnQgbWZyLCBpZDsKKworIAlOQU5EX0VOQUJMRV9DRSgpOworCisgCWlmIChOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVTRVQpKSB7CisgCQlwcmludGYoIkVycjogUkVTRVRcbiIpOworIAkJTkFORF9ESVNBQkxFX0NFKCk7ICAgCisJCXJldHVybiAxOworCX0KKyAKKyAJaWYgKE5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFESUQpKSB7CisgCQlwcmludGYoIkVycjogUkVBRElEXG4iKTsKKyAJCU5BTkRfRElTQUJMRV9DRSgpOworCQlyZXR1cm4gMTsKKyAJfQorIAorIAlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU4sIDApOworCisgCW1mciA9IFJFQURfTkFORChOQU5EX0FERFIpOworCWlkID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisKKwlOQU5EX0RJU0FCTEVfQ0UoKTsKKworICAJcmV0dXJuIChtZnIgIT0gSzlLMTIxNl9NRlIgfHwgaWQgIT0gSzlLMTIxNl9JRCk7Cit9CisKKy8qIHJlYWQgYSBibG9jayBkYXRhIHRvIGJ1ZgorICogcmV0dXJuIDEgaWYgdGhlIGJsb2NrIGlzIGJhZCBvciBFQ0MgZXJyb3IgY2FuJ3QgYmUgY29ycmVjdGVkIGZvciBhbnkgcGFnZQorICogcmV0dXJuIDAgb24gc3VjZXNzCisgKi8gCitpbnQgbmFuZF9yZWFkX2Jsb2NrKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWxvbmcgYmxvY2tfYWRkcikKK3sKKwlpbnQgaSwgb2Zmc2V0ID0gMDsKKwl1Y2hhciBvb2JfYnVmWzE2XTsKKyAJCisJLyogY2hlY2sgYmFkIGJsb2NrICovCisJLyogMHRoIGFuZCA1dGggd29yZHMgbmVlZCBiZSAweGZmZmYgKi8KKwlpZiAobmFuZF9yZWFkX29vYihvb2JfYnVmLCBibG9ja19hZGRyKSB8fAorLy8JCW9vYl9idWZbMF0gIT0gMHhmZiB8fCBvb2JfYnVmWzFdICE9IDB4ZmYgfHwKKy8vCQlvb2JfYnVmWzEwXSAhPSAweGZmIHx8IG9vYl9idWZbMTFdICE9IDB4ZmYgKXsKKwkJb29iX2J1Zls1XSAhPSAweGZmKXsKKwkJcHJpbnRmKCJTa2lwcGVkIGJhZCBibG9jayBhdCAweCV4XG4iLCBibG9ja19hZGRyKTsKKyAJCXJldHVybiBOQU5EX1JFQURfU0tJUFBFRF9CQURfQkxPQ0s7ICAgIC8qIHNraXAgYmFkIGJsb2NrICovCisJfQorCisJLyogcmVhZCB0aGUgYmxvY2sgcGFnZSBieSBwYWdlKi8KKwlmb3IgKGk9MDsgaTwzMjsgaSsrKXsKKwkJaWYgKG5hbmRfcmVhZF9wYWdlKGJ1ZitvZmZzZXQsIGJsb2NrX2FkZHIgKyBvZmZzZXQpKQorCQkJcmV0dXJuIE5BTkRfUkVBRF9FQ0NfRkFJTFVSRTsKKwkJb2Zmc2V0ICs9IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gTkFORF9SRUFEX1NVQ0NFU1M7Cit9CitzdGF0aWMgY291bnQgPSAwOworLyogcmVhZCBhIHBhZ2Ugd2l0aCBFQ0MgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcikKK3sKKyAJdV9jaGFyIGVjY19jb2RlWzZdOworCXVfY2hhciBlY2NfY2FsY1szXTsKKyAJdV9jaGFyIG9vYl9idWZbMTZdOworCXVfY2hhciAqcDsKKwl1MTYgdmFsOworCWludCBjbnRyOworCisJTkFORF9FTkFCTEVfQ0UoKTsgICAKKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRDApOworCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHIpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisJZGVsYXkoNTAwKTsgLyogd2UgZ28gdGhyb3VnaCBORkMgbmVlZCBhIGJpZ2dlciBkZWxheS4gMjAwIGlzIG5vdCBlbm91Z2ggKi8KKyAKKyAgCXAgPSBidWY7CisJZm9yIChjbnRyID0gMDsgY250ciA8IDI1NjsgY250cisrKXsKKwkJdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisgCQkqcCsrID0gdmFsICYgMHhmZjsKKyAJCSpwKysgPSB2YWwgPj4gODsKKyAgIAl9CisKKwlwID0gb29iX2J1ZjsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgODsgY250cisrKXsKKyAJCXZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOworCQkqcCsrID0gdmFsICYgMHhmZjsKKwkJKnArKyA9IHZhbCA+PiA4OworIAl9CisJY291bnQgPSAxOworIAlOQU5EX0RJU0FCTEVfQ0UoKTsgIC8qIHNldCBwaW4gaGlnaCAqLworCisgCS8qIFBpY2sgdGhlIEVDQyBieXRlcyBvdXQgb2YgdGhlIG9vYiBkYXRhICovCisJZm9yIChjbnRyID0gMDsgY250ciA8IDY7IGNudHIrKykKKwkJZWNjX2NvZGVbY250cl0gPSAgb29iX2J1ZltlY2NfcG9zW2NudHJdXTsKKworCWlmICgob29iX2J1ZltlY2N2YWxpZF9wb3NdICYgMHgwZikgIT0gMHgwZikgeworIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmLCAmZWNjX2NvZGVbMF0sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKTsKKwkJCWZvciAodmFsPTA7IHZhbCA8MjU2OyB2YWwrKykKKwkJCQlwcmludGYoIiV4ICIsIGJ1Zlt2YWxdKTsKKwkJCXByaW50ZigiXG4iKTsKKyAgCQkJcmV0dXJuIDE7CisgCQl9CisJfQorCQorCWlmICgob29iX2J1ZltlY2N2YWxpZF9wb3NdICYgMHhmMCkgIT0gMHhmMCkgeworIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYgKyAyNTYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmICsgMjU2LCAmZWNjX2NvZGVbM10sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKzB4MTAwKTsKKwkJCWZvciAodmFsPTA7IHZhbCA8MjU2OyB2YWwrKykKKwkJCQlwcmludGYoIiV4ICIsIGJ1Zlt2YWwrMjU2XSk7CisJCQlwcmludGYoIlxuIik7CisgIAkJCXJldHVybiAxOworIAkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiByZWFkIGZyb20gdGhlIDE2IGJ5dGVzIG9mIG9vYiBkYXRhIHRoYXQgY29ycmVzcG9uZCB0byBhIDUxMiBieXRlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX29vYih1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKQoreworCXUxNiB2YWw7CisJaW50IGNudHI7CisgICAgCQorICAJTkFORF9FTkFCTEVfQ0UoKTsgIC8qIHNldCBwaW4gbG93ICovCisJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURPT0IpOworIAlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU5fUEFHRSwgcGFnZV9hZGRyKTsKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKworLyoJZG8geworCQkqKHZvbGF0aWxlIHUzMiAqKSgweDY4MDBBMDdjKSA9IE5BTkRfQ01EX1NUQVRVUzsKKwkgIHZhbCA9ICoodm9sYXRpbGUgdTMyICopKDB4NjgwMEEwODQpOworCSAgcHJpbnRmKCJ2YWwgPSAleFxuIiwgdmFsKTsJCisJfSB3aGlsZSAoKHZhbCAmIDB4NDApICE9IDB4NDApOworKi8KKwkvKiB0aGUgYWJvdmUgY29kZSBmcm9tIE9TVEJvb3QgZG9lc24ndCB3b3JrLCB3ZSB1c2UgZGVsYXkgKi8KKwlkZWxheSg1MDApOyAvKiB3ZSBnbyB0aHJvdWdoIE5GQyBuZWVkIGEgYmlnZ2VyIGRlbGF5LiAyMDAgaXMgbm90IGVub3VnaCAqLworIAorCWZvciAoY250ciA9IDA7IGNudHIgPCA4OyBjbnRyKyspeworCQl2YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKwkJKmJ1ZisrID0gdmFsICYgMHhmZjsKKwkJKmJ1ZisrID0gdmFsID4+IDg7CisgIAl9CisgIAorCU5BTkRfV0FJVF9SRUFEWSgpOworCU5BTkRfRElTQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBoaWdoICovCisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzYxOTVjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ1IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IFNhbXN1bmcgRWxlY3Ryb25pY3MuCisjIEt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk6PSAkKG9iailsaWJvbmVuYW5kLmEKKworQ09CSlMteQk6PSBvbmVuYW5kLm8KKworQ09CSlMJOj0gJChDT0JKUy15KQorU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChMSUIpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kLmMgYi94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTNmNzA2Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kLmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDUgU2Ftc3VuZyBFbGVjdHJvbmlzCisgKiBLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKworI2luY2x1ZGUgIm9uZW5hbmRfcmVncy5oIgorCisjaWYgZGVmaW5lZChDRkdfTU1DX09ORU5BTkQpIHx8IGRlZmluZWQoQ0ZHX0dQTUNfT05FTkFORCkKKyNkZWZpbmUgb25lbmFuZF9yZWFkdyhhKQkoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShhKSkKKyNkZWZpbmUgb25lbmFuZF93cml0ZXcodiwgYSkJKCgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKGEpKSA9ICh1MTYpICh2KSkKKworI2RlZmluZSBTQU1TVU5HX01GUl9JRAkJMHhFQworI2RlZmluZSBLRk0xRzE2UTJBX0RFVl9JRAkweDMwCisjZGVmaW5lIEtGTjJHMTZRMkFfREVWX0lECTB4NDAKKworCisjZGVmaW5lIFRISVNfT05FTkFORChhKQkJKE9ORU5BTkRfQUREUiArIChhKSkKKworI2RlZmluZSBSRUFEX0lOVEVSUlVQVCgpCQkJCQkJXAorCW9uZW5hbmRfcmVhZHcoVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0lOVEVSUlVQVCkpCisKKyNkZWZpbmUgUkVBRF9DVFJMX1NUQVRVUygpCQkJCQkJXAorCW9uZW5hbmRfcmVhZHcoVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0NUUkxfU1RBVFVTKSkKKworI2RlZmluZSBSRUFEX0VDQ19TVEFUVVMoKQkJCQkJCVwKKwlvbmVuYW5kX3JlYWR3KFRISVNfT05FTkFORChPTkVOQU5EX1JFR19FQ0NfU1RBVFVTKSkKKwkKKyNkZWZpbmUgU0VUX0VNSUZTX0NTX0NPTkZJRyh2KQkJCQkJXAorCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoT01BUF9FTUlGU19DU19DT05GSUcpID0gKHYpKQorCisjZGVmaW5lIG9uZW5hbmRfYmxvY2tfYWRkcmVzcyhibG9jaykJCShibG9jaykKKyNkZWZpbmUgb25lbmFuZF9zZWN0b3JfYWRkcmVzcyhwYWdlKQkJKHBhZ2UgPDwgMikKKyNkZWZpbmUgb25lbmFuZF9idWZmZXJfYWRkcmVzcygpCQkoKDEgPDwgMykgPDwgOCkKKyNkZWZpbmUgb25lbmFuZF9idWZmZXJyYW1fYWRkcmVzcyhibG9jaykJKDApCisKKyNpZiBkZWZpbmVkKENGR19TWU5DX0JVUlNUX1JFQUQpICYmIGRlZmluZWQoQ09ORklHX09NQVAxNjEwKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9zeW5jX2J1cnN0X3JlYWQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJdmFsdWUgPSAwCisJCXwgKDB4MSA8PCAxNSkJCS8qIFJlYWQgTW9kZTogU3luY2hyb25vdXMgKi8KKwkJfCAoMHg0IDw8IDEyKQkJLyogQnVyc3QgUmVhZCBMYXRlbmN5OiA0IGN5Y2xlcyAqLworCQl8ICgweDQgPDwgOSkJCS8qIEJ1cnN0IExlbmd0aDogOCB3b3JkICovCisJCXwgKDB4MSA8PCA3KQkJLyogUkRZIHNpZ25hbCBwbGFyaXR5ICovCisJCXwgKDB4MSA8PCA2KQkJLyogSU5UIHNpZ25hbCBwbGFyaXR5ICovCisJCXwgKDB4MSA8PCA1KQkJLyogSS9PIGJ1ZmZlciBlbmFibGUgKi8KKwkJOworCW9uZW5hbmRfd3JpdGV3KHZhbHVlLCBUSElTX09ORU5BTkQoT05FTkFORF9SRUdfU1lTX0NGRzEpKTsKKworCXZhbHVlID0gMAorCQl8ICg0IDw8IDE2KQkJLyogU3luY2hyb25vdXMgQnVyc3QgUmVhZCAqLworCQl8ICgxIDw8IDEyKQkJLyogUEdXU1QvV0VMRU4gKi8KKwkJfCAoMSA8PCA4KQkJLyogV1JXU1QgKi8KKwkJfCAoNCA8PCA0KQkJLyogUkRXU1QgKi8KKwkJfCAoMSA8PCAwKQkJLyogRkNMS0RJViA9PiA0OE1IeiAqLworCQk7CisJU0VUX0VNSUZTX0NTX0NPTkZJRyh2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYXN5bmNfcmVhZCh2b2lkKQoreworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl2YWx1ZSA9IDAKKwkJfCAoMHgwIDw8IDE1KQkJLyogUmVhZCBNb2RlOiBBc3luY2hyb25vdXMgKi8KKwkJfCAoMHg0IDw8IDEyKQkJLyogQnVyc3QgUmVhZCBMYXRlbmN5OiA0IGN5Y2xlcyAqLworCQl8ICgweDAgPDwgOSkJCS8qIEJ1cnN0IExlbmd0aDogY29udGludW91cyAqLworCQl8ICgweDEgPDwgNykJCS8qIFJEWSBzaWduYWwgcGxhcml0eSAqLworCQl8ICgweDEgPDwgNikJCS8qIElOVCBzaWduYWwgcGxhcml0eSAqLworCQl8ICgweDAgPDwgNSkJCS8qIEkvTyBidWZmZXIgZGlzYWJsZSAqLworCQk7CisJb25lbmFuZF93cml0ZXcodmFsdWUsIFRISVNfT05FTkFORChPTkVOQU5EX1JFR19TWVNfQ0ZHMSkpOworCisJdmFsdWUgPSAwCisJCXwgKDAgPDwgMTYpCQkvKiBBc3luY2hyb25vdXMgUmVhZCAqLworCQl8ICgxIDw8IDEyKQkJLyogUEdXU1QvV0VMRU4gKi8KKwkJfCAoMSA8PCA4KQkJLyogV1JXU1QgKi8KKwkJfCAoMyA8PCA0KQkJLyogUkRXU1QgKi8KKwkJfCAoMSA8PCAwKQkJLyogRkNMS0RJViA9PiA0OE1IeiAqLworCQk7CisJU0VUX0VNSUZTX0NTX0NPTkZJRyh2YWx1ZSk7Cit9CisjZWxzZQorI2RlZmluZSBzZXRfc3luY19idXJzdF9yZWFkKC4uLikJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzZXRfYXN5bmNfcmVhZCguLi4pCQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworaW50CitvbmVuYW5kX2NoaXAoKQoreworCXVuc2lnbmVkIHNob3J0IG1mX2lkLCBkZXZfaWQ7CisJbWZfaWQgPSAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShUSElTX09ORU5BTkQoT05FTkFORF9SRUdfTUFOVUZBQ1RVUkVSX0lEKSkpOworCWRldl9pZCA9ICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKFRISVNfT05FTkFORChPTkVOQU5EX1JFR19ERVZJQ0VfSUQpKSk7CisKKwlpZihtZl9pZCA9PSBTQU1TVU5HX01GUl9JRCkgeworCQlpZiAoZGV2X2lkID09IEtGTTFHMTZRMkFfREVWX0lEKSB7CisJCXByaW50ZigiRGV0ZWN0ZWQgU2Ftc3VuZyBNdXhPbmVOQU5EMUcgRmxhc2ggXHJcbiIpOworCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChkZXZfaWQgPT0gS0ZOMkcxNlEyQV9ERVZfSUQpIHsKKwkJCXByaW50ZigiRGV0ZWN0ZWQgU2Ftc3VuZyBNdXhPbmVOQU5EMkcgRmxhc2ggXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiBPTkVOQU5EIEZsYXNoIHVuc3VwcG9ydGVkXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGYoIk9ORU5BTkQgRmxhc2ggVW5zdXBwb3J0ZWRcclxuIik7CisJCXJldHVybiAxOworCX0KK30KKworLyogcmVhZCBhIHBhZ2Ugd2l0aCBFQ0MgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9uZW5hbmRfcmVhZF9wYWdlKHVsb25nIGJsb2NrLCB1bG9uZyBwYWdlLCB1X2NoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nICpiYXNlOworCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTUNQWTMyCisJdW5zaWduZWQgaW50IG9mZnNldCwgdmFsdWU7CisJdW5zaWduZWQgbG9uZyAqcDsKKwl1bnNpZ25lZCBpbnQgY3RybCwgZWNjOworCXVuc2lnbmVkIHNob3J0IGJibWFya2VyOworI2VuZGlmCisKKwlvbmVuYW5kX3dyaXRldyhvbmVuYW5kX2Jsb2NrX2FkZHJlc3MoYmxvY2spLAorCQlUSElTX09ORU5BTkQoT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzEpKTsKKworCW9uZW5hbmRfd3JpdGV3KG9uZW5hbmRfc2VjdG9yX2FkZHJlc3MocGFnZSksCisJCVRISVNfT05FTkFORChPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTOCkpOworCisJb25lbmFuZF93cml0ZXcob25lbmFuZF9idWZmZXJfYWRkcmVzcygpLAorCQlUSElTX09ORU5BTkQoT05FTkFORF9SRUdfU1RBUlRfQlVGRkVSKSk7CisKKwlvbmVuYW5kX3dyaXRldyhvbmVuYW5kX2J1ZmZlcnJhbV9hZGRyZXNzKGJsb2NrKSwKKwkJVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MyKSk7CisKKwlvbmVuYW5kX3dyaXRldyhPTkVOQU5EX0lOVF9DTEVBUiwgVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0lOVEVSUlVQVCkpOworCisJb25lbmFuZF93cml0ZXcoT05FTkFORF9DTURfUkVBRCwgVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0NPTU1BTkQpKTsKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DUFkzMgorIAlwID0gKHVuc2lnbmVkIGxvbmcgKikgYnVmOworI2VuZGlmCisJYmFzZSA9ICh1bnNpZ25lZCBsb25nICopIChPTkVOQU5EX0FERFIgKyBPTkVOQU5EX0RBVEFSQU0pOworCisJd2hpbGUgKCEoUkVBRF9JTlRFUlJVUFQoKSAmIE9ORU5BTkRfSU5UX01BU1RFUikpCisJCWNvbnRpbnVlOworCS8qIENoZWNrIGlmIHRoZSBibG9jayBpcyBiYWQuIEJhZCBibG9jayBtYXJrZXJzICAgICovCisJLyogYXJlIHN0b3JlZCBpbiBzcGFyZSBhcmVhIG9mIDFzdCBvciAybmQgcGFnZSAqLworCWlmICgocGFnZSA9PSAwKSB8fCAocGFnZSA9PSAxKSkKKwl7CisJICAgIHVuc2lnbmVkIGxvbmcgKnNwYXJlQXJlYSA9ICh1bnNpZ25lZCBsb25nICopIChPTkVOQU5EX0FERFIgKyBPTkVOQU5EX1NQQVJFUkFNKTsKKwkgICAgYmJtYXJrZXIgPSAqc3BhcmVBcmVhOworICAgICAgICAgICAgLyogZm9yIGJhZCBibG9jayBtYXJrZXJzICovCisgICAgICAgICAgICBpZiAoYmJtYXJrZXIgIT0gMHhGRkZGKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKwl9CisKKwljdHJsID0gUkVBRF9DVFJMX1NUQVRVUygpOworCQorCWlmIChjdHJsICYgT05FTkFORF9DVFJMX0VSUk9SKSB7CisJCWhhbmcoKTsKKwl9CisJCisJaWYgKFJFQURfSU5URVJSVVBUKCkgJiBPTkVOQU5EX0lOVF9SRUFEKSB7CisKKwkJZWNjID0gUkVBRF9FQ0NfU1RBVFVTKCk7CisJCWlmIChlY2MgJiBPTkVOQU5EX0VDQ18yQklUX0FMTCkgeworCQkJaGFuZygpOworCQl9CisJfQorCQorI2lmZGVmIF9fSEFWRV9BUkNIX01FTUNQWTMyCisJLyogMzIgYnl0ZXMgYm91bmRhcnkgbWVtb3J5IGNvcHkgKi8KKwltZW1jcHkzMihidWYsIGJhc2UsIE9ORU5BTkRfUEFHRV9TSVpFKTsKKyNlbHNlCisJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAoT05FTkFORF9QQUdFX1NJWkUgPj4gMik7IG9mZnNldCsrKSB7CisJCXZhbHVlID0gKihiYXNlICsgb2Zmc2V0KTsKKwkJKnArKyA9IHZhbHVlOworIAl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE9ORU5BTkRfU1RBUlRfUEFHRQkJMAorI2RlZmluZSBPTkVOQU5EX1BBR0VTX1BFUl9CTE9DSwkJNjQKKworLyoqCisgKiBvbmVuYW5kX3JlYWRfYmxvY2sgLSBSZWFkIGEgYmxvY2sgZGF0YSB0byBidWYKKyAqIEByZXR1cm4gMCBvbiBzdWNlc3MKKyAqLyAKKworaW50IG9uZW5hbmRfcmVhZF9ibG9jayh1bnNpZ25lZCBjaGFyICpidWYsIHVsb25nIGJsb2NrKQoreworCWludCBwYWdlLCBvZmZzZXQgPSAwOworCisJc2V0X3N5bmNfYnVyc3RfcmVhZCgpOworCisJLyogTk9URTogeW91IG11c3QgcmVhZCBwYWdlIGZyb20gcGFnZSAxIG9mIGJsb2NrIDAgKi8KKwkvKiByZWFkIHRoZSBibG9jayBwYWdlIGJ5IHBhZ2UqLworCWZvciAocGFnZSA9IE9ORU5BTkRfU1RBUlRfUEFHRTsKKwkgICAgcGFnZSA8IE9ORU5BTkRfUEFHRVNfUEVSX0JMT0NLOyBwYWdlKyspIHsKKworCQlpZiAob25lbmFuZF9yZWFkX3BhZ2UoYmxvY2ssIHBhZ2UsIGJ1ZiArIG9mZnNldCkpeworCQkgICAgc2V0X2FzeW5jX3JlYWQoKTsKKwkJICAgIHJldHVybiAxOworCQl9CisKKwkJb2Zmc2V0ICs9IE9ORU5BTkRfUEFHRV9TSVpFOworCX0KKworCXNldF9hc3luY19yZWFkKCk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX01NQ19PTkVOQU5EKSB8fCBkZWZpbmVkKENGR19HUE1DX09ORU5BTkQpICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfcmVncy5oIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGFjYzhjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX3JlZ3MuaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L210ZC9vbmVuYW5kX3JlZ3MuaAorICoKKyAqICBPbmVOQU5EIFJlZ2lzdGVyIGhlYWRlciBmaWxlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fT05FTkFORF9SRUdfSAorI2RlZmluZSBfX09ORU5BTkRfUkVHX0gKKworLyogTWVtb3J5IEFkZHJlc3MgTWFwIFRyYW5zbGF0aW9uIChXb3JkIG9yZGVyKSAqLworI2RlZmluZSBPTkVOQU5EX01FTU9SWV9NQVAoeCkJCSgoeCkgPDwgMSkKKworLyoKKyAqIEV4dGVybmFsIEJ1ZmZlclJBTSBhcmVhCisgKi8KKyNkZWZpbmUJT05FTkFORF9CT09UUkFNCQkJT05FTkFORF9NRU1PUllfTUFQKDB4MDAwMCkKKyNkZWZpbmUJT05FTkFORF9EQVRBUkFNCQkJT05FTkFORF9NRU1PUllfTUFQKDB4MDIwMCkKKyNkZWZpbmUJT05FTkFORF9TUEFSRVJBTQkJT05FTkFORF9NRU1PUllfTUFQKDB4ODAxMCkKKworLyoKKyAqIE9uZU5BTkQgUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgT05FTkFORF9SRUdfTUFOVUZBQ1RVUkVSX0lECU9ORU5BTkRfTUVNT1JZX01BUCgweEYwMDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX0RFVklDRV9JRAkJT05FTkFORF9NRU1PUllfTUFQKDB4RjAwMSkKKyNkZWZpbmUgT05FTkFORF9SRUdfVkVSU0lPTl9JRAkJT05FTkFORF9NRU1PUllfTUFQKDB4RjAwMikKKyNkZWZpbmUgT05FTkFORF9SRUdfREFUQV9CVUZGRVJfU0laRQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDAzKQorI2RlZmluZSBPTkVOQU5EX1JFR19CT09UX0JVRkZFUl9TSVpFCU9ORU5BTkRfTUVNT1JZX01BUCgweEYwMDQpCisjZGVmaW5lIE9ORU5BTkRfUkVHX05VTV9CVUZGRVJTCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDA1KQorI2RlZmluZSBPTkVOQU5EX1JFR19URUNITk9MT0dZCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDA2KQorCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MxCU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MyCU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDEpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MzCU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDIpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M0CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDMpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M1CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDQpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M2CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDUpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M3CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDYpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M4CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDcpCisKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQlVGRkVSCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyMDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX0NPTU1BTkQJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyMjApCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NZU19DRkcxCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjIxKQorI2RlZmluZSBPTkVOQU5EX1JFR19TWVNfQ0ZHMgkJT05FTkFORF9NRU1PUllfTUFQKDB4RjIyMikKKyNkZWZpbmUgT05FTkFORF9SRUdfQ1RSTF9TVEFUVVMJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyNDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX0lOVEVSUlVQVAkJT05FTkFORF9NRU1PUllfTUFQKDB4RjI0MSkKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQkxPQ0tfQUREUkVTUwlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjRDKQorI2RlZmluZSBPTkVOQU5EX1JFR19FTkRfQkxPQ0tfQUREUkVTUwlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjREKQorI2RlZmluZSBPTkVOQU5EX1JFR19XUF9TVEFUVVMJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyNEUpCisKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX1NUQVRVUwkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwMCkKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX00wCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjAxKQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfUzAJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDIpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19NMQkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwMykKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX1MxCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjA0KQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfTTIJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDUpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19TMgkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwNikKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX00zCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjA3KQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfUzMJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDgpCisKKy8qCisgKiBEZXZpY2UgSUQgUmVnaXN0ZXIgRjAwMWggKFIpCisgKi8KKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfREVOU0lUWV9TSElGVAkoNCkKKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfSVNfRERQCQkoMSA8PCAzKQorI2RlZmluZSBPTkVOQU5EX0RFVklDRV9JU19ERU1VWAkJKDEgPDwgMikKKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfVkNDX01BU0sJCSgweDMpCisKKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfREVOU0lUWV81MTJNYgkoMHgwMDIpCisKKy8qCisgKiBWZXJzaW9uIElEIFJlZ2lzdGVyIEYwMDJoIChSKQorICovCisjZGVmaW5lIE9ORU5BTkRfVkVSU0lPTl9QUk9DRVNTX1NISUZUCSg4KQorCisvKgorICogU3RhcnQgQWRkcmVzcyAxIEYxMDBoIChSL1cpCisgKi8KKyNkZWZpbmUgT05FTkFORF9ERFBfU0hJRlQJCSgxNSkKKworLyoKKyAqIFN0YXJ0IEFkZHJlc3MgOCBGMTA3aCAoUi9XKQorICovCisjZGVmaW5lIE9ORU5BTkRfRlBBX01BU0sJCSgweDNmKQorI2RlZmluZSBPTkVOQU5EX0ZQQV9TSElGVAkJKDIpCisjZGVmaW5lIE9ORU5BTkRfRlNBX01BU0sJCSgweDAzKQorCisvKgorICogU3RhcnQgQnVmZmVyIFJlZ2lzdGVyIEYyMDBoIChSL1cpCisgKi8KKyNkZWZpbmUgT05FTkFORF9CU0FfTUFTSwkJKDB4MDMpCisjZGVmaW5lIE9ORU5BTkRfQlNBX1NISUZUCQkoOCkKKyNkZWZpbmUgT05FTkFORF9CU0FfQk9PVFJBTQkJKDAgPDwgMikKKyNkZWZpbmUgT05FTkFORF9CU0FfREFUQVJBTTAJCSgyIDw8IDIpCisjZGVmaW5lIE9ORU5BTkRfQlNBX0RBVEFSQU0xCQkoMyA8PCAyKQorI2RlZmluZSBPTkVOQU5EX0JTQ19NQVNLCQkoMHgwMykKKworLyoKKyAqIENvbW1hbmQgUmVnaXN0ZXIgRjIyMGggKFIvVykKKyAqLworI2RlZmluZSBPTkVOQU5EX0NNRF9SRUFECQkoMHgwMCkKKyNkZWZpbmUgT05FTkFORF9DTURfUkVBRE9PQgkJKDB4MTMpCisjZGVmaW5lIE9ORU5BTkRfQ01EX1BST0cJCSgweDgwKQorI2RlZmluZSBPTkVOQU5EX0NNRF9QUk9HT09CCQkoMHgxQSkKKyNkZWZpbmUgT05FTkFORF9DTURfVU5MT0NLCQkoMHgyMykKKyNkZWZpbmUgT05FTkFORF9DTURfTE9DSwkJKDB4MkEpCisjZGVmaW5lIE9ORU5BTkRfQ01EX0xPQ0tfVElHSFQJCSgweDJDKQorI2RlZmluZSBPTkVOQU5EX0NNRF9FUkFTRQkJKDB4OTQpCisjZGVmaW5lIE9ORU5BTkRfQ01EX1JFU0VUCQkoMHhGMCkKKyNkZWZpbmUgT05FTkFORF9DTURfUkVBRElECQkoMHg5MCkKKworLyogTk9URTogVGhvc2UgYXJlIG5vdCAqUkVBTCogY29tbWFuZHMgKi8KKyNkZWZpbmUgT05FTkFORF9DTURfQlVGRkVSUkFNCQkoMHgxOTc4KQorCisvKgorICogU3lzdGVtIENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciBGMjIxaCAoUiwgUi9XKQorICovCisjZGVmaW5lIE9ORU5BTkRfU1lTX0NGRzFfU1lOQ19SRUFECSgxIDw8IDE1KQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX0JSTAkJKDEyKQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX0JMCQkoOSkKKyNkZWZpbmUgT05FTkFORF9TWVNfQ0ZHMV9OT19FQ0MJCSgxIDw8IDgpCisjZGVmaW5lIE9ORU5BTkRfU1lTX0NGRzFfUkRZCQkoMSA8PCA3KQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX0lOVAkJKDEgPDwgNikKKyNkZWZpbmUgT05FTkFORF9TWVNfQ0ZHMV9JT0JFCQkoMSA8PCA1KQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX1JEWV9DT05GCSgxIDw8IDQpCisKKy8qCisgKiBDb250cm9sbGVyIFN0YXR1cyBSZWdpc3RlciBGMjQwaCAoUikKKyAqLworI2RlZmluZSBPTkVOQU5EX0NUUkxfT05HTwkJKDEgPDwgMTUpCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9MT0NLCQkoMSA8PCAxNCkKKyNkZWZpbmUgT05FTkFORF9DVFJMX0xPQUQJCSgxIDw8IDEzKQorI2RlZmluZSBPTkVOQU5EX0NUUkxfUFJPR1JBTQkJKDEgPDwgMTIpCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9FUkFTRQkJKDEgPDwgMTEpCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9FUlJPUgkJKDEgPDwgMTApCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9SU1RCCQkoMSA8PCA3KQorCisvKgorICogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciBGMjQxaCAoUikKKyAqLworI2RlZmluZSBPTkVOQU5EX0lOVF9NQVNURVIJCSgxIDw8IDE1KQorI2RlZmluZSBPTkVOQU5EX0lOVF9SRUFECQkoMSA8PCA3KQorI2RlZmluZSBPTkVOQU5EX0lOVF9XUklURQkJKDEgPDwgNikKKyNkZWZpbmUgT05FTkFORF9JTlRfRVJBU0UJCSgxIDw8IDUpCisjZGVmaW5lIE9ORU5BTkRfSU5UX1JFU0VUCQkoMSA8PCA0KQorI2RlZmluZSBPTkVOQU5EX0lOVF9DTEVBUgkJKDAgPDwgMCkKKworLyoKKyAqIE5BTkQgRmxhc2ggV3JpdGUgUHJvdGVjdGlvbiBTdGF0dXMgUmVnaXN0ZXIgRjI0RWggKFIpCisgKi8KKyNkZWZpbmUgT05FTkFORF9XUF9VUwkJCSgxIDw8IDIpCisjZGVmaW5lIE9ORU5BTkRfV1BfTFMJCQkoMSA8PCAxKQorI2RlZmluZSBPTkVOQU5EX1dQX0xUUwkJCSgxIDw8IDApCisKKy8qCisgKiBFQ0MgU3RhdHVzIFJlaWdzZXIgRkYwMGggKFIpCisgKi8KKyNkZWZpbmUgT05FTkFORF9FQ0NfMUJJVAkJKDEgPDwgMCkKKyNkZWZpbmUgT05FTkFORF9FQ0NfMkJJVAkJKDEgPDwgMSkKKyNkZWZpbmUgT05FTkFORF9FQ0NfMkJJVF9BTEwJCSgweEFBQUEpCisKKyNlbmRpZgkvKiBfX09ORU5BTkRfUkVHX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvcnRjL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy9ydGMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzMTQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvcnRjL01ha2VmaWxlCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAxLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYnJ0Yy5hCisKK0NPQkpTLXkgKz0gZGF0ZS5vCisKK0NPQkpTCTo9ICQoc29ydCAkKENPQkpTLXkpKQorU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChMSUIpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL3J0Yy9kYXRlLmMgYi94LWxvYWRlci9kcml2ZXJzL3J0Yy9kYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwYWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvcnRjL2RhdGUuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogRGF0ZSAmIFRpbWUgc3VwcG9ydCBmb3IgUGhpbGlwcyBQQ0Y4NTYzIFJUQworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cnRjLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKQorCisjZGVmaW5lIEZFQlJVQVJZCQkyCisjZGVmaW5lCVNUQVJUT0ZUSU1FCQkxOTcwCisjZGVmaW5lIFNFQ0RBWQkJCTg2NDAwTAorI2RlZmluZSBTRUNZUgkJCShTRUNEQVkgKiAzNjUpCisjZGVmaW5lCWxlYXB5ZWFyKHllYXIpCQkoKHllYXIpICUgNCA9PSAwKQorI2RlZmluZQlkYXlzX2luX3llYXIoYSkJCShsZWFweWVhcihhKSA/IDM2NiA6IDM2NSkKKyNkZWZpbmUJZGF5c19pbl9tb250aChhKQkobW9udGhfZGF5c1soYSkgLSAxXSkKKworc3RhdGljIGludCBtb250aF9kYXlzWzEyXSA9IHsKKwkzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCit9OworCisvKgorICogVGhpcyBvbmx5IHdvcmtzIGZvciB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIC0gaS5lLiBhZnRlciAxNzUyIChpbiB0aGUgVUspCisgKi8KK3ZvaWQgR3JlZ29yaWFuRGF5KHN0cnVjdCBydGNfdGltZSAqIHRtKQoreworCWludCBsZWFwc1RvRGF0ZTsKKwlpbnQgbGFzdFllYXI7CisJaW50IGRheTsKKwlpbnQgTW9udGhPZmZzZXRbXSA9IHsgMCwzMSw1OSw5MCwxMjAsMTUxLDE4MSwyMTIsMjQzLDI3MywzMDQsMzM0IH07CisKKwlsYXN0WWVhcj10bS0+dG1feWVhci0xOworCisJLyoKKwkgKiBOdW1iZXIgb2YgbGVhcCBjb3JyZWN0aW9ucyB0byBhcHBseSB1cCB0byBlbmQgb2YgbGFzdCB5ZWFyCisJICovCisJbGVhcHNUb0RhdGUgPSBsYXN0WWVhci80IC0gbGFzdFllYXIvMTAwICsgbGFzdFllYXIvNDAwOworCisJLyoKKwkgKiBUaGlzIHllYXIgaXMgYSBsZWFwIHllYXIgaWYgaXQgaXMgZGl2aXNpYmxlIGJ5IDQgZXhjZXB0IHdoZW4gaXQgaXMKKwkgKiBkaXZpc2libGUgYnkgMTAwIHVubGVzcyBpdCBpcyBkaXZpc2libGUgYnkgNDAwCisJICoKKwkgKiBlLmcuIDE5MDQgd2FzIGEgbGVhcCB5ZWFyLCAxOTAwIHdhcyBub3QsIDE5OTYgaXMsIGFuZCAyMDAwIHdpbGwgYmUKKwkgKi8KKwlpZigodG0tPnRtX3llYXIlND09MCkgJiYKKwkgICAoKHRtLT50bV95ZWFyJTEwMCE9MCkgfHwgKHRtLT50bV95ZWFyJTQwMD09MCkpICYmCisJICAgKHRtLT50bV9tb24+MikpIHsKKwkJLyoKKwkJICogV2UgYXJlIHBhc3QgRmViLiAyOSBpbiBhIGxlYXAgeWVhcgorCQkgKi8KKwkJZGF5PTE7CisJfSBlbHNlIHsKKwkJZGF5PTA7CisJfQorCisJZGF5ICs9IGxhc3RZZWFyKjM2NSArIGxlYXBzVG9EYXRlICsgTW9udGhPZmZzZXRbdG0tPnRtX21vbi0xXSArIHRtLT50bV9tZGF5OworCisJdG0tPnRtX3dkYXk9ZGF5JTc7Cit9CisKK3ZvaWQgdG9fdG0oaW50IHRpbSwgc3RydWN0IHJ0Y190aW1lICogdG0pCit7CisJcmVnaXN0ZXIgaW50ICAgIGk7CisJcmVnaXN0ZXIgbG9uZyAgIGhtcywgZGF5OworCisJZGF5ID0gdGltIC8gU0VDREFZOworCWhtcyA9IHRpbSAlIFNFQ0RBWTsKKworCS8qIEhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIGFyZSBlYXN5ICovCisJdG0tPnRtX2hvdXIgPSBobXMgLyAzNjAwOworCXRtLT50bV9taW4gPSAoaG1zICUgMzYwMCkgLyA2MDsKKwl0bS0+dG1fc2VjID0gKGhtcyAlIDM2MDApICUgNjA7CisKKwkvKiBOdW1iZXIgb2YgeWVhcnMgaW4gZGF5cyAqLworCWZvciAoaSA9IFNUQVJUT0ZUSU1FOyBkYXkgPj0gZGF5c19pbl95ZWFyKGkpOyBpKyspIHsKKwkJZGF5IC09IGRheXNfaW5feWVhcihpKTsKKwl9CisJdG0tPnRtX3llYXIgPSBpOworCisJLyogTnVtYmVyIG9mIG1vbnRocyBpbiBkYXlzIGxlZnQgKi8KKwlpZiAobGVhcHllYXIodG0tPnRtX3llYXIpKSB7CisJCWRheXNfaW5fbW9udGgoRkVCUlVBUlkpID0gMjk7CisJfQorCWZvciAoaSA9IDE7IGRheSA+PSBkYXlzX2luX21vbnRoKGkpOyBpKyspIHsKKwkJZGF5IC09IGRheXNfaW5fbW9udGgoaSk7CisJfQorCWRheXNfaW5fbW9udGgoRkVCUlVBUlkpID0gMjg7CisJdG0tPnRtX21vbiA9IGk7CisKKwkvKiBEYXlzIGFyZSB3aGF0IGlzIGxlZnQgb3ZlciAoKzEpIGZyb20gYWxsIHRoYXQuICovCisJdG0tPnRtX21kYXkgPSBkYXkgKyAxOworCisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIGRheSBvZiB3ZWVrCisJICovCisJR3JlZ29yaWFuRGF5KHRtKTsKK30KKworLyogQ29udmVydHMgR3JlZ29yaWFuIGRhdGUgdG8gc2Vjb25kcyBzaW5jZSAxOTcwLTAxLTAxIDAwOjAwOjAwLgorICogQXNzdW1lcyBpbnB1dCBpbiBub3JtYWwgZGF0ZSBmb3JtYXQsIGkuZS4gMTk4MC0xMi0zMSAyMzo1OTo1OQorICogPT4geWVhcj0xOTgwLCBtb249MTIsIGRheT0zMSwgaG91cj0yMywgbWluPTU5LCBzZWM9NTkuCisgKgorICogW0ZvciB0aGUgSnVsaWFuIGNhbGVuZGFyICh3aGljaCB3YXMgdXNlZCBpbiBSdXNzaWEgYmVmb3JlIDE5MTcsCisgKiBCcml0YWluICYgY29sb25pZXMgYmVmb3JlIDE3NTIsIGFueXdoZXJlIGVsc2UgYmVmb3JlIDE1ODIsCisgKiBhbmQgaXMgc3RpbGwgaW4gdXNlIGJ5IHNvbWUgY29tbXVuaXRpZXMpIGxlYXZlIG91dCB0aGUKKyAqIC15ZWFyLzEwMCt5ZWFyLzQwMCB0ZXJtcywgYW5kIGFkZCAxMC5dCisgKgorICogVGhpcyBhbGdvcml0aG0gd2FzIGZpcnN0IHB1Ymxpc2hlZCBieSBHYXVzcyAoSSB0aGluaykuCisgKgorICogV0FSTklORzogdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJmbG93IG9uIDIxMDYtMDItMDcgMDY6Mjg6MTYgb24KKyAqIG1hY2hpbmVzIHdlcmUgbG9uZyBpcyAzMi1iaXQhIChIb3dldmVyLCBhcyB0aW1lX3QgaXMgc2lnbmVkLCB3ZQorICogd2lsbCBhbHJlYWR5IGdldCBwcm9ibGVtcyBhdCBvdGhlciBwbGFjZXMgb24gMjAzOC0wMS0xOSAwMzoxNDowOCkKKyAqLwordW5zaWduZWQgbG9uZworbWt0aW1lICh1bnNpZ25lZCBpbnQgeWVhciwgdW5zaWduZWQgaW50IG1vbiwKKwl1bnNpZ25lZCBpbnQgZGF5LCB1bnNpZ25lZCBpbnQgaG91ciwKKwl1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgc2VjKQoreworCWlmICgwID49IChpbnQpIChtb24gLT0gMikpIHsJLyogMS4uMTIgLT4gMTEsMTIsMS4uMTAgKi8KKwkJbW9uICs9IDEyOwkJLyogUHV0cyBGZWIgbGFzdCBzaW5jZSBpdCBoYXMgbGVhcCBkYXkgKi8KKwkJeWVhciAtPSAxOworCX0KKworCXJldHVybiAoKCgKKwkJKHVuc2lnbmVkIGxvbmcpICh5ZWFyLzQgLSB5ZWFyLzEwMCArIHllYXIvNDAwICsgMzY3Km1vbi8xMiArIGRheSkgKworCQkJeWVhciozNjUgLSA3MTk0OTkKKwkgICAgKSoyNCArIGhvdXIgLyogbm93IGhhdmUgaG91cnMgKi8KKwkgICkqNjAgKyBtaW4gLyogbm93IGhhdmUgbWludXRlcyAqLworCSkqNjAgKyBzZWM7IC8qIGZpbmFsbHkgc2Vjb25kcyAqLworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4NGJlNAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2LTIwMDkKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCTo9ICQob2JqKWxpYnNlcmlhbC5hCisKK0NPQkpTLXkgKz0gbnMxNjU1MC5vCitDT0JKUy15ICs9IHNlcmlhbC5vCisKK0NPQkpTCTo9ICQoc29ydCAkKENPQkpTLXkpKQorU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChMSUIpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9uczE2NTUwLmMgYi94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9uczE2NTUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhNWMxMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL25zMTY1NTAuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICogIAorICogQ09NMSBOUzE2NTUwIHN1cHBvcnQKKyAqIG9yaWdpbmFsbHkgZnJvbSBsaW51eCBzb3VyY2UgKGFyY2gvcHBjL2Jvb3QvbnMxNjU1MC5jKQorICogbW9kaWZpZWQgdG8gdXNlIENGR19JU0FfTUVNIGFuZCBuZXcgZGVmaW5lcworICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmZGVmIENGR19QUklOVEYKKyNpZmRlZiBDRkdfTlMxNjU1MAorCisjaW5jbHVkZSA8bnMxNjU1MC5oPgorCisjZGVmaW5lIExDUlZBTCBMQ1JfOE4xCQkJCQkvKiA4IGRhdGEsIDEgc3RvcCwgbm8gcGFyaXR5ICovCisjZGVmaW5lIE1DUlZBTCAoTUNSX0RUUiB8IE1DUl9SVFMpCQkJLyogUlRTL0RUUiAqLworI2RlZmluZSBGQ1JWQUwgKEZDUl9GSUZPX0VOIHwgRkNSX1JYU1IgfCBGQ1JfVFhTUikJLyogQ2xlYXIgJiBlbmFibGUgRklGT3MgKi8KKwordm9pZCBOUzE2NTUwX2luaXQgKE5TMTY1NTBfdCBjb21fcG9ydCwgaW50IGJhdWRfZGl2aXNvcikKK3sKKwljb21fcG9ydC0+aWVyID0gMHgwMDsKKyNpZmRlZiBDT05GSUdfT01BUAorCWNvbV9wb3J0LT5tZHIxID0gMHg3OyAgIC8qIG1vZGUgc2VsZWN0IHJlc2V0IFRMMTZDNzUwKi8KKyNlbmRpZgorCWNvbV9wb3J0LT5sY3IgPSBMQ1JfQktTRSB8IExDUlZBTDsKKwljb21fcG9ydC0+ZGxsID0gYmF1ZF9kaXZpc29yICYgMHhmZjsKKwljb21fcG9ydC0+ZGxtID0gKGJhdWRfZGl2aXNvciA+PiA4KSAmIDB4ZmY7CisJY29tX3BvcnQtPmxjciA9IExDUlZBTDsKKwljb21fcG9ydC0+bWNyID0gTUNSVkFMOworCWNvbV9wb3J0LT5mY3IgPSBGQ1JWQUw7CisjaWYgZGVmaW5lZChDT05GSUdfT01BUCkKKwljb21fcG9ydC0+bWRyMSA9IDA7CS8qIHNlbGVjdCB1YXJ0IG1vZGUgKi8KKyNlbmRpZgorfQorCit2b2lkIE5TMTY1NTBfcmVpbml0IChOUzE2NTUwX3QgY29tX3BvcnQsIGludCBiYXVkX2Rpdmlzb3IpCit7CisJY29tX3BvcnQtPmllciA9IDB4MDA7CisJY29tX3BvcnQtPmxjciA9IExDUl9CS1NFOworCWNvbV9wb3J0LT5kbGwgPSBiYXVkX2Rpdmlzb3IgJiAweGZmOworCWNvbV9wb3J0LT5kbG0gPSAoYmF1ZF9kaXZpc29yID4+IDgpICYgMHhmZjsKKwljb21fcG9ydC0+bGNyID0gTENSVkFMOworCWNvbV9wb3J0LT5tY3IgPSBNQ1JWQUw7CisJY29tX3BvcnQtPmZjciA9IEZDUlZBTDsKK30KKwordm9pZCBOUzE2NTUwX3B1dGMgKE5TMTY1NTBfdCBjb21fcG9ydCwgY2hhciBjKQoreworCXdoaWxlICgoY29tX3BvcnQtPmxzciAmIExTUl9USFJFKSA9PSAwKTsKKwljb21fcG9ydC0+dGhyID0gYzsKK30KKworY2hhciBOUzE2NTUwX2dldGMgKE5TMTY1NTBfdCBjb21fcG9ydCkKK3sKKwl3aGlsZSAoKGNvbV9wb3J0LT5sc3IgJiBMU1JfRFIpID09IDApOworCXJldHVybiAoY29tX3BvcnQtPnJicik7Cit9CisKK2ludCBOUzE2NTUwX3RzdGMgKE5TMTY1NTBfdCBjb21fcG9ydCkKK3sKKwlyZXR1cm4gKChjb21fcG9ydC0+bHNyICYgTFNSX0RSKSAhPSAwKTsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL3NlcmlhbC5jIGIveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllY2YyYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL3NlcmlhbC5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBSb2IgVGF5bG9yLCBGbHlpbmcgUGlnIFN5c3RlbXMuIHJvYnRAZmx5aW5ncGlnLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfUFJJTlRGCisjaWZkZWYgQ0ZHX05TMTY1NTBfU0VSSUFMCisKKyNpbmNsdWRlIDxuczE2NTUwLmg+CisjaWZkZWYgQ0ZHX05TODczMDgKKyNpbmNsdWRlIDxuczg3MzA4Lmg+CisjZW5kaWYKKworI2lmIENPTkZJR19DT05TX0lOREVYID09IDEKK3N0YXRpYyBOUzE2NTUwX3QgY29uc29sZSA9IChOUzE2NTUwX3QpIENGR19OUzE2NTUwX0NPTTE7CisjZWxpZiBDT05GSUdfQ09OU19JTkRFWCA9PSAyCitzdGF0aWMgTlMxNjU1MF90IGNvbnNvbGUgPSAoTlMxNjU1MF90KSBDRkdfTlMxNjU1MF9DT00yOworI2VsaWYgQ09ORklHX0NPTlNfSU5ERVggPT0gMworc3RhdGljIE5TMTY1NTBfdCBjb25zb2xlID0gKE5TMTY1NTBfdCkgQ0ZHX05TMTY1NTBfQ09NMzsKKyNlbGlmIENPTkZJR19DT05TX0lOREVYID09IDQKK3N0YXRpYyBOUzE2NTUwX3QgY29uc29sZSA9IChOUzE2NTUwX3QpIENGR19OUzE2NTUwX0NPTTQ7CisjZWxzZQorI2Vycm9yIG5vIHZhbGlkIGNvbnNvbGUgZGVmaW5lZAorI2VuZGlmCisKK3N0YXRpYyBpbnQgY2FsY19kaXZpc29yICh2b2lkKQoreworLy8JREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisjaWZkZWYgQ09ORklHX09NQVAxNTEwCisJLyogSWYgY2FuJ3QgY2xlYW5seSBjbG9jayAxMTUyMDAgc2V0IGRpdiB0byAxICovCisJaWYgKChDRkdfTlMxNjU1MF9DTEsgPT0gMTIwMDAwMDApICYmIChDT05GSUdfQkFVRFJBVEUgPT0gMTE1MjAwKSkgeworCQljb25zb2xlLT5vc2NfMTJtX3NlbCA9IE9TQ18xMk1fU0VMOwkvKiBlbmFibGUgNi41ICogZGl2aXNvciAqLworCQlyZXR1cm4gKDEpOwkJCQkvKiByZXR1cm4gMSBmb3IgYmFzZSBkaXZpc29yICovCisJfQorCWNvbnNvbGUtPm9zY18xMm1fc2VsID0gMDsJCQkvKiBjbGVhciBpZiBwcmV2aXNvdWx5IHNldCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfT01BUDE2MTApIHx8IGRlZmluZWQoQ09ORklHX09NQVAxNzEwKQorCS8qIElmIGNhbid0IGNsZWFubHkgY2xvY2sgMTE1MjAwIHNldCBkaXYgdG8gMSAqLworCWlmICgoQ0ZHX05TMTY1NTBfQ0xLID09IDQ4MDAwMDAwKSAmJiAoQ09ORklHX0JBVURSQVRFID09IDExNTIwMCkpIHsKKwkJcmV0dXJuICgyNik7CQkvKiByZXR1cm4gMjYgZm9yIGJhc2UgZGl2aXNvciAqLworCX0KKyNlbmRpZgorCXJldHVybiAoQ0ZHX05TMTY1NTBfQ0xLIC8gMTYgLyBDT05GSUdfQkFVRFJBVEUpOworfQorCitpbnQgc2VyaWFsX2luaXQgKHZvaWQpCit7CisJaW50IGNsb2NrX2Rpdmlzb3IgPSBjYWxjX2Rpdmlzb3IoKTsKKworI2lmZGVmIENGR19OUzg3MzA4CisJaW5pdGlhbGlzZV9uczg3MzA4KCk7CisjZW5kaWYKKworCU5TMTY1NTBfaW5pdChjb25zb2xlLCBjbG9ja19kaXZpc29yKTsKKworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK3NlcmlhbF9wdXRjKGNvbnN0IGNoYXIgYykKK3sKKwlpZiAoYyA9PSAnXG4nKQorCQlOUzE2NTUwX3B1dGMoY29uc29sZSwgJ1xyJyk7CisKKwlOUzE2NTUwX3B1dGMoY29uc29sZSwgYyk7Cit9CisKK3ZvaWQKK3NlcmlhbF9wdXRzIChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlzZXJpYWxfcHV0YyAoKnMrKyk7CisJfQorfQorCisKK2ludAorc2VyaWFsX2dldGModm9pZCkKK3sKKwlyZXR1cm4gTlMxNjU1MF9nZXRjKGNvbnNvbGUpOworfQorCitpbnQKK3NlcmlhbF90c3RjKHZvaWQpCit7CisJcmV0dXJuIE5TMTY1NTBfdHN0Yyhjb25zb2xlKTsKK30KKwordm9pZAorc2VyaWFsX3NldGJyZyAodm9pZCkKK3sKKwlpbnQgY2xvY2tfZGl2aXNvcjsKKworICAgIGNsb2NrX2Rpdmlzb3IgPSBjYWxjX2Rpdmlzb3IoKTsKKwlOUzE2NTUwX3JlaW5pdChjb25zb2xlLCBjbG9ja19kaXZpc29yKTsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvdXNiL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy91c2IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5ZDEwMQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvdXNiL01ha2VmaWxlCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2LTIwMDkKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCTo9ICQob2JqKWxpYnVzYi5hCisKK0NPQkpTLXkgKz0gdXNiLm8KKworQ09CSlMJOj0gJChzb3J0ICQoQ09CSlMteSkpCitTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKKworYWxsOgkkKExJQikKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvdXNiL3VzYi5jIGIveC1sb2FkZXIvZHJpdmVycy91c2IvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExZGRkNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvdXNiL3VzYi5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogVVNCIGJvb3Rsb2FkZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmljayBCcm9uc29uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4gICAgICAgIC8qIGdldCBjaGlwIGFuZCBib2FyZCBkZWZzICovCisjaW5jbHVkZSAidXNiLmgiCisKK2V4dGVybiB2b2lkIHVkZWxheSAodW5zaWduZWQgbG9uZyB1c2Vjcyk7CisKK3R5cGVkZWYgaW50IGJvb3Rfb3NfZm4gKHZvaWQpOworCisvKiBzZW5kIGEgYnVmZmVyIHZpYSBVU0IgKi8KK2ludCB1c2Jfc2VuZCh1bnNpZ25lZCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGludCBidWZmZXJfc2l6ZSkKKyAgIHsKKyAgIGludCByZXQgPSAwOworCisgICBpZiAoISgqcGVyaV90eGNzciAmIE1VU0JfVFhDU1JfVFhQS1RSRFkpKQorICAgICAgIHsKKyAgICAgICB1bnNpZ25lZCBpbnQgY250cjsKKworICAgICAgIGZvciAoY250ciA9IDA7IGNudHIgPCBidWZmZXJfc2l6ZTsgY250cisrKQorICAgICAgICAgICAqYnVsa19maWZvID0gYnVmZmVyW2NudHJdOworCisgICAgICAgKnBlcmlfdHhjc3IgfD0gTVVTQl9UWENTUl9UWFBLVFJEWTsKKworICAgICAgIHJldCA9IGJ1ZmZlcl9zaXplOworICAgICAgIH0KKyAgIHJldHVybiByZXQ7CisgICB9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBpbnQgdXNiX3JlY3YgKHU4ICpidWZmZXIsIGludCBzaXplKQoreworICAgaW50IGNudHI7CisgICB1MTYgY291bnQgPSAwOworCisgICBpZiAoKnBlcmlfcnhjc3IgJiBNVVNCX1JYQ1NSX1JYUEtUUkRZKQorICAgICAgIHsKKyAgICAgICBjb3VudCA9ICpyeGNvdW50OworICAgICAgIGZvciAoY250ciA9IDA7IGNudHIgPCBjb3VudDsgY250cisrKQorICAgICAgICAgICB7CisgICAgICAgICAgICpidWZmZXIrKyA9ICpidWxrX2ZpZm87CisgICAgICAgICAgIH0KKyAgICAgICAgICAgLyogQ2xlYXIgdGhlIFJYUEtUUkRZIGJpdCAqLworICAgICAgICpwZXJpX3J4Y3NyICY9IH5NVVNCX1JYQ1NSX1JYUEtUUkRZOworICAgICAgIH0KKyAgIHJldHVybiBjb3VudDsgIC8qIEZJWE1FICovCit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHVzYl9vdXRidWZmZXJbNjRdOworCitzdGF0aWMgdm9pZCB1c2JfbXNnICh1bnNpZ25lZCBpbnQgY21kLCBjb25zdCBjaGFyICptc2cpCisgICB7CisgICB1bnNpZ25lZCBjaGFyICpwX2NoYXIgPSB1c2Jfb3V0YnVmZmVyOworCisgICAqIChpbnQgKikgcF9jaGFyID0gY21kOworICAgcF9jaGFyICs9IHNpemVvZiAoY21kKTsKKyAgIGlmIChtc2cpCisgICAgICAgeworICAgICAgIHdoaWxlICgqbXNnKQorICAgICAgICAgICAqcF9jaGFyKys9ICptc2crKzsKKyAgICAgICAqcF9jaGFyKys9IDA7CisgICAgICAgfQorICAgdXNiX3NlbmQgKHVzYl9vdXRidWZmZXIsIHBfY2hhciAtIHVzYl9vdXRidWZmZXIpOworICAgfQorCitzdGF0aWMgdm9pZCB1c2JfY29kZSAodW5zaWduZWQgaW50IGNtZCwgdTMyIGNvZGUpCisgICB7CisgICB1bnNpZ25lZCBpbnQgKnBfaW50ID0gKHVuc2lnbmVkIGludCAqKSB1c2Jfb3V0YnVmZmVyOworCisgICAqcF9pbnQrKyA9IGNtZDsKKyAgICpwX2ludCsrID0gY29kZTsKKyAgIHVzYl9zZW5kICh1c2Jfb3V0YnVmZmVyLCAoKHVuc2lnbmVkIGNoYXIgKikgcF9pbnQpIC0gdXNiX291dGJ1ZmZlcik7CisgICB9CisKK3ZvaWQgZG9fdXNiICh2b2lkKQorICAgeworICAgYm9vdF9vc19mbiAqYm9vdF9mbjsKKyAgIGludCByZXM7CisgICB1MzIgdXNiX2luYnVmZmVyWzUxMl07CisgICB1MzIgdG90YWw7CisgICB1OCAqYWRkcjsKKyAgIHUzMiBieXRlczsKKyAgIGludCBzaXplOworICAgaW50IGNudHIgPSAwOworCisgICB1c2JfbXNnIChVU0JMT0FEX0NNRF9GSUxFX1JFUSwgImZpbGUgcmVxIik7CisgICB3aGlsZSgrK2NudHIgPCAyMDAwMDApICAvKiB0cnkgZm9yIDEgc2Vjb25kIHRoZW4gYmFpbCBvdXQgKi8KKyAgICAgICB7CisgICAgICAgcmVzID0gdXNiX3JlY3YgKCh1OCAqKSB1c2JfaW5idWZmZXIsIHNpemVvZiAodXNiX2luYnVmZmVyKSk7CisgICAgICAgc3dpdGNoICh1c2JfaW5idWZmZXJbMF0pCisgICAgICAgICAgIHsKKyAgICAgICAgICAgY2FzZSBVU0JMT0FEX0NNRF9GSUxFOgorICAgICAgICAgICAgICAgcHJpbnRmICgiVVNCTE9BRF9DTURfRklMRSB0b3RhbCA9ICVkIGNtZCA9ICVjJWMlYyVjIHZhbCA9IDB4JXggdmFsID0gMHgleFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgIHJlcywgCisgICAgICAgICAgICAgICAgICAgICAgICgoY2hhciopJnVzYl9pbmJ1ZmZlclswXSlbMF0sICgoY2hhciopJnVzYl9pbmJ1ZmZlclswXSlbMV0sICgoY2hhciopJnVzYl9pbmJ1ZmZlclswXSlbMl0sICgoY2hhciopJnVzYl9pbmJ1ZmZlclswXSlbM10sCisgICAgICAgICAgICAgICAgICAgICAgIHVzYl9pbmJ1ZmZlclsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgdXNiX2luYnVmZmVyWzJdKTsKKyAgICAgICAgICAgICAgIHRvdGFsID0gdXNiX2luYnVmZmVyWzFdOyAgLyogZ2V0IHNpemUgYW5kIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgIGFkZHIgPSAodTggKikgdXNiX2luYnVmZmVyWzJdOworICAgICAgICAgICAgICAgdXNiX2NvZGUgKFVTQkxPQURfQ01EX0VDSE9fU1osIHRvdGFsKTsKKworICAgICAgICAgICAgICAgYnl0ZXMgPSAwOworICAgICAgICAgICAgICAgd2hpbGUgKGJ5dGVzIDwgdG90YWwpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHNpemUgPSB1c2JfcmVjdiAoKHU4ICopIHVzYl9pbmJ1ZmZlciwgc2l6ZW9mICh1c2JfaW5idWZmZXIpKTsKKyAgICAgICAgICAgICAgICAgICBtZW1jcHkoYWRkciwgdXNiX2luYnVmZmVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICBhZGRyICs9IHNpemU7CisgICAgICAgICAgICAgICAgICAgYnl0ZXMgKz0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB1c2JfY29kZSAoVVNCTE9BRF9DTURfUkVQT1JUX1NaLCB0b3RhbCk7ICAvKiB0ZWxsIGhpbSB3ZSBnb3QgdGhpcyBtYW55IGJ5dGVzICovCisgICAgICAgICAgICAgICBwcmludGYgKCJnb3QgZmlsZSBhZGRyID0gMHgleCBjb3VudGVyID0gJWRcbiIsIGFkZHIsIGNudHIpOworICAgICAgICAgICAgICAgdXNiX21zZyAoVVNCTE9BRF9DTURfRklMRV9SRVEsICJmaWxlIHJlcSIpOyAgLyogc2VlIGlmIHRoZXkgaGF2ZSBhbm90aGVyIGZpbGUgZm9yIHVzICovCisgICAgICAgICAgICAgICBjbnRyID0gMDsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlIFVTQkxPQURfQ01EX0pVTVA6CisgICAgICAgICAgICAgICBwcmludGYgKCJVU0JMT0FEX0NNRF9KVU1QIHRvdGFsID0gJWQgYWRkciA9IDB4JXggdmFsID0gMHgleFxuIiwgcmVzLCB1c2JfaW5idWZmZXJbMF0sIHVzYl9pbmJ1ZmZlclsxXSk7CisgICAgICAgICAgICAgICBib290X2ZuID0gKGJvb3Rfb3NfZm4gKikgdXNiX2luYnVmZmVyWzFdOworICAgICAgICAgICAgICAgYm9vdF9mbigpOyAgLyogZ28gdG8gdS1ib290IGFuZCBtYXliZSBrZXJuZWwgKi8KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIH0KKyAgICAgICB1ZGVsYXkoMTApOyAgLyogZGVsYXkgMTAgdXMgKi8KKyAgICAgICB9CisgICAgICAgcHJpbnRmKCJVU0IgZG9uZVxuIik7CisgICAgICAgaGFuZygpOworICAgfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy91c2IvdXNiLmggYi94LWxvYWRlci9kcml2ZXJzL3VzYi91c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2MyZWJjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy91c2IvdXNiLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIFVTQiBib290bG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJpY2sgQnJvbnNvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9VU0JfSF8KKyNkZWZpbmUgX1VTQl9IXworCisjZGVmaW5lIE9NQVAzNFhYX1VTQl9CQVNFICAgICAoT01BUDM0WFhfQ09SRV9MNF9JT19CQVNFICsgMHhBQjAwMCkKKworI2RlZmluZSBPTUFQMzRYWF9VU0JfRVAobikgICAgICAgICAoT01BUDM0WFhfVVNCX0JBU0UgKyAweDEwMCArIDB4MTAqKG4pKQorCisjZGVmaW5lIE1VU0JfUlhDU1IgICAgIDB4MDYKKyNkZWZpbmUgTVVTQl9SWENPVU5UICAgICAgIDB4MDgKKyNkZWZpbmUgTVVTQl9UWENTUiAgICAgMHgwMgorI2RlZmluZSBNVVNCX0ZJRk9TSVpFICAgICAgMHgwRgorI2RlZmluZSBPTUFQMzRYWF9VU0JfUlhDU1IobikgICAgICAoT01BUDM0WFhfVVNCX0VQKG4pICsgTVVTQl9SWENTUikKKyNkZWZpbmUgT01BUDM0WFhfVVNCX1JYQ09VTlQobikgICAgKE9NQVAzNFhYX1VTQl9FUChuKSArIE1VU0JfUlhDT1VOVCkKKyNkZWZpbmUgT01BUDM0WFhfVVNCX1RYQ1NSKG4pICAgICAgKE9NQVAzNFhYX1VTQl9FUChuKSArIE1VU0JfVFhDU1IpCisjZGVmaW5lIE9NQVAzNFhYX1VTQl9GSUZPU0laRShuKSAgIChPTUFQMzRYWF9VU0JfRVAobikgKyBNVVNCX0ZJRk9TSVpFKQorI2RlZmluZSBPTUFQMzRYWF9VU0JfRklGTyhuKSAgICAgICAoT01BUDM0WFhfVVNCX0JBU0UgKyAweDIwICsgKChuKSAqIDQpKQorCisvKiBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyAqLworI2RlZmluZSBCVUxLX0VORFBPSU5UIDEKK3N0YXRpYyB2b2xhdGlsZSB1MTYgKnBlcmlfcnhjc3IgPSAodm9sYXRpbGUgdTE2ICopIE9NQVAzNFhYX1VTQl9SWENTUihCVUxLX0VORFBPSU5UKTsKKyNkZWZpbmUgTVVTQl9SWENTUl9SWFBLVFJEWSAgICAgICAgMHgwMDAxCitzdGF0aWMgdm9sYXRpbGUgdTE2ICpyeGNvdW50ICAgID0gKHZvbGF0aWxlIHUxNiAqKSBPTUFQMzRYWF9VU0JfUlhDT1VOVChCVUxLX0VORFBPSU5UKTsKK3N0YXRpYyB2b2xhdGlsZSB1MTYgKnBlcmlfdHhjc3IgPSAodm9sYXRpbGUgdTE2ICopIE9NQVAzNFhYX1VTQl9UWENTUihCVUxLX0VORFBPSU5UKTsKKyNkZWZpbmUgTVVTQl9UWENTUl9UWFBLVFJEWSAgICAgICAgMHgwMDAxCitzdGF0aWMgdm9sYXRpbGUgdTggICpidWxrX2ZpZm8gID0gKHZvbGF0aWxlIHU4ICAqKSBPTUFQMzRYWF9VU0JfRklGTyhCVUxLX0VORFBPSU5UKTsKKworLyogSW4gaGlnaCBzcGVlZCBtb2RlIHBhY2tldHMgYXJlIDUxMgorICAgSW4gZnVsbCBzcGVlZCBtb2RlIHBhY2tldHMgYXJlIDY0ICovCisjZGVmaW5lIFJYX0VORFBPSU5UX01BWElNVU1fUEFDS0VUX1NJWkVfMl8wICAoMHgwMjAwKQorI2RlZmluZSBSWF9FTkRQT0lOVF9NQVhJTVVNX1BBQ0tFVF9TSVpFXzFfMSAgKDB4MDA0MCkKKworI2RlZmluZSBNSU4oYSxiKSAoICgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCisjZGVmaW5lIFBBQ0s0KGEsYixjLGQpICAgICAoKChkKTw8MjQpIHwgKChjKTw8MTYpIHwgKChiKTw8OCkgfCAoYSkpCisjZGVmaW5lIFVTQkxPQURfQ01EX0ZJTEUgUEFDSzQoJ1UnLCAnUycsICdCJywgJ3MnKSAgLyogc2VuZCBmaWxlIHNpemUgKi8KKyNkZWZpbmUgVVNCTE9BRF9DTURfSlVNUCBQQUNLNCgnVScsICdTJywgJ0InLCAnaicpICAvKiBnbyB3aGVyZSBJIHRlbGwgeW91ICovCisjZGVmaW5lIFVTQkxPQURfQ01EX0ZJTEVfUkVRIFBBQ0s0KCdVJywgJ1MnLCAnQicsICdmJykgIC8qIGZpbGUgcmVxdWVzdCAqLworI2RlZmluZSBVU0JMT0FEX0NNRF9FQ0hPX1NaIFBBQ0s0KCdVJywgJ1MnLCAnQicsICduJykgIC8qIGVjaG8gZmlsZSBzaXplICovCisjZGVmaW5lIFVTQkxPQURfQ01EX1JFUE9SVF9TWiBQQUNLNCgnVScsICdTJywgJ0InLCAnbycpICAvKiByZXBvcnQgZmlsZSBzaXplICovCisjZGVmaW5lIFVTQkxPQURfQ01EX01FU1NBR0UgUEFDSzQoJ1UnLCAnUycsICdCJywgJ20nKSAgLyogbWVzc2FnZSBmb3IgZGVidWcgKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2ZzL01ha2VmaWxlIGIveC1sb2FkZXIvZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjQxOWI5OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2ZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisjCisKK1NVQkRJUlMJOj0gZmF0CisKKy5kZXBlbmQgYWxsOgorCUBmb3IgZGlyIGluICQoU1VCRElSUykgOyBkbyBcCisJCSQoTUFLRSkgLUMgJCRkaXIgJEAgOyBkb25lCmRpZmYgLS1naXQgYS94LWxvYWRlci9mcy9mYXQvTWFrZWZpbGUgYi94LWxvYWRlci9mcy9mYXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODdhZjczYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2ZzL2ZhdC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ1IEBACisjCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWJmYXQuYQorCitBT0JKUwk9CitDT0JKUwk9IGZhdC5vIGZpbGUubworCitTUkNTCTo9ICQoQU9CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKEFPQkpTKSAkKENPQkpTKSkKKworYWxsOgkkKExJQikgJChBT0JKUykKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZnMvZmF0L2ZhdC5jIGIveC1sb2FkZXIvZnMvZmF0L2ZhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzNjM4ODEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9mcy9mYXQvZmF0LmMKQEAgLTAsMCArMSw5MjggQEAKKy8qCisgKiBmYXQuYworICoKKyAqIFIvTyAoVilGQVQgMTIvMTYvMzIgZmlsZXN5c3RlbSBpbXBsZW1lbnRhdGlvbiBieSBNYXJjdXMgU3VuZGJlcmcKKyAqCisgKiAyMDAyLTA3LTI4IC0gcmpvbmVzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHBwY2Jvb3QgdjEuMS42CisgKiAyMDAzLTAzLTEwIC0ga2hhcnJpc0BuZXh1cy10ZWNoLm5ldCAtIHBvcnRlZCB0byB1Ym9vdAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+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+IDEpCisjZWxzZQorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgVl9PU0NLCisjZW5kaWYKKworLy8jZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMjY2TUhaICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTMzTUh6IEREUiAqLworI2RlZmluZSBQUkNNX0NMS19DRkcyXzMzMk1IWiAgICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTY2TUh6IEREUiAqLworI2RlZmluZSBQUkNNX1BDTEtfT1BQMiAgICAgICAgICAgMSAgICAvKiBBUk09MzgxTUh6IC0gVkREMT0xLjIwdiAqLworCisjIGRlZmluZSBOQU5EX0JBU0VfQURSICAgICAgICAgICBOQU5EX0JBU0UgIC8qIE5BTkQgZmxhc2ggKi8KKyMgZGVmaW5lIE9ORU5BTkRfQkFTRSAgICAgICAgICAgIE9ORU5BTkRfTUFQICAvKiBPbmVOYW5kIGZsYXNoICovCisKKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfMTI4TQorI2RlZmluZSBPTkVOQU5EX0FERFIgT05FTkFORF9CQVNFICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIE9uZU5BTkQgYXQgQ1MwKi8KKworI2lmZGVmIENGR19QUklOVEYKKworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUgICAgICgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLICAgICAgICAgICg0ODAwMDAwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMyAgICAgICAgIE9NQVAzNFhYX1VBUlQzCisKKy8qCisgKiBzZWxlY3Qgc2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TRVJJQUwzICAgICAgICAgICAzICAgIC8qIFVBUlQxIG9uIE9NQVAzRVZNICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgICAzCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgIDExNTIwMAorI2RlZmluZSBDRkdfUEJTSVpFICAgICAgICAgICAgICAgMjU2CisKKyNlbmRpZiAvKiBDRkdfUFJJTlRGICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSICAgICAgICAgICAgIDB4ODAwMDgwMDAKKworI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFICAgICAgICAgKDEyOCoxMDI0KSAvKiByZWd1bGFyIHN0YWNrICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIE5BTkQgSW5mby4KKyAqLworCisjZGVmaW5lIENGR19OQU5EX0s5RjFHMDhSMEEgICAgLyogU2Ftc3VuZyA4LWJpdCAxMjhNQiBjaGlwIGxhcmdlIHBhZ2UgTkFORCBjaGlwKi8KKyNkZWZpbmUgTkFORF8xNkJJVAorCisvKiBOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogMHgwMDAwMDAwMCAtIDB4MDAwN0ZGRkYgIEJvb3RpbmcgSW1hZ2UKKyAqIDB4MDAwODAwMDAgLSAweDAwMjNGRkZGICBVLUJvb3QgSW1hZ2UKKyAqIDB4MDAyNDAwMDAgLSAweDAwMjdGRkZGICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqIDB4MDAyODAwMDAgLSAweDAwNzdGRkZGICBLZXJuZWwgSW1hZ2UKKyAqIDB4MDA3ODAwMDAgLSAweDA4MDAwMDAwICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9TVEFSVCAgICAgICAgIDB4MDA4MDAwMCAvKiBMZWF2aW5nIGZpcnN0IDQgYmxvY2tzIGZvciB4LWxvYWQgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9FTkQgICAgICAgICAgIDB4MDI0MDAwMCAvKiBHaXZpbmcgYSBzcGFjZSBvZiAyIGJsb2NrcyA9IDI1NktCICovCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRSAgICAgICAgICAweDIwMDAwCisKKyNkZWZpbmUgR1BNQ19DT05GSUcgICAgICAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg1MCkKKworI2lmIGRlZmluZWQgKENPTkZJR19BTTM1MTdFVk0pCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4N0MpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODApCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODQpCisjZWxpZiBkZWZpbmVkIChDT05GSUdfQU0zNTE3VEVCKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweERDKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweEUwKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8wICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweEU0KQorI2VuZGlmCisKKyNpZmRlZiBOQU5EXzE2QklUCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzApCisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZWxzZSAvKiB0byBzdXBwb3J0IDgtYml0IE5BTkQgZGV2aWNlcyAqLworI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzApOworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2VuZGlmCisKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBvbmVOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX1NZTkNfQlVSU1RfUkVBRAkxCisKKy8qIE9uZU5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAgIDB4MDAwMDAwMCAtIDB4MDA4MDAwMCAgWC1Mb2FkZXIKKyAqICAgMHgwMDgwMDAwIC0gMHgwMjQwMDAwICAgVS1ib290IEltYWdlCisgKiAgIDB4MDI0MDAwMCAtIDB4MDI4MDAwMCAgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogICAweDAyODAwMDAgLSAweDA3ODAwMDAgICBLZXJuZWwgSW1hZ2UKKyAqICAgMHgwNzgwMDAwIC0gMHg4MDAwMDAwICAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisKKyNkZWZpbmUgT05FTkFORF9TVEFSVF9CTE9DSyAgICAgIDQKKyNkZWZpbmUgT05FTkFORF9FTkRfQkxPQ0sgICAgICAgIDE4CisjZGVmaW5lIE9ORU5BTkRfUEFHRV9TSVpFICAgICAgICAyMDQ4ICAgICAvKiAyS0IgKi8KKyNkZWZpbmUgT05FTkFORF9CTE9DS19TSVpFICAgICAgIDB4MjAwMDAgIC8qIDEyOEtCICovCisKKyNlbmRpZiAvKiBfX0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9kaWFtb25kLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvZGlhbW9uZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNmZlMTIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvZGlhbW9uZC5oCkBAIC0wLDAgKzEsNDYyIEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB4LWxvYWRlciBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUKKyAqICAgICAgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqICAgICAgVGhlIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGVyaXZlZCBmcm9tIG9tYXAzZXZtLmguCisgKgorICogICAgICBTRFJBTSBDb250cm9sbGVyIChTRFJDKToKKyAqICAgICAgICAtIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDY0IE1pQiBERFIgU0RSQU0KKyAqCisgKiAgICAgIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlciAoR1BNQyk6CisgKiAgICAgICAgLSBNaWNyb24gTVQyOUYyRzE2QUJESEMtRVQgMjU2IE1pQiBTTEMgTkFORCBGbGFzaCAoRGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBNaWNyb24gTVQyOUYyRzE2QUJCRUFINCAyNTYgTWlCIFNMQyBOQU5EIEZsYXNoIChOb24tZGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBTYW1zdW5nIEs5RjRHMDhVMEMgNTEyIE1pQiBTTEMgTkFORCBGbGFzaCAoRGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBTTVNDIExBTjkyMjAgMTAvMTAwIE1iaXQgRXRoZXJuZXQgTUFDIGFuZCBQSFkgKERldmVsb3BtZW50KQorICoKKyAqICAgICAgTXVsdGltZWRpYSBDYXJkIChNTUMpIEludGVyZmFjZToKKyAqICAgICAgICAtIE1vbGV4IDUwMDk5OC0wOTAwIFNlY3VyZSBEaWdpdGFsIChTRCkgQ29ubmVjdG9yCisgKiAgICAgICAgLSBUSSBXTDEyNzAgV2lyZWxlc3MgTEFOIChXTEFOKSBNb2R1bGUKKyAqCisgKiAgICAgIERpc3BsYXkgU3Vic3lzdGVtIChEU1MpOgorICogICAgICAgIC0gU2Ftc3VuZyBMTVMzNTBERjAzIEhWR0EgKDMyMCB4IDQ4MCkgTENNIChEZXZlbG9wbWVudCBhbmQgUHJvdG90eXBlKQorICogICAgICAgIC0gVGlhbm1hIFRNMDI1WkRaMDEgKDMyMCB4IDMyMCkgTENNIChQcm9kdWN0aW9uKQorICoKKyAqICAgICAgQ2FtZXJhIEltYWdlIFNpZ25hbCBQcm9jZXNzb3I6CisgKiAgICAgICAgLSBVbnVzZWQKKyAqCisgKiAgICAgIFVBUlQgQ29udHJvbGxlcjoKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAgICAgKiBIZWFkIFVuaXQgU2VyaWFsIENvbnNvbGUKKyAqCisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgICAgICogWmlnQmVlIFdpcmVsZXNzIE1vZHVsZQorICoKKyAqICAgICAgTXVsdGljaGFubmVsIEJ1ZmZlcmVkIFNlcmlhbCBQb3J0IChNY0JTUCk6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgLSBDaGFubmVsIDM6CisgKiAgICAgICAgLSBDaGFubmVsIDQ6CisgKiAgICAgICAgLSBDaGFubmVsIDU6CisgKgorICogICAgICBNdWx0aWNoYW5uZWwgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChNY1NQSSk6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgLSBDaGFubmVsIDM6CisgKgorICogICAgICBHUElPIENvbnRyb2xsZXI6CisgKiAgICAgICAgLSBCYWNrcGxhdGUgRGV0ZWN0CisgKiAgICAgICAgLSBaaWdCZWUKKyAqLworCisjaWZuZGVmIF9fRElBTU9ORF9DT05GSUdfSAorI2RlZmluZSBfX0RJQU1PTkRfQ09ORklHX0gKKworLyoKKyAqIEFSTSBQcm9jZXNzb3IgQXJjaGl0ZWN0dXJlLCBGYW1pbHkgYW5kIFByb2R1Y3QgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19BUk1DT1JURVhBOAkJMQorI2RlZmluZSBDT05GSUdfT01BUCAgICAgICAgICAgICAxCisjZGVmaW5lIENPTkZJR19PTUFQMzRYWCAgICAgICAgIDEKKyNkZWZpbmUgQ09ORklHX09NQVAzNDMwICAgICAgICAgMQorCisvKgorICogV2l0aCB0aGUgYXJjaGl0ZWN0dXJlLCBmYW1pbHkgYW5kIHByb2R1Y3QgY29uZmlndXJhdGlvbiBkZWZpbmVkLAorICogaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgQ1BVIGhlYWRlciBmaWxlLgorICovCisKKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKworLyoKKyAqIEFzc2VydCB0aGUgYm9hcmQgdHlwZShzKSB3ZSBhcmUgYnVpbGRpbmcgZm9yLgorICoKKyAqLworI3VuZGVmIENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UCisjdW5kZWYgQ09ORklHX0RJQU1PTkRfQk9BUkRfUFJPVE9UWVBFCisjdW5kZWYgQ09ORklHX0RJQU1PTkRfQk9BUkRfRVZUCisjdW5kZWYgQ09ORklHX0RJQU1PTkRfQk9BUkRfRFZUCisjdW5kZWYgQ09ORklHX0RJQU1PTkRfQk9BUkRfUFZUCisjdW5kZWYgQ09ORklHX0RJQU1PTkRfQk9BUkRfTVAKKyNkZWZpbmUgQ09ORklHX0RJQU1PTkRfQk9BUkRfTVVMVEkJCQkxCisKKy8qCisgKiBFbmFibGUgc2VyaWFsIGNvbnNvbGUgcHJpbnRmIGZhY2lsaXR5IChjb25zdW1lcyBhYm91dCAzLjUgS2lCKQorICovCisjZGVmaW5lIENGR19QUklOVEYKKworLyoKKyAqIENPTkZJR19CT09UTV9JTUFHRSAtIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIFgtTG9hZGVyCisgKiBzdXBwb3J0cyBib290aW5nIGZyb20gJ21raW1hZ2UnIHUtYm9vdCBpbWFnZSBmaWxlcyByYXRoZXIgdGhhbiBqdXN0CisgKiByYXcsIHUtYm9vdCBiaW5hcmllcy4KKyAqCisgKiBFbmFibGluZyB0aGlzIGFkZHMgc3VwcG9ydCBmb3IgYXR0ZW1wdGluZyB0byBib290IGZyb20gb25lIG9yIG1vcmUKKyAqIGltYWdlcyBiZWNhdXNlIGl0IGFsbG93cyBhbiBpbWFnZSB0byBiZSBzYW5pdHktY2hlY2tlZCBiZWZvcmUKKyAqIGF0dGVtcHRpbmcgdG8gYm9vdCBpdC4KKyAqLworI2RlZmluZSBDT05GSUdfQk9PVE1fSU1BR0UKKworLyoKKyAqIERpc3BsYXkgaW1hZ2UgaW5mb3JtYXRpb24gd2l0aCB0aW1lc3RhbXBzCisgKi8KKyNpZmRlZiBDT05GSUdfQk9PVE1fSU1BR0UKKyNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19QUklOVEYpCisvKgorICogVXNlIGEgcHJpbnRmIGJ1ZmZlciBzaXplIG9mIDI1NiBCCisgKi8KKyMgZGVmaW5lIENGR19QQlNJWkUJCQkJMjU2CisKKy8qCisgKiBJbmRpY2F0ZSB0aGF0IHdlIHdhbnQgdG8gdXNlIENGR19OUzE2NTUwX0NPTTEgKHNlZSBiZWxvdykgYXQgYSBiYXVkCisgKiByYXRlIG9mIDExNSwyMDAgYnBzIGZvciB0aGUgc2VyaWFsIGNvbnNvbGUuCisgKi8KKyMgZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgMQorIyBkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAxMTUyMDAKKworLyoKKyAqIE5TMTY1NTAtY29tcGF0aWJsZSBzZXJpYWwgZHJpdmVyIGNvbmZpZ3VyYXRpb24KKyAqLworIyBkZWZpbmUgQ0ZHX05TMTY1NTAKKyMgZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorIyBkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUgICAoLTQpCisjIGRlZmluZSBDRkdfTlMxNjU1MF9DTEsgICAgICAgICg0ODAwMDAwMCkKKyMgZGVmaW5lIENGR19OUzE2NTUwX0NPTTEgICAgICAgT01BUDM0WFhfVUFSVDEKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19QUklOVEYpICovCisKKy8qCisgKiBEaXNhYmxlIHRpbWVyLWJhc2VkIGRlbGF5IChjb25zdW1lcyBhYm91dCAyNTAgQikgc2luY2UgdGhpcyBpcyBvbmx5CisgKiBhdmFpbGFibGUgYXQgcHJlc2VudCBvbiB0aGUgQVJNOTI2RUpTLgorICovCisjdW5kZWYJQ0ZHX1VERUxBWQorCisvKgorICogVGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBkZXZlbG9wbWVudCBib2FyZCBoYXMgYW4gU0QvTU1DCisgKiBjb25uZWN0b3IsIHNvIGVuYWJsZSBzdXBwb3J0IGZvciBpdCwgd2hpY2ggaW1wbGljaXRseSBlbmFibGVzCisgKiBydWRpbWVudGFyeSBzdXBwb3J0IGZvciBNUy1ET1MgKE1CUikgcGFydGl0aW9ucyBhbmQgRkFUIGZpbGUKKyAqIHN5c3RlbXMuCisgKi8KKyNkZWZpbmUgQ09ORklHX01NQwkJCQkxCisKKyNpZiBkZWZpbmVkKENPTkZJR19NTUMpCisjIGRlZmluZSBDRkdfQ01EX01NQyAgICAgICAgICAgIDEKKyMgZGVmaW5lIENGR19DTURfRkFUICAgICAgICAgICAgMQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX01NQykgKi8KKworLyoKKyAqIENsb2NrIENvbmZpZ3VyYXRpb24KKyAqCisgKiAgQ2hvb3NlIFBSQ00gQ29uZmlndXJhdGlvbiAyIHdoaWNoIHN1YnNlbGVjdHMgYSBMMyBpbnRlcmNvbm5lY3QKKyAqICBjbG9jayBvZiAxNjYgTUh6IGZvciBTRFJBTS4KKyAqLworCisjdW5kZWYgQ0ZHX1BSQ01fREVCVUcKKworI2RlZmluZSBQUkNNX0NMS19DRkcyXzMzMk1IWiAgICAgCQkxCisKKyNkZWZpbmUJQ09ORklHX1NZU19NUFVfRFBMTF8zMDBNSFoJCTEKKyN1bmRlZglDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWgorCisjZGVmaW5lCUNPTkZJR19TWVNfQ09SRV9EUExMXzMzMk1IWgkJMQorI3VuZGVmCUNPTkZJR19TWVNfQ09SRV9EUExMXzIwME1IWgorI3VuZGVmCUNPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWgorCisjZGVmaW5lIENGR19TRFJBTV9TSVpFX01CCQkJCTY0CisjdW5kZWYgQ0ZHX1NEUkFNX0RFQlVHCisKKy8qCisgKiBUaGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IG1heSBoYXZlIG9uZSBvZiB0aHJlZSBTRFJBTXMKKyAqIDFhKVNhbXN1bmcgSS1EaWUgNjRNQgorICogICAgMzJNYngxNgorICogICAgVkREPTEuOFYKKyAqICAgIDZucyBjeWNsZSB0aW1lCisgKiAgICBDTD0zCisgKiAKKyAqIDFiKVNhbXN1bmcgSy1EaWUgNjRNQgorICogICAgMzJNYngxNgorICogICAgVkREPTEuOFYKKyAqICAgIDZucyBjeWNsZSB0aW1lCisgKiAgICBDTD0zCisgKgorICogMikgTmFueWEgTlQ2RE0gNjRNQgorICogICAgMzJNYngxNgorICogICAgVkREPTEuOFYKKyAqICAgIDZucyBjeWNsZSB0aW1lCisgKiAgICBDTD0zCisgKgorICovCisKKyN1bmRlZiBDRkdfU0RSQU1fU01HX0s0WAorI3VuZGVmIENGR19TRFJBTV9OWUFfTlRENgorI2RlZmluZSBDRkdfU0RSQU1fQ09NQklORUQKKy8qCisgKiBUaGVzZSB2YWx1ZXMgYXJlIGJhc2VkIG9uIHRoZSBTYW1zdW5nIEs0WDUxMTYzUEstRkdDNiBkYXRhc2hlZXQgCisgKiAoYXBwbGljYWJsZSB0byB0aGUgSS1kaWUgYW5kIHRoZSBLLWRpZSkgYW5kIHRoZSBUSSBzcHJlYWRzaGVldCAKKyAqIGF0IGh0dHA6Ly9wcm9jZXNzb3JzLndpa2kudGkuY29tL2luZGV4LnBocD90aXRsZT0KKyAqIFNldHRpbmdfdXBfQU0zN3hfU0RSQ19yZWdpc3RlcnMuCisgKi8KKyNpZiBkZWZpbmVkKENGR19TRFJBTV9TTUdfSzRYKQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDCQkxMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMJCTEwCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQVMJCSA3CisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSUAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRAkJIDIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERQTAkJIDIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTAkJIDUKKworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UV1RSCQkgMQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFCQkgMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFAJCSAxCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RYU1IJCTIwCisjZW5kaWYKKworLyoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIE5hbnlhIE5UNkRNIGRhdGFzaGVldCBhbmQgdGhlIFRJCisgKiBzcHJlYWRzaGVldCBhdCBodHRwOi8vcHJvY2Vzc29ycy53aWtpLnRpLmNvbS9pbmRleC5waHA/dGl0bGU9CisgKiBTZXR0aW5nX3VwX0FNMzd4X1NEUkNfcmVnaXN0ZXJzLgorICovCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fTllBX05URDYpCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSRkMJCTEyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQwkJMTAKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJBUwkJIDcKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJQCQkgMworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkNECQkgMworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlJECQkgMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9URFBMCQkgMworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UREFMCSAgICAgICAgIDYJCisKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFdUUgkJIDEKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVENLRQkJIDEKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhQCQkgMQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFNSCQkxOQorI2VuZGlmCisKKworI2lmIGRlZmluZWQoQ0ZHX1NEUkFNX0NPTUJJTkVEKQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDCQkxMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMJCTEwCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQVMJCSA3CisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSUAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRAkJIDIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERQTAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTAkgICAgICAgICA2CQorCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RXVFIJCSAxCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RDS0UJCSAyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RYUAkJIDEKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhTUgkgICAgICAgIDIwCQorI2VuZGlmCisKKworCisvKgorICogTkFORCBDb25maWd1cmF0aW9uCisgKgorICogVGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZCBtYXkgaGF2ZSB0d28gTkFORCBkZXZpY2VzOgorICoKKyAqICAgMWEpIE1pY3JvbiBNVDI5RjJHMTZBQkRIQy1FVCBAIEdQTUMgQ1MwCisgKgorICogICAgICAtIDIgR2IgeCAxNiAoMjU2IE1pQikKKyAqICAgICAgLSAyIEtpQiBwYWdlIHNpemUKKyAqICAgICAgLSAxMjggS2lCIGVyYXNlIHNpemUKKyAqICAgICAgLSAxLjhWCisgKiAgICAgIC0gU0xDCisgKiAgICAgIC0gMS1iaXQgRUNDCisgKgorICogICAxYikgTWljcm9uIE1UMjlGMkcxNkFCQkVBSDQgQCBHUE1DIENTMAorICoKKyAqICAgICAgLSAyIEdiIHggMTYgKDI1NiBNaUIpCisgKiAgICAgIC0gMiBLaUIgcGFnZSBzaXplCisgKiAgICAgIC0gMTI4IEtpQiBlcmFzZSBzaXplCisgKiAgICAgIC0gMS44VgorICogICAgICAtIFNMQworICogICAgICAtIDQtYml0IEVDQworICoKKyAqICAgMikgU2Ftc3VuZyBLOUY0RzA4VTBDIEAgR1BNQyBDUzMKKyAqCisgKiAgICAgIC0gNCBHYiB4IDggKDUxMiBNaUIpCisgKiAgICAgIC0gMiBLaUIgcGFnZSBzaXplCisgKiAgICAgIC0gMTI4IEtpQiBlcmFzZSBzaXplCisgKiAgICAgIC0gMy4zVgorICogICAgICAtIFNMQworICovCisKKyNkZWZpbmUgQ0ZHX0dQTUNfTkFORAorI2RlZmluZSBDRkdfTU1DX05BTkQKKyN1bmRlZglDRkdfR1BNQ19PTkVOQU5ECisjdW5kZWYJQ0ZHX01NQ19PTkVOQU5ECisKKyN1bmRlZiBDRkdfR1BNQ19ERUJVRworCisjdW5kZWYJQ0ZHX05BTkRfSzlGNEcwOFUwQwkJLy8gU2Ftc3VuZyBLOUY0RzA4VTBDCisjZGVmaW5lIENGR19OQU5EX01UMjlGMkcxNgkJLy8gTWljcm9uIE1UMjlGMkcxNgorCisjdW5kZWYgIENGR19OQU5EX0VDQ18xQklUCisjZGVmaW5lIENGR19OQU5EX0VDQ180QklUCTEKKyN1bmRlZiAgQ0ZHX05BTkRfRUNDXzhCSVQKKworI2RlZmluZSBDRkdfR1BNQ19OQU5EX0JBU0UJTkFORF9CQVNFCisjZGVmaW5lIENGR19HUE1DX05BTkRfU0laRQlHUE1DX1NJWkVfMTI4TQorCisjaWYgZGVmaW5lZChDRkdfTkFORF9NVDI5RjJHMTYpCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzFfMAlNX05BTkRfR1BNQ19DT05GSUcxCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzJfMAlNX05BTkRfR1BNQ19DT05GSUcyCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzNfMAlNX05BTkRfR1BNQ19DT05GSUczCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzRfMAlNX05BTkRfR1BNQ19DT05GSUc0CisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzVfMAlNX05BTkRfR1BNQ19DT05GSUc1CisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzZfMAlNX05BTkRfR1BNQ19DT05GSUc2CisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzdfMAlcCisJKEdQTUNfQ09ORklHN19NQVNLQUREUkVTU19FTkNPREUoQ0ZHX0dQTUNfTkFORF9TSVpFKSB8IFwKKwkgR1BNQ19DT05GSUc3X0JBU0VBRERSRVNTX0VOQ09ERShDRkdfR1BNQ19OQU5EX0JBU0UpKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KSAqLworCisjaWYgZGVmaW5lZChDRkdfTkFORF9LOUY0RzA4VTBDKQorI2RlZmluZSBDRkdfR1BNQ19DT05GSUcxXzMJTV9OQU5EX0dQTUNfQ09ORklHMSAvL1NNTkFORF9HUE1DX0NPTkZJRzEKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHMl8zCU1fTkFORF9HUE1DX0NPTkZJRzIgLy9TTU5BTkRfR1BNQ19DT05GSUcyCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzNfMwlNX05BTkRfR1BNQ19DT05GSUczIC8vU01OQU5EX0dQTUNfQ09ORklHMworI2RlZmluZSBDRkdfR1BNQ19DT05GSUc0XzMJTV9OQU5EX0dQTUNfQ09ORklHNCAvL1NNTkFORF9HUE1DX0NPTkZJRzQKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHNV8zCU1fTkFORF9HUE1DX0NPTkZJRzUgLy9TTU5BTkRfR1BNQ19DT05GSUc1CisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzZfMwlNX05BTkRfR1BNQ19DT05GSUc2IC8vU01OQU5EX0dQTUNfQ09ORklHNgorI2RlZmluZSBDRkdfR1BNQ19DT05GSUc3XzMJXAorCShHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfRU5DT0RFKENGR19HUE1DX05BTkRfU0laRSkgfCBcCisJIEdQTUNfQ09ORklHN19CQVNFQUREUkVTU19FTkNPREUoQ0ZHX0dQTUNfTkFORF9CQVNFKSkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX0s5RjRHMDhVMEMpICovCisKKy8qCisgKiBBcmNoaXRlY3R1cmUsIHByb2Nlc3NvciBhbmQvb3IgYm9hcmQtc3BlY2lmaWMgTkFORCBhY2Nlc3MgbWFjcm9zCisgKiBhbmQgZHJpdmVyIHBhcmFtZXRlcnMuCisgKi8KKworI2lmIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KQorIyBkZWZpbmUgTkFORF8xNkJJVAorIyBkZWZpbmUgTkFORF9CTE9DS19TSVpFCSgxMjggPDwgMTApCisjZWxpZiBkZWZpbmVkKENGR19OQU5EX0s5RjRHMDhVMEMpCisjIHVuZGVmCU5BTkRfMTZCSVQKKyMgZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkoMTI4IDw8IDEwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KSAqLworCisjaWZkZWYgTkFORF8xNkJJVAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wKQorI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gR1BNQ19XUklURVBST1RFQ1RfSElHSDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH5HUE1DX1dSSVRFUFJPVEVDVF9ISUdIO30gd2hpbGUoMCkKKworI2Vsc2UgLyogdG8gc3VwcG9ydCA4LWJpdCBOQU5EIGRldmljZXMgKi8KKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wKTsKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IEdQTUNfV1JJVEVQUk9URUNUX0hJR0g7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+R1BNQ19XUklURVBST1RFQ1RfSElHSDt9IHdoaWxlKDApCisjZW5kaWYgLyogTkFORF8xNkJJVCAqLworCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkKKworLyoKKyAqIExvY2F0aW9uIHdoZXJlIHdlIGV4cGVjdCB0byBmaW5kIHRoZSBzZWNvbmQtc3RhZ2UgYm9vdCBsb2FkZXIgaW4KKyAqIHRoZSBib290IE5BTkQgZGV2aWNlLgorICoKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICBBbGlhcyBEZXNjcmlwdGlvbiAgICAgICAgICAgIFNpemUgICAgQmxvY2tzICBCbG9jayAgICAgQWRkcmVzcyAgICAgU2l6ZQorICogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgaXBsCSBYLUxvYWRlciBJbWFnZQkgICAgICAyNTYgS2lCICAgICAgMiAgICAgIDAJICAweDAwMDAwMDAwICAgIDAgQgorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgc3BsMAkgUHJpbWFyeSBVLUJvb3QgSW1hZ2UgMS41IE1pQiAgICAgMTIgICAgICAyCSAgMHgwMDA0MDAwMCAgMjU2IEtpQgorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgc3BsMQkgUmVzZXJ2ZWQgZm9yIEZ1dHVyZSAgMS41IE1pQiAgICAgMTIgICAgIDE0CSAgMHgwMDFDMDAwMCAxLjc1IE1pQgorICogICAgICAgICAgIFNlY29uZGFyeSBVLUJvb3QKKyAqICAgICAgICAgICBJbWFnZQorICogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2RlZmluZSBDRkdfTkFORF9CT09URVhURU5UMF9TVEFSVAkJMHgwMDA0MDAwMAorI2RlZmluZSBDRkdfTkFORF9CT09URVhURU5UMV9TVEFSVAkJMHgwMDFDMDAwMAorI2RlZmluZSBDRkdfTkFORF9CT09URVhURU5UX1NJWkUJCTB4MTgwMDAwCisKKyNpZmRlZiBDT05GSUdfQk9PVE1fSU1BR0UKKyNkZWZpbmUgQ09ORklHX05BTkRfQk9PVEVYVEVOVF9MSVNUCQl7IHsgQ0ZHX05BTkRfQk9PVEVYVEVOVDBfU1RBUlQsIFwKKwkJCQkJCQkJCQkJQ0ZHX05BTkRfQk9PVEVYVEVOVF9TSVpFIH0sCVwKKwkJCQkJCQkJCQkgIHsgQ0ZHX05BTkRfQk9PVEVYVEVOVDFfU1RBUlQsIFwKKwkJCQkJCQkJCQkJQ0ZHX05BTkRfQk9PVEVYVEVOVF9TSVpFIH0gfQorI2Vsc2UKKyNkZWZpbmUgQ09ORklHX05BTkRfQk9PVEVYVEVOVAkJCXsgQ0ZHX05BTkRfQk9PVEVYVEVOVDBfU1RBUlQsIFwKKwkJCQkJCQkJCQkgIENGR19OQU5EX0JPT1RFWFRFTlRfU0laRSB9CisjZW5kaWYKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworCisvKgorICogQ09ORklHX0JPT1RGSUxFIC0gVGhpcyBjYW4gYmUgdXNlZCB0byBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUKKyAqIHNlY29uZC1zdGFnZSBib290IGZpbGUgbG9hZGVkIGZyb20gU0QgY2FyZCBpZiB0aGUgc3lzdGVtIGhhcyBiZWVuCisgKiBjb25maWd1cmVkIHRvIGJvb3QgYXMgc3VjaC4KKyAqCisgKiBDT05GSUdfQk9PVEZJTEVfTElTVCAtIFRoaXMgY2FuIGJlIHVzZWQgdG8gYSBsaXN0IG9mIGRlZmF1bHQgdmFsdWVzCisgKiBmb3IgdGhlIHNlY29uZC1zdGFnZSBib290IGZpbGUgbG9hZGVkIGZyb20gU0QgY2FyZCBpZiB0aGUgc3lzdGVtIGhhcyBiZWVuCisgKiBjb25maWd1cmVkIHRvIGJvb3QgYXMgc3VjaC4KKyAqCisgKiBUcnkgdG8gYm9vdCBhbiAnbWtpbWFnZScgdS1ib290IGltYWdlIGZpcnN0OyBvdGhlcndpc2UsIHRyeSB0byBib290IGEKKyAqIHJhdyB1LWJvb3QgYmluYXJ5IGlmIGl0IGV4aXN0cyBhcyBhIGZhbGxiYWNrLgorICovCisjaWZkZWYgQ09ORklHX0JPT1RNX0lNQUdFCisjZGVmaW5lIENPTkZJR19CT09URklMRV9MSVNUIAkJCXsgInUtYm9vdC5pbWciLCAidS1ib290LmJpbiIgfQorI2Vsc2UKKyNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkJCQkidS1ib290LmltZyIKKyNlbmRpZgorCisvKgorICogTG9jYXRpb24gaW4gU0RSQU0gd2hlcmUgdGhlIHNlY29uZC1zdGFnZSBib290IGxvYWRlciB3aWxsIGJlIGxvYWRlZAorICogdG8gYW5kIGV4ZWN1dGVkIGZyb20uCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSICAgICAgICAgICAgIAkJMHg4MDAwODAwMAorCisjZW5kaWYgLyogX19ESUFNT05EX0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9qNDktdXNiLWxvYWRlci5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2o0OS11c2ItbG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxNGM3YgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9qNDktdXNiLWxvYWRlci5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTIgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB4LWxvYWRlciBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUKKyAqICAgICAgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IEo0OSBib2FyZC4gIFRoZSBpdGVtcyBiZWxvdyBzaG91bGQKKyAqICAgICAgYmUgdXBkYXRlZCBhcyB0aGUgaGFyZHdhcmUgc2V0dGxlcy4KKyAqCisgKiAgICAgIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpOgorICogICAgICAgIC0gU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgNjQgTWlCIEREUiBTRFJBTQorICoKKyAqICAgICAgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyIChHUE1DKToKKyAqICAgICAgICAtIE1pY3JvbiBNVDI5RjJHMTZBQkRIQy1FVCAyNTYgTWlCIFNMQyBOQU5EIEZsYXNoIChEZXZlbG9wbWVudCkKKyAqICAgICAgICAtIE1pY3JvbiBNVDI5RjJHMTZBQkJFQUg0IDI1NiBNaUIgU0xDIE5BTkQgRmxhc2ggKE5vbi1kZXZlbG9wbWVudCkKKyAqICAgICAgICAtIFNhbXN1bmcgSzlGNEcwOFUwQyA1MTIgTWlCIFNMQyBOQU5EIEZsYXNoIChEZXZlbG9wbWVudCkKKyAqICAgICAgICAtIFNNU0MgTEFOOTIyMCAxMC8xMDAgTWJpdCBFdGhlcm5ldCBNQUMgYW5kIFBIWSAoRGV2ZWxvcG1lbnQpCisgKgorICogICAgICBNdWx0aW1lZGlhIENhcmQgKE1NQykgSW50ZXJmYWNlOgorICogICAgICAgIC0gTW9sZXggNTAwOTk4LTA5MDAgU2VjdXJlIERpZ2l0YWwgKFNEKSBDb25uZWN0b3IKKyAqICAgICAgICAtIFRJIFdMMTI3MCBXaXJlbGVzcyBMQU4gKFdMQU4pIE1vZHVsZQorICoKKyAqICAgICAgRGlzcGxheSBTdWJzeXN0ZW0gKERTUyk6CisgKiAgICAgICAgLSBTYW1zdW5nIExNUzM1MERGMDMgSFZHQSAoMzIwIHggNDgwKSBMQ00gKERldmVsb3BtZW50IGFuZCBQcm90b3R5cGUpCisgKiAgICAgICAgLSBUaWFubWEgVE0wMjVaRFowMSAoMzIwIHggMzIwKSBMQ00gKFByb2R1Y3Rpb24pCisgKgorICogICAgICBDYW1lcmEgSW1hZ2UgU2lnbmFsIFByb2Nlc3NvcjoKKyAqICAgICAgICAtIFVudXNlZAorICoKKyAqICAgICAgVUFSVCBDb250cm9sbGVyOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgICAgICAqIEhlYWQgVW5pdCBTZXJpYWwgQ29uc29sZQorICoKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAgICAgKiBaaWdCZWUgV2lyZWxlc3MgTW9kdWxlCisgKgorICogICAgICBNdWx0aWNoYW5uZWwgQnVmZmVyZWQgU2VyaWFsIFBvcnQgKE1jQlNQKToKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAtIENoYW5uZWwgMzoKKyAqICAgICAgICAtIENoYW5uZWwgNDoKKyAqICAgICAgICAtIENoYW5uZWwgNToKKyAqCisgKiAgICAgIE11bHRpY2hhbm5lbCBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKE1jU1BJKToKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAtIENoYW5uZWwgMzoKKyAqCisgKiAgICAgIEdQSU8gQ29udHJvbGxlcjoKKyAqICAgICAgICAtIEJhY2twbGF0ZSBEZXRlY3QKKyAqICAgICAgICAtIFppZ0JlZQorICovCisKKyNpZm5kZWYgX19KNDlfQ09ORklHX0gKKyNkZWZpbmUgX19KNDlfQ09ORklHX0gKKworI2luY2x1ZGUgImRpYW1vbmQuaCIKKworLyoKKyAqIEFzc2VydCB0aGUgYm9hcmQgdHlwZShzKSB3ZSBhcmUgYnVpbGRpbmcgZm9yLgorICoKKyAqLworI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfUFJPVE9UWVBFCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9FVlQKKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX0RWVAorI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfUFJFX1BWVAorI2RlZmluZSBDT05GSUdfSjQ5X0JPQVJEX01VTFRJCQkJMQorCisjZGVmaW5lIENPTkZJR19VU0IgMQorCisjZW5kaWYgLyogX19KNDlfQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2o0OS5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2o0OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NjU4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvajQ5LmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMiBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHgtbG9hZGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHRoZQorICogICAgICBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgSjQ5IGJvYXJkLiAgVGhlIGl0ZW1zIGJlbG93IHNob3VsZAorICogICAgICBiZSB1cGRhdGVkIGFzIHRoZSBoYXJkd2FyZSBzZXR0bGVzLgorICoKKyAqICAgICAgU0RSQU0gQ29udHJvbGxlciAoU0RSQyk6CisgKiAgICAgICAgLSBTYW1zdW5nIEs0WDUxMTYzUEktRkNHNiA2NCBNaUIgRERSIFNEUkFNCisgKgorICogICAgICBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpOgorICogICAgICAgIC0gTWljcm9uIE1UMjlGMkcxNkFCREhDLUVUIDI1NiBNaUIgU0xDIE5BTkQgRmxhc2ggKERldmVsb3BtZW50KQorICogICAgICAgIC0gTWljcm9uIE1UMjlGMkcxNkFCQkVBSDQgMjU2IE1pQiBTTEMgTkFORCBGbGFzaCAoTm9uLWRldmVsb3BtZW50KQorICogICAgICAgIC0gU2Ftc3VuZyBLOUY0RzA4VTBDIDUxMiBNaUIgU0xDIE5BTkQgRmxhc2ggKERldmVsb3BtZW50KQorICogICAgICAgIC0gU01TQyBMQU45MjIwIDEwLzEwMCBNYml0IEV0aGVybmV0IE1BQyBhbmQgUEhZIChEZXZlbG9wbWVudCkKKyAqCisgKiAgICAgIE11bHRpbWVkaWEgQ2FyZCAoTU1DKSBJbnRlcmZhY2U6CisgKiAgICAgICAgLSBNb2xleCA1MDA5OTgtMDkwMCBTZWN1cmUgRGlnaXRhbCAoU0QpIENvbm5lY3RvcgorICogICAgICAgIC0gVEkgV0wxMjcwIFdpcmVsZXNzIExBTiAoV0xBTikgTW9kdWxlCisgKgorICogICAgICBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKToKKyAqICAgICAgICAtIFNhbXN1bmcgTE1TMzUwREYwMyBIVkdBICgzMjAgeCA0ODApIExDTSAoRGV2ZWxvcG1lbnQgYW5kIFByb3RvdHlwZSkKKyAqICAgICAgICAtIFRpYW5tYSBUTTAyNVpEWjAxICgzMjAgeCAzMjApIExDTSAoUHJvZHVjdGlvbikKKyAqCisgKiAgICAgIENhbWVyYSBJbWFnZSBTaWduYWwgUHJvY2Vzc29yOgorICogICAgICAgIC0gVW51c2VkCisgKgorICogICAgICBVQVJUIENvbnRyb2xsZXI6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgICAgICogSGVhZCBVbml0IFNlcmlhbCBDb25zb2xlCisgKgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgICAgICAqIFppZ0JlZSBXaXJlbGVzcyBNb2R1bGUKKyAqCisgKiAgICAgIE11bHRpY2hhbm5lbCBCdWZmZXJlZCBTZXJpYWwgUG9ydCAoTWNCU1ApOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgIC0gQ2hhbm5lbCAzOgorICogICAgICAgIC0gQ2hhbm5lbCA0OgorICogICAgICAgIC0gQ2hhbm5lbCA1OgorICoKKyAqICAgICAgTXVsdGljaGFubmVsIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoTWNTUEkpOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgIC0gQ2hhbm5lbCAzOgorICoKKyAqICAgICAgR1BJTyBDb250cm9sbGVyOgorICogICAgICAgIC0gQmFja3BsYXRlIERldGVjdAorICogICAgICAgIC0gWmlnQmVlCisgKi8KKworI2lmbmRlZiBfX0o0OV9DT05GSUdfSAorI2RlZmluZSBfX0o0OV9DT05GSUdfSAorCisjaW5jbHVkZSAiZGlhbW9uZC5oIgorCisvKgorICogQXNzZXJ0IHRoZSBib2FyZCB0eXBlKHMpIHdlIGFyZSBidWlsZGluZyBmb3IuCisgKgorICovCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9QUk9UT1RZUEUKKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX0VWVAorI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfRFZUCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9QUkVfUFZUCisjZGVmaW5lIENPTkZJR19KNDlfQk9BUkRfTVVMVEkJCQkxCisKKyNlbmRpZiAvKiBfX0o0OV9DT05GSUdfSCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE1MTAuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZGVhY2UKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE1MTAuaApAQCAtMCwwICsxLDY5OCBAQAorLyoKKyAqCisgKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KKyAqICAgT01BUCBoYXJkd2FyZSBtYXAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgUmlkZ2VSdW4sIEluYy4gKGh0dHA6Ly93d3cucmlkZ2VydW4uY29tKQorICogQXV0aG9yOiBSaWRnZVJ1biwgSW5jLgorICoJICAgR3JlZyBMb25ub24gKGdsb25ub25AcmlkZ2VydW4uY29tKSBvciBpbmZvQHJpZGdlcnVuLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mCSB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQlMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRAkgIGBgQVMJSVMnJyBBTkQgICBBTlkJRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywJICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiAgTk8JRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUJIExJQUJMRSBGT1IgQU5ZCSAgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRAkgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUwlPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogIFVTRSwgREFUQSwJT1IgUFJPRklUUzsgT1IJQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgkgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8YXNtL2FyY2gvc2l6ZXMuaD4KKworLyoKKyAgVGhlcmUgYXJlIDIgc2V0cyBvZiBnZW5lcmFsIEkvTyAtLT4KKyAgMS4gR1BJTyAoc2hhcmVkIGJldHdlZW4gQVJNICYgRFNQLCBjb25maWd1cmVkIGJ5IEFSTSkKKyAgMi4gTVBVSU8gd2hpY2ggY2FuIGJlIHVzZWQgb25seSBieSB0aGUgQVJNLgorCisgIEJhc2UgYWRkcmVzcyBGRkZCOjUwMDAgaXMgd2hlcmUgdGhlIEFSTSBhY2Nlc3NlcyB0aGUgTVBVSU8gY29udHJvbCByZWdpc3RlcnMKKyAgKHNlZSA3LjIuMiBvZiB0aGUgVFJNIGZvciBNUFVJTyByZWcgZGVmaW5pdGlvbnMpLgorCisgIEJhc2UgYWRkcmVzcyBFMTAxOjUwMDAgaXMgcmVzZXJ2ZWQgZm9yIEFSTSBhY2Nlc3Mgb2YgdGhlIHNhbWUgTVBVSU8gY29udHJvbAorICByZWdzLCBidXQgdmlhIHRoZSBEU1AgSS9PIG1hcC4gIFRoaXMgYWRkcmVzcyBpcyB1bmF2YWlsYWJsZSBvbiAxNTEwLgorCisgIEJhc2UgYWRkcmVzcyBGRkZDOkUwMDAgaXMgd2hlcmUgdGhlIEFSTSBhY2Nlc3NlcyB0aGUgR1BJTyBjb25maWcgcmVnaXN0ZXJzCisgIGRpcmVjdGx5IHZpYSBpdHMgb3duIHBlcmlwaGVyYWwgYnVzLgorCisgIEJhc2UgYWRkcmVzcyBFMTAxOkUwMDAgaXMgd2hlcmUgdGhlIEFSTSBjYW4gYWNjZXNzIHRoZSBzYW1lIEdQSU8gY29uZmlnCisgIHJlZ2lzdGVycywgYnV0IHRoZSBhY2Nlc3MgdGFrZXMgcGxhY2UgdGhyb3VnaCB0aGUgQVJNIHBvcnQgaW50ZXJmYWNlIChjYWxsZWQKKyAgQVBJIG9yIE1QVUkpIHZpYSB0aGUgRFNQJ3MgcGVyaXBoZXJhbCBidXMgKERTUCBJL08gc3BhY2UpLgorCisgIFRoZXJlZm9yZSwgdGhlIEFSTSBzaG91bGQgc2V0dXAgdGhlIEdQSU8gcmVncyB0aHJ1IHRoZSBGRkZDOkUwMDAgYWRkcmVzc2VzCisgIGluc3RlYWQgb2YgdGhlIEUxMDE6RTAwMCBhZGRyZXNzZXMuICBUaGUgRFNQIGhhcyBvbmx5IHJlYWQgYWNjZXNzIG9mIHRoZSBwaW4KKyAgY29udHJvbCByZWdpc3Rlciwgc28gdGhpcyBtYXkgZXhwbGFpbiB0aGUgaW5hYmlsaXR5IHRvIHdyaXRlIHRvIEUxMDE6RTAxOC4KKyAgVHJ5IGFjY2Vzc2luZyBwaW4gY29udHJvbCByZWcgYXQgRkZGQzpFMDE4LgorICovCisjZGVmaW5lIE9NQVAxNTEwX0dQSU9fQkFTRQkgMHhmZmZjZTAwMAorI2RlZmluZSBPTUFQMTUxMF9HUElPX1NUQVJUCSBPTUFQMTUxMF9HUElPX0JBU0UKKyNkZWZpbmUgT01BUDE1MTBfR1BJT19TSVpFCSBTWl80SworCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQMV9CQVNFCSAweEUxMDExMDAwCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQMV9TSVpFCSBTWl80SworI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDFfU1RBUlQJIDB4RTEwMTEwMDAKKworI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDJfQkFTRQkgMHhGRkZCMTAwMAorCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQM19CQVNFCSAweEUxMDE3MDAwCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQM19TSVpFCSBTWl80SworI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDNfU1RBUlQJIDB4RTEwMTcwMDAKKworLyoKKyAqIFdoZXJlJ3MgdGhlIGZsdXNoIGFkZHJlc3MgKGZvciBmbHVzaGluZyBEIGFuZCBJIGNhY2hlPykKKyAqLworI2RlZmluZSBGTFVTSF9CQVNFCQkweGRmMDAwMDAwCisjZGVmaW5lIEZMVVNIX0JBU0VfUEhZUyAweDAwMDAwMDAwCisKKyNpZm5kZWYgX19BU1NFTUJMRVJfXworCisjZGVmaW5lIFBDSU9fQkFTRQkJMAorCisvKgorICogUkFNIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTUFQVE9QSFlTKGEpCQkoKHVuc2lnbmVkIGxvbmcpKGEpIC0gUEFHRV9PRkZTRVQpCisjZGVmaW5lIEtFUk5UT1BIWVMoYSkJCSgodW5zaWduZWQgbG9uZykoJmEpKQorI2RlZmluZSBLRVJORUxfQkFTRQkJKDB4MTAwMDgwMDApCisjZW5kaWYKKworLyogbWFjcm8gdG8gZ2V0IGF0IElPIHNwYWNlIHdoZW4gcnVubmluZyB2aXJ0dWFsbHkgKi8KKyNkZWZpbmUgSU9fQUREUkVTUyh4KSAoKHgpKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgT01BUDE1MTAgc3lzdGVtIHJlZ2lzdGVycworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgT01BUDE1MTBfVUFSVDFfQkFTRQkgICAgMHhmZmZiMDAwMAkgLyogIkJMVUVUT09USC1VQVJUIiAqLworI2RlZmluZSBPTUFQMTUxMF9VQVJUMl9CQVNFCSAgICAweGZmZmIwODAwCSAvKiAiTU9ERU0tVUFSVCIgKi8KKyNkZWZpbmUgT01BUDE1MTBfUlRDX0JBU0UJICAgIDB4ZmZmYjQ4MDAJIC8qIFJUQyAqLworI2RlZmluZSBPTUFQMTUxMF9VQVJUM19CQVNFCSAgICAweGZmZmI5ODAwCSAvKiBTaGFyZWQgTVBVL0RTUCBVQVJUICovCisjZGVmaW5lIE9NQVAxNTEwX0NPTV9NQ0JTUDJfQkFTRSAgICAweGZmZmYxMDAwCSAvKiBDb20gTWNCU1AyICovCisjZGVmaW5lIE9NQVAxNTEwX0FVRElPX01DQlNQX0JBU0UgICAweGZmZmYxODAwCSAvKiBBdWRpbyBNY0JTUDIgKi8KKyNkZWZpbmUgT01BUDE1MTBfQVJNSU9fQkFTRQkgICAgMHhmZmZiNTAwMAkgLyoga2V5Ym9hcmQvZ3BpbyAqLworCisvKgorICogT01BUDE1MTAgVUFSVDMgUmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBPTUFQX01QVV9VQVJUM19CQVNFICAweEZGRkI5ODAwIC8qIFVBUlQzIHRocm91Z2ggTVBVIGJ1cyAqLworCisvKiBVQVJUMyBSZWdpc3RlcnMgTWFwaW5nIHRocm91Z2ggTVBVIGJ1cyAqLworCisjZGVmaW5lIFVBUlQzX1JIUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAwKQorI2RlZmluZSBVQVJUM19USFIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMCkKKyNkZWZpbmUgVUFSVDNfRExMCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDApCisjZGVmaW5lIFVBUlQzX0lFUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyA0KQorI2RlZmluZSBVQVJUM19ETEgJIChPTUFQX01QVV9VQVJUM19CQVNFICsgNCkKKyNkZWZpbmUgVUFSVDNfSUlSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDgpCisjZGVmaW5lIFVBUlQzX0ZDUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyA4KQorI2RlZmluZSBVQVJUM19FRlIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgOCkKKyNkZWZpbmUgVUFSVDNfTENSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MEMpCisjZGVmaW5lIFVBUlQzX01DUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDEwKQorI2RlZmluZSBVQVJUM19YT04xX0FERFIxIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxMCkKKyNkZWZpbmUgVUFSVDNfWE9OMl9BRERSMiAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MTQpCisjZGVmaW5lIFVBUlQzX0xTUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDE0KQorI2RlZmluZSBVQVJUM19UQ1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxOCkKKyNkZWZpbmUgVUFSVDNfTVNSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MTgpCisjZGVmaW5lIFVBUlQzX1hPRkYxCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MTgpCisjZGVmaW5lIFVBUlQzX1hPRkYyCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MUMpCisjZGVmaW5lIFVBUlQzX1NQUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDFDKQorI2RlZmluZSBVQVJUM19UTFIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxQykKKyNkZWZpbmUgVUFSVDNfTURSMQkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDIwKQorI2RlZmluZSBVQVJUM19NRFIyCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MjQpCisjZGVmaW5lIFVBUlQzX1NGTFNSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MjgpCisjZGVmaW5lIFVBUlQzX1RYRkxMCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MjgpCisjZGVmaW5lIFVBUlQzX1JFU1VNRQkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDJDKQorI2RlZmluZSBVQVJUM19UWEZMSAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDJDKQorI2RlZmluZSBVQVJUM19TRlJFR0wJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgzMCkKKyNkZWZpbmUgVUFSVDNfUlhGTEwJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgzMCkKKyNkZWZpbmUgVUFSVDNfU0ZSRUdICSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MzQpCisjZGVmaW5lIFVBUlQzX1JYRkxICSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MzQpCisjZGVmaW5lIFVBUlQzX0JMUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDM4KQorI2RlZmluZSBVQVJUM19BQ1JFRwkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDNDKQorI2RlZmluZSBVQVJUM19ESVYxNgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDNDKQorI2RlZmluZSBVQVJUM19TQ1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHg0MCkKKyNkZWZpbmUgVUFSVDNfU1NSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4NDQpCisjZGVmaW5lIFVBUlQzX0VCTFIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHg0OCkKKyNkZWZpbmUgVUFSVDNfT1NDXzEyTV9TRUwgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDRDKQorI2RlZmluZSBVQVJUM19NVlIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHg1MCkKKworLyoKKyAqIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF8wCQkweGZmZmUxMDAwCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfMQkJMHhmZmZlMTAwNAorI2RlZmluZSBGVU5DX01VWF9DVFJMXzIJCTB4ZmZmZTEwMDgKKyNkZWZpbmUgQ09NUF9NT0RFX0NUUkxfMAkweGZmZmUxMDBjCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfMwkJMHhmZmZlMTAxMAorI2RlZmluZSBGVU5DX01VWF9DVFJMXzQJCTB4ZmZmZTEwMTQKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF81CQkweGZmZmUxMDE4CisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfNgkJMHhmZmZlMTAxQworI2RlZmluZSBGVU5DX01VWF9DVFJMXzcJCTB4ZmZmZTEwMjAKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF84CQkweGZmZmUxMDI0CisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfOQkJMHhmZmZlMTAyOAorI2RlZmluZSBGVU5DX01VWF9DVFJMX0EJCTB4ZmZmZTEwMkMKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF9CCQkweGZmZmUxMDMwCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfQwkJMHhmZmZlMTAzNAorI2RlZmluZSBGVU5DX01VWF9DVFJMX0QJCTB4ZmZmZTEwMzgKKyNkZWZpbmUgUFVMTF9EV05fQ1RSTF8wCQkweGZmZmUxMDQwCisjZGVmaW5lIFBVTExfRFdOX0NUUkxfMQkJMHhmZmZlMTA0NAorI2RlZmluZSBQVUxMX0RXTl9DVFJMXzIJCTB4ZmZmZTEwNDgKKyNkZWZpbmUgUFVMTF9EV05fQ1RSTF8zCQkweGZmZmUxMDRjCisjZGVmaW5lIEdBVEVfSU5IX0NUUkxfMAkJMHhmZmZlMTA1MAorI2RlZmluZSBWT0xUQUdFX0NUUkxfMAkJMHhmZmZlMTA2MAorI2RlZmluZSBURVNUX0RCR19DVFJMXzAJCTB4ZmZmZTEwNzAKKworI2RlZmluZSBNT0RfQ09ORl9DVFJMXzAJCTB4ZmZmZTEwODAKKworLyogMTYxMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjaWYgZGVmaW5lZChDT05GSUdfT01BUDE2MTApIHx8IGRlZmluZWQoQ09ORklHX09NQVAxNzEwKQorI2RlZmluZSBVU0JfT1RHX0NUUkwJCTB4RkZGQjA0MEMKKyNkZWZpbmUgVVNCX1RSQU5TQ0VJVkVSX0NUUkwJMHhGRkZFMTA2NAorI2RlZmluZSBQVUxMX0RXTl9DVFJMXzQJCTB4RkZGRTEwQUMKKyNkZWZpbmUgUFVfUERfU0VMXzAJCTB4RkZGRTEwQjQKKyNkZWZpbmUgUFVfUERfU0VMXzEJCTB4RkZGRTEwQjgKKyNkZWZpbmUgUFVfUERfU0VMXzIJCTB4RkZGRTEwQkMKKyNkZWZpbmUgUFVfUERfU0VMXzMJCTB4RkZGRTEwQzAKKyNkZWZpbmUgUFVfUERfU0VMXzQJCTB4RkZGRTEwQzQKKworI2VuZGlmCisvKgorICogVHJhZmZpYyBDb250cm9sbGVyIE1lbW9yeSBJbnRlcmZhY2UgUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgVENNSUZfQkFTRQkJMHhmZmZlY2MwMAorI2RlZmluZSBJTUlGX1BSSU8JCShUQ01JRl9CQVNFICsgMHgwMCkKKyNkZWZpbmUgRU1JRlNfUFJJT19SRUcJCShUQ01JRl9CQVNFICsgMHgwNCkKKyNkZWZpbmUgRU1JRkZfUFJJT19SRUcJCShUQ01JRl9CQVNFICsgMHgwOCkKKyNkZWZpbmUgRU1JRlNfQ09ORklHX1JFRwkoVENNSUZfQkFTRSArIDB4MGMpCisjZGVmaW5lIEVNSUZTX0NTMF9DT05GSUcJKFRDTUlGX0JBU0UgKyAweDEwKQorI2RlZmluZSBFTUlGU19DUzFfQ09ORklHCShUQ01JRl9CQVNFICsgMHgxNCkKKyNkZWZpbmUgRU1JRlNfQ1MyX0NPTkZJRwkoVENNSUZfQkFTRSArIDB4MTgpCisjZGVmaW5lIEVNSUZTX0NTM19DT05GSUcJKFRDTUlGX0JBU0UgKyAweDFjKQorI2RlZmluZSBFTUlGRl9TRFJBTV9DT05GSUcJKFRDTUlGX0JBU0UgKyAweDIwKQorI2RlZmluZSBFTUlGRl9NUlMJCShUQ01JRl9CQVNFICsgMHgyNCkKKyNkZWZpbmUgVENfVElNRU9VVDEJCShUQ01JRl9CQVNFICsgMHgyOCkKKyNkZWZpbmUgVENfVElNRU9VVDIJCShUQ01JRl9CQVNFICsgMHgyYykKKyNkZWZpbmUgVENfVElNRU9VVDMJCShUQ01JRl9CQVNFICsgMHgzMCkKKyNkZWZpbmUgVENfRU5ESUFOSVNNCQkoVENNSUZfQkFTRSArIDB4MzQpCisjZGVmaW5lIEVNSUZGX1NEUkFNX0NPTkZJR18yCShUQ01JRl9CQVNFICsgMHgzYykKKyNkZWZpbmUgRU1JRl9DRkdfRFlOQU1JQ19XUwkoVENNSUZfQkFTRSArIDB4NDApCisKKy8qCisgKiBMQ0QgUGFuZWwKKyAqLworI2RlZmluZSBUSTkyNV9MQ0RfQkFTRQkJMHhGRkZFQzAwMAorI2RlZmluZSBUSTkyNV9MQ0RfQ09OVFJPTAkoVEk5MjVfTENEX0JBU0UpCisjZGVmaW5lIFRJOTI1X0xDRF9USU1JTkcwCShUSTkyNV9MQ0RfQkFTRSsweDQpCisjZGVmaW5lIFRJOTI1X0xDRF9USU1JTkcxCShUSTkyNV9MQ0RfQkFTRSsweDgpCisjZGVmaW5lIFRJOTI1X0xDRF9USU1JTkcyCShUSTkyNV9MQ0RfQkFTRSsweGMpCisjZGVmaW5lIFRJOTI1X0xDRF9TVEFUVVMJKFRJOTI1X0xDRF9CQVNFKzB4MTApCisjZGVmaW5lIFRJOTI1X0xDRF9TVUJQQU5FTAkoVEk5MjVfTENEX0JBU0UrMHgxNCkKKworI2RlZmluZSBPTUFQX0xDRF9DT05UUk9MCVRJOTI1X0xDRF9DT05UUk9MCisKKy8qCisgKiBNTUMvU0QgSG9zdCBDb250cm9sbGVyIFJlZ2lzdGVycworICovCisKKyNkZWZpbmUgT01BUF9NTUNfQ01ECSAweEZGRkI3ODAwIC8qIE1NQyBDb21tYW5kICovCisjZGVmaW5lIE9NQVBfTU1DX0FSR0wJIDB4RkZGQjc4MDQgLyogTU1DIGFyZ3VtZW50IGxvdyAqLworI2RlZmluZSBPTUFQX01NQ19BUkdICSAweEZGRkI3ODA4IC8qIE1NQyBhcmd1bWVudCBoaWdoICovCisjZGVmaW5lIE9NQVBfTU1DX0NPTgkgMHhGRkZCNzgwQyAvKiBNTUMgc3lzdGVtIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgT01BUF9NTUNfU1RBVAkgMHhGRkZCNzgxMCAvKiBNTUMgc3RhdHVzICovCisjZGVmaW5lIE9NQVBfTU1DX0lFCSAweEZGRkI3ODE0IC8qIE1NQyBzeXN0ZW0gaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBPTUFQX01NQ19DVE8JIDB4RkZGQjc4MTggLyogTU1DIGNvbW1hbmQgdGltZS1vdXQgKi8KKyNkZWZpbmUgT01BUF9NTUNfRFRPCSAweEZGRkI3ODFDIC8qIE1NQyBkYXRhIHRpbWUtb3V0ICovCisjZGVmaW5lIE9NQVBfTU1DX0RBVEEJIDB4RkZGQjc4MjAgLyogTU1DIFRYL1JYIEZJRk8gZGF0YSAqLworI2RlZmluZSBPTUFQX01NQ19CTEVOCSAweEZGRkI3ODI0IC8qIE1NQyBibG9jayBsZW5ndGggKi8KKyNkZWZpbmUgT01BUF9NTUNfTkJMSwkgMHhGRkZCNzgyOCAvKiBNTUMgbnVtYmVyIG9mIGJsb2NrcyAqLworI2RlZmluZSBPTUFQX01NQ19CVUYJIDB4RkZGQjc4MkMgLyogTU1DIGJ1ZmZlciBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE9NQVBfTU1DX1NQSQkgMHhGRkZCNzgzMCAvKiBNTUMgc2VyaWFsIHBvcnQgaW50ZXJmYWNlICovCisjZGVmaW5lIE9NQVBfTU1DX1NESU8JIDB4RkZGQjc4MzQgLyogTU1DIFNESU8gbW9kZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE9NQVBfTU1DX1NZU1QJIDB4RkZGQjc4MzggLyogTU1DIHN5c3RlbSB0ZXN0ICovCisjZGVmaW5lIE9NQVBfTU1DX1JFVgkgMHhGRkZCNzgzQyAvKiBNTUMgbW9kdWxlIHZlcnNpb24gKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQMAkgMHhGRkZCNzg0MCAvKiBNTUMgY29tbWFuZCByZXNwb25zZSAwICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDEJIDB4RkZGQjc4NDQgLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgMSAqLworI2RlZmluZSBPTUFQX01NQ19SU1AyCSAweEZGRkI3ODQ4IC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDIgKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQMwkgMHhGRkZCNzg0QyAvKiBNTUMgY29tbWFuZCByZXNwb25zZSAzICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDQJIDB4RkZGQjc4NTAgLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgNCAqLworI2RlZmluZSBPTUFQX01NQ19SU1A1CSAweEZGRkI3ODU0IC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDUgKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQNgkgMHhGRkZCNzg1OCAvKiBNTUMgY29tbWFuZCByZXNwb25zZSA2ICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDcJIDB4RkZGQjc4NUMgLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgNCAqLworCisvKiBNTUMgbWFza3MgKi8KKworI2RlZmluZSBPTUFQX01NQ19FTkRfT0ZfQ01ECSgxIDw8IDApCS8qIEVuZCBvZiBjb21tYW5kIHBoYXNlICovCisjZGVmaW5lIE9NQVBfTU1DX0NBUkRfQlVTWQkoMSA8PCAyKQkvKiBDYXJkIGVudGVyIGJ1c3kgc3RhdGUgKi8KKyNkZWZpbmUgT01BUF9NTUNfQkxPQ0tfUlMJKDEgPDwgMykJLyogQmxvY2sgcmVjZWl2ZWQvc2VudCAqLworI2RlZmluZSBPTUFQX01NQ19FT0ZfQlVTWQkoMSA8PCA0KQkvKiBDYXJkIGV4aXQgYnVzeSBzdGF0ZSAqLworI2RlZmluZSBPTUFQX01NQ19EQVRBX1RJTUVPVVQJKDEgPDwgNSkJLyogRGF0YSByZXNwb25zZSB0aW1lLW91dCAqLworI2RlZmluZSBPTUFQX01NQ19EQVRBX0NSQwkoMSA8PCA2KQkvKiBEYXRlIENSQyBlcnJvciAqLworI2RlZmluZSBPTUFQX01NQ19DTURfVElNRU9VVAkoMSA8PCA3KQkvKiBDb21tYW5kIHJlc3BvbnNlIHRpbWUtb3V0ICovCisjZGVmaW5lIE9NQVBfTU1DX0NNRF9DUkMJKDEgPDwgOCkJLyogQ29tbWFuZCBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgT01BUF9NTUNfQV9GVUxMCQkoMSA8PCAxMCkJLyogQnVmZmVyIGFsbW9zdCBmdWxsICovCisjZGVmaW5lIE9NQVBfTU1DX0FfRU1QVFkJKDEgPDwgMTEpCS8qIEJ1ZmZlciBhbG1vc3QgZW1wdHkgKi8KKyNkZWZpbmUgT01BUF9NTUNfT0NSX0JVU1kJKDEgPDwgMTIpCS8qIE9DUiBidXN5ICovCisjZGVmaW5lIE9NQVBfTU1DX0NBUkRfSVJRCSgxIDw8IDEzKQkvKiBDYXJkIElSUSByZWNlaXZlZCAqLworI2RlZmluZSBPTUFQX01NQ19DQVJEX0VSUgkoMSA8PCAxNCkJLyogQ2FyZCBzdGF0dXMgZXJyb3IgaW4gcmVzcG9uc2UgKi8KKworLyogMi45LjIgTVBVSSBJbnRlcmZhY2UgUmVnaXN0ZXJzIEZGRkU6QzkwMCAqLworCisjZGVmaW5lIE1QVUlfQ1RSTF9SRUcJCSh2b2xhdGlsZSBfX3UzMiAqKSgweGZmZmVjOTAwKQorI2RlZmluZSBNUFVJX0RFQlVHX0FERFIJCSh2b2xhdGlsZSBfX3UzMiAqKSgweGZmZmVjOTA0KQorI2RlZmluZSBNUFVJX0RFQlVHX0RBVEEJCSh2b2xhdGlsZSBfX3UzMiAqKSgweGZmZmVjOTA4KQorI2RlZmluZSBNUFVJX0RFQlVHX0ZMQUcJCSh2b2xhdGlsZSBfX3UxNiAqKSgweGZmZmVjOTBjKQorI2RlZmluZSBNUFVJX1NUQVRVU19SRUcJCSh2b2xhdGlsZSBfX3UxNiAqKSgweGZmZmVjOTEwKQorI2RlZmluZSBNUFVJX0RTUF9TVEFUVVNfUkVHCSh2b2xhdGlsZSBfX3UxNiAqKSgweGZmZmVjOTE0KQorI2RlZmluZSBNUFVJX0RTUF9CT09UX0NPTkZJRwkodm9sYXRpbGUgX191MTYgKikoMHhmZmZlYzkxOCkKKyNkZWZpbmUgTVBVSV9EU1BfQVBJX0NPTkZJRwkodm9sYXRpbGUgX191MTYgKikoMHhmZmZlYzkxYykKKworLyogMi45LjYgVHJhZmZpYyBDb250cm9sbGVyIE1lbW9yeSBJbnRlcmZhY2UgUmVnaXN0ZXJzOiAqLworI2RlZmluZSBPTUFQX0lNSUZfUFJJT19SRUcJCTB4ZmZmZWNjMDAKKyNkZWZpbmUgT01BUF9FTUlGU19QUklPX1JFRwkJMHhmZmZlY2MwNAorI2RlZmluZSBPTUFQX0VNSUZGX1BSSU9fUkVHCQkweGZmZmVjYzA4CisjZGVmaW5lIE9NQVBfRU1JRlNfQ09ORklHX1JFRwkJMHhmZmZlY2MwYworI2RlZmluZSBPTUFQX0VNSUZTX0NTMF9DT05GSUcJCTB4ZmZmZWNjMTAKKyNkZWZpbmUgT01BUF9FTUlGU19DUzFfQ09ORklHCQkweGZmZmVjYzE0CisjZGVmaW5lIE9NQVBfRU1JRlNfQ1MyX0NPTkZJRwkJMHhmZmZlY2MxOAorI2RlZmluZSBPTUFQX0VNSUZTX0NTM19DT05GSUcJCTB4ZmZmZWNjMWMKKyNkZWZpbmUgT01BUF9FTUlGRl9TRFJBTV9DT05GSUcJCTB4ZmZmZWNjMjAKKyNkZWZpbmUgT01BUF9FTUlGRl9NUlMJCQkweGZmZmVjYzI0CisjZGVmaW5lIE9NQVBfVElNRU9VVDEJCQkweGZmZmVjYzI4CisjZGVmaW5lIE9NQVBfVElNRU9VVDIJCQkweGZmZmVjYzJjCisjZGVmaW5lIE9NQVBfVElNRU9VVDMJCQkweGZmZmVjYzMwCisjZGVmaW5lIE9NQVBfRU5ESUFOSVNNCQkJMHhmZmZlY2MzNAorCisvKiAyLjkuMTAgRU1JRiBTbG93IEludGVyZmFjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChFTUlGU19DT05GSUdfUkVHKTogKi8KKyNkZWZpbmUgT01BUF9FTUlGU19DT05GSUdfRlIJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVBfRU1JRlNfQ09ORklHX1BERQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUF9FTUlGU19DT05GSUdfUFdEX0VOCSgxIDw8IDIpCisjZGVmaW5lIE9NQVBfRU1JRlNfQ09ORklHX0JNCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQX0VNSUZTX0NPTkZJR19XUAkJKDEgPDwgMCkKKworLyoKKyAqIE1lbW9yeSBjaHVuayBzZXQgYXNpZGUgZm9yIHRoZSBGcmFtZWJ1ZmZlciBpbiBTUkFNCisgKi8KKyNkZWZpbmUgU1JBTV9GUkFNRUJVRkZFUl9NRU1PUlkgT01BUDE1MTBfU1JBTV9CQVNFCisKKworLyoKKyAqIERNQQorICovCisKKyNkZWZpbmUgT01BUDE1MTBfRE1BX0JBU0UgMHhGRkZFRDgwMAorI2RlZmluZSBPTUFQX0RNQV9CQVNFCSAgT01BUDE1MTBfRE1BX0JBU0UKKworLyogR2xvYmFsIFJlZ2lzdGVyIHNlbGVjdGlvbiAqLworI2RlZmluZSBOT19HTE9CQUxfRE1BX0FDQ0VTUyAwCisKKy8qIENoYW5uZWwgc2VsZWN0IGZpZWxkCisgKiBOT1RFOiBhbGwgb3RoZXIgY2hhbm5lbHMgYXJlIGxpbmVhciwgY2hhbjAgaXMgMCwgY2hhbjEgaXMgMSwgZXRjLi4uCisgKi8KKyNkZWZpbmUgTENEX0NIQU5ORUwgMHhjCisKKy8qIFJlZ2lzdGVyIFNlbGVjdCBGaWVsZCAoTENEKSAqLworI2RlZmluZSBETUFfTENEX0NUUkwJCTAKKyNkZWZpbmUgRE1BX0xDRF9UT1BfRjFfTAkxCisjZGVmaW5lIERNQV9MQ0RfVE9QX0YxX1UJMgorI2RlZmluZSBETUFfTENEX0JPVF9GMV9MCTMKKyNkZWZpbmUgRE1BX0xDRF9CT1RfRjFfVQk0CisKKyNkZWZpbmUgTENEX0ZSQU1FX01PREUJCSgxPDwwKQorI2RlZmluZSBMQ0RfRlJBTUVfSVRfSUUJCSgxPDwxKQorI2RlZmluZSBMQ0RfQlVTX0VSUk9SX0lUX0lFCSgxPDwyKQorI2RlZmluZSBMQ0RfRlJBTUVfMV9JVF9DT05ECSgxPDwzKQorI2RlZmluZSBMQ0RfRlJBTUVfMl9JVF9DT05ECSgxPDw0KQorI2RlZmluZSBMQ0RfQlVTX0VSUk9SX0lUX0NPTkQJKDE8PDUpCisjZGVmaW5lIExDRF9TT1VSQ0VfSU1JRgkJKDE8PDYpCisKKy8qCisgKiBSZWFsLVRpbWUgQ2xvY2sKKyAqLworCisjZGVmaW5lIFJUQ19TRUNPTkRTCQkodm9sYXRpbGUgX191OCAqKShPTUFQMTUxMF9SVENfQkFTRSArIDB4MDApCisjZGVmaW5lIFJUQ19NSU5VVEVTCQkodm9sYXRpbGUgX191OCAqKShPTUFQMTUxMF9SVENfQkFTRSArIDB4MDQpCisjZGVmaW5lIFJUQ19IT1VSUwkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDA4KQorI2RlZmluZSBSVENfREFZUwkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDBDKQorI2RlZmluZSBSVENfTU9OVEhTCQkodm9sYXRpbGUgX191OCAqKShPTUFQMTUxMF9SVENfQkFTRSArIDB4MTApCisjZGVmaW5lIFJUQ19ZRUFSUwkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDE0KQorI2RlZmluZSBSVENfQ1RSTAkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDQwKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE9NQVAxNTEwIEludGVycnVwdCBIYW5kbGVycworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjZGVmaW5lIE9NQVBfSUgxX0JBU0UJCTB4ZmZmZWNiMDAKKyNkZWZpbmUgT01BUF9JSDJfQkFTRQkJMHhmZmZlMDAwMAorI2RlZmluZSBPTUFQMTUxMF9JVFIJCTB4MAorI2RlZmluZSBPTUFQMTUxMF9NQVNLCQkweDQKKworI2RlZmluZSBJTlRFUlJVUFRfSEFORExFUl9CQVNFCSBPTUFQX0lIMV9CQVNFCisjZGVmaW5lIElOVEVSUlVQVF9JTlBVVF9SRUdJU1RFUiBPTUFQMTUxMF9JVFIKKyNkZWZpbmUgSU5URVJSVVBUX01BU0tfUkVHSVNURVIJIE9NQVAxNTEwX01BU0sKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPTUFQMTUxMCBUSU1FUlMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjZGVmaW5lIE9NQVAxNTEwXzMya0h6X1RJTUVSX0JBU0UgMHhmZmZiOTAwMAorCisvKiAzMmsgVGltZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIFRJTUVSMzJrX0NSCTB4MDgKKyNkZWZpbmUgVElNRVIzMmtfVFZSCTB4MDAKKyNkZWZpbmUgVElNRVIzMmtfVENSCTB4MDQKKworLyogMzJrIFRpbWVyIENvbnRyb2wgUmVnaXN0ZXIgZGVmaW5pdGlvbiAqLworI2RlZmluZSBUSU1FUjMya19UU1MJKDE8PDApCisjZGVmaW5lIFRJTUVSMzJrX1RSQgkoMTw8MSkKKyNkZWZpbmUgVElNRVIzMmtfSU5UCSgxPDwyKQorI2RlZmluZSBUSU1FUjMya19BUkwJKDE8PDMpCisKKy8qIE1QVSBUaW1lciBiYXNlIGFkZHJlc3NlcyAgKi8KKyNkZWZpbmUgT01BUDE1MTBfTVBVVElNRVJfQkFTRQkweGZmZmVjNTAwCisjZGVmaW5lIE9NQVAxNTEwX01QVVRJTUVSX09GRgkweDAwMDAwMTAwCisKKyNkZWZpbmUgT01BUDE1MTBfVElNRVIxX0JBU0UJMHhmZmZlYzUwMAorI2RlZmluZSBPTUFQMTUxMF9USU1FUjJfQkFTRQkweGZmZmVjNjAwCisjZGVmaW5lIE9NQVAxNTEwX1RJTUVSM19CQVNFCTB4ZmZmZWM3MDAKKworLyogTVBVIFRpbWVyIFJlZ2lzdGVycyAqLworI2RlZmluZSBDTlRMX1RJTUVSCTAKKyNkZWZpbmUgTE9BRF9USU0JNAorI2RlZmluZSBSRUFEX1RJTQk4CisKKy8qICBDTlRMX1RJTUVSIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgTVBVVElNX0ZSRUUJCSgxPDw2KQorI2RlZmluZSBNUFVUSU1fQ0xPQ0tfRU5BQkxFCSgxPDw1KQorI2RlZmluZSBNUFVUSU1fUFRWX01BU0sJCSgweDc8PFBUVl9CSVQpCisjZGVmaW5lIE1QVVRJTV9QVFZfQklUCQkyCisjZGVmaW5lIE1QVVRJTV9BUgkJKDE8PDEpCisjZGVmaW5lIE1QVVRJTV9TVAkJKDE8PDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE9NQVAxNTEwIEdQSU8gKFNIQVJFRCkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2RlZmluZSBHUElPX0RBVEFfSU5QVVRfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweDApCisjZGVmaW5lIEdQSU9fREFUQV9PVVRQVVRfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweDQpCisjZGVmaW5lIEdQSU9fRElSX0NPTlRST0xfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweDgpCisjZGVmaW5lIEdQSU9fSU5UX0NPTlRST0xfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweGMpCisjZGVmaW5lIEdQSU9fSU5UX01BU0tfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweDEwKQorI2RlZmluZSBHUElPX0lOVF9TVEFUVVNfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweDE0KQorI2RlZmluZSBHUElPX1BJTl9DT05UUk9MX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHgxOCkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE9NQVAxNTEwIE1QVUlPIChBUk0gb25seSkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIE9NQVAxNTEwX01QVUlPX0JBU0UJMHhGRkZCNTAwMAorI2RlZmluZSBNUFVJT19EQVRBX0lOUFVUX1JFRwkoT01BUDE1MTBfTVBVSU9fQkFTRSArIDB4MCkKKyNkZWZpbmUgTVBVSU9fREFUQV9PVVRQVVRfUkVHCShPTUFQMTUxMF9NUFVJT19CQVNFICsgMHg0KQorI2RlZmluZSBNUFVJT19ESVJfQ09OVFJPTF9SRUcJKE9NQVAxNTEwX01QVUlPX0JBU0UgKyAweDgpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE9NQVAxNTEwIFRJUEIgKG9ubHkpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNkZWZpbmUgVElQQl9QVUJMSUNfQ05UTF9CQVNFCQkweGZmZmVkMzAwCisjZGVmaW5lIE1QVV9QVUJMSUNfVElQQl9DTlRMX1JFRwkoVElQQl9QVUJMSUNfQ05UTF9CQVNFICsgMHg4KQorI2RlZmluZSBUSVBCX1BSSVZBVEVfQ05UTF9CQVNFCQkweGZmZmVjYTAwCisjZGVmaW5lIE1QVV9QUklWQVRFX1RJUEJfQ05UTF9SRUcJKFRJUEJfUFJJVkFURV9DTlRMX0JBU0UgKyAweDgpCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPTUFQMTUxMCBDYW1lcmEgSW50ZXJmYWNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBDQU1FUkFfQkFTRQkJKElPX0JBU0UgKyAweDY4MDApCisjZGVmaW5lIENBTV9DVFJMQ0xPQ0tfUkVHCShDQU1FUkFfQkFTRSArIDB4MDApCisjZGVmaW5lIENBTV9JVF9TVEFUVVNfUkVHCShDQU1FUkFfQkFTRSArIDB4MDQpCisjZGVmaW5lIENBTV9NT0RFX1JFRwkJKENBTUVSQV9CQVNFICsgMHgwOCkKKyNkZWZpbmUgQ0FNX1NUQVRVU19SRUcJCShDQU1FUkFfQkFTRSArIDB4MEMpCisjZGVmaW5lIENBTV9DQU1EQVRBX1JFRwkJKENBTUVSQV9CQVNFICsgMHgxMCkKKyNkZWZpbmUgQ0FNX0dQSU9fUkVHCQkoQ0FNRVJBX0JBU0UgKyAweDE0KQorI2RlZmluZSBDQU1fUEVBS19DVFJfUkVHCShDQU1FUkFfQkFTRSArIDB4MTgpCisKKyNpZiAwCisjaWZuZGVmIF9fQVNTRU1CTFlfXwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdTMyIGN0cmxjbG9jazsKKwlfX3UzMiBpdF9zdGF0dXM7CisJX191MzIgbW9kZTsKKwlfX3UzMiBzdGF0dXM7CisJX191MzIgY2FtZGF0YTsKKwlfX3UzMiBncGlvOworCV9fdTMyIHBlYWtfY291bnRlcjsKK30gY2FtZXJhX3JlZ3NfdDsKKyNlbmRpZgorI2VuZGlmCisKKy8qIENUUkxDTE9DSyBiaXQgc2hpZnRzICovCisjZGVmaW5lIEZPU0NNT0RfQklUCTAKKyNkZWZpbmUgRk9TQ01PRF9NQVNLCSgweDcgPDwgRk9TQ01PRF9CSVQpCisjZGVmaW5lCSBGT1NDTU9EXzEyTUh6CTB4MAorI2RlZmluZQkgRk9TQ01PRF82TUh6CTB4MgorI2RlZmluZQkgRk9TQ01PRF85XzZNSHogMHg0CisjZGVmaW5lCSBGT1NDTU9EXzI0TUh6CTB4NQorI2RlZmluZQkgRk9TQ01PRF84TUh6CTB4NgorI2RlZmluZSBQT0xDTEsJCSgxPDwzKQorI2RlZmluZSBDQU1FWENMS19FTgkoMTw8NCkKKyNkZWZpbmUgTUNMS19FTgkJKDE8PDUpCisjZGVmaW5lIERQTExfRU4JCSgxPDw2KQorI2RlZmluZSBMQ0xLX0VOCQkoMTw8NykKKworLyogSVRfU1RBVFVTIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgVl9VUAkJKDE8PDApCisjZGVmaW5lIFZfRE9XTgkJKDE8PDEpCisjZGVmaW5lIEhfVVAJCSgxPDwyKQorI2RlZmluZSBIX0RPV04JCSgxPDwzKQorI2RlZmluZSBGSUZPX0ZVTEwJKDE8PDQpCisjZGVmaW5lIERBVEFfWEZFUgkoMTw8NSkKKworLyogTU9ERSBiaXQgc2hpZnRzICovCisjZGVmaW5lIENBTU9TQwkJKDE8PDApCisjZGVmaW5lIElNR1NJWkVfQklUCTEKKyNkZWZpbmUgSU1HU0laRV9NQVNLCSgweDMgPDwgSU1HU0laRV9CSVQpCisjZGVmaW5lCSBJTUdTSVpFX0NJRgkoMHgwIDw8IElNR1NJWkVfQklUKQkvKiAzNTJ4Mjg4ICovCisjZGVmaW5lCSBJTUdTSVpFX1FDSUYJKDB4MSA8PCBJTUdTSVpFX0JJVCkJLyogMTc2eDE0NCAqLworI2RlZmluZQkgSU1HU0laRV9WR0EJKDB4MiA8PCBJTUdTSVpFX0JJVCkJLyogNjQweDQ4MCAqLworI2RlZmluZQkgSU1HU0laRV9RVkdBCSgweDMgPDwgSU1HU0laRV9CSVQpCS8qIDMyMHgyNDAgKi8KKyNkZWZpbmUgT1JERVJDQU1ECSgxPDwzKQorI2RlZmluZSBFTl9WX1VQCQkoMTw8NCkKKyNkZWZpbmUgRU5fVl9ET1dOCSgxPDw1KQorI2RlZmluZSBFTl9IX1VQCQkoMTw8NikKKyNkZWZpbmUgRU5fSF9ET1dOCSgxPDw3KQorI2RlZmluZSBFTl9ETUEJCSgxPDw4KQorI2RlZmluZSBUSFJFU0hPTEQJKDE8PDkpCisjZGVmaW5lIFRIUkVTSE9MRF9CSVQJOQorI2RlZmluZSBUSFJFU0hPTERfTUFTSwkoMHg3Zjw8OSkKKyNkZWZpbmUgRU5fTklSUQkJKDE8PDE2KQorI2RlZmluZSBFTl9GSUZPX0ZVTEwJKDE8PDE3KQorI2RlZmluZSBSQVpfRklGTwkoMTw8MTgpCisKKy8qIFNUQVRVUyBiaXQgc2hpZnRzICovCisjZGVmaW5lIFZTVEFUVVMJCSgxPDwwKQorI2RlZmluZSBIU1RBVFVTCQkoMTw8MSkKKworLyogR1BJTyBiaXQgc2hpZnRzICovCisjZGVmaW5lIENBTV9SU1QJCSgxPDwwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioKKyAqIFdhdGNoZG9nIHRpbWVyLgorICoqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgV0RUSU1fQkFTRQkweGZmZmVjODAwCisjZGVmaW5lIFdEVElNX0NPTlRST0wJKFdEVElNX0JBU0UrMHgwMCkKKyNkZWZpbmUgV0RUSU1fTE9BRAkoV0RUSU1fQkFTRSsweDA0KQorI2RlZmluZSBXRFRJTV9SRUFECShXRFRJTV9CQVNFKzB4MDQpCisjZGVmaW5lIFdEVElNX01PREUJKFdEVElNX0JBU0UrMHgwOCkKKworLyogVmFsdWVzIHRvIHdyaXRlIHRvIG1vZGUgcmVnaXN0ZXIgdG8gZGlzYWJsZSB0aGUgd2F0Y2hkb2cgZnVuY3Rpb24uICovCisjZGVmaW5lIERJU0FCTEVfU0VRMQkweEY1CisjZGVmaW5lIERJU0FCTEVfU0VRMgkweEEwCisKKy8qIFdEVElNX0NPTlRST0wgYml0IGRlZmluaXRpb25zLiAqLworI2RlZmluZSBXRFRJTV9DT05UUk9MX1NUCUJJVDcKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBEaWZmZXJlbnRpYXRpbmcgcHJvY2Vzc29yIHZlcnNpb25zIGZvciB0aG9zZSB3aG8gY2FyZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2RlZmluZSBPTUFQMTUwOSAwCisjZGVmaW5lIE9NQVAxNTEwIDEKKworI2RlZmluZSBPTUFQMTUxMF9JRF9DT0RFX1JFRyAweGZmZmVkNDA0CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitpbnQgY3B1X3R5cGUodm9pZCk7CisjZW5kaWYKKworLyoKKyAqIEVWTSBJbXBsZW1lbnRhdGlvbiBTcGVjaWZpY3MuCisgKgorICogKioqIE5PVEUgKioqCisgKiBBbnkgZGVmaW5pdGlvbnMgaW4gdGhlc2UgZmlsZXMgc2hvdWxkIGJlIHByZWZpeGVkIGJ5IGFuIGlkZW50aWZpZXIgLQorICogZWcuIE9NQVAxNTEwUDFfRkxBU0gwX0JBU0UgLgorICoKKyAqLworI2lmZGVmIENPTkZJR19PTUFQX0lOTk9WQVRPUgorI2luY2x1ZGUgImlubm92YXRvci5oIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfT01BUF8xNTEwUDEKKyNpbmNsdWRlICJvbWFwMTUxMHAxLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENMS0dFTl9SRVNFVF9CQVNFICgweGZmZmVjZTAwKQorI2RlZmluZSBBUk1fQ0tDVEwJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHgwKQorI2RlZmluZSBBUk1fSURMRUNUMQkodm9sYXRpbGUgX191MTYgKikoQ0xLR0VOX1JFU0VUX0JBU0UgKyAweDQpCisjZGVmaW5lIEFSTV9JRExFQ1QyCSh2b2xhdGlsZSBfX3UxNiAqKShDTEtHRU5fUkVTRVRfQkFTRSArIDB4OCkKKyNkZWZpbmUgQVJNX0VXVVBDVAkodm9sYXRpbGUgX191MTYgKikoQ0xLR0VOX1JFU0VUX0JBU0UgKyAweEMpCisjZGVmaW5lIEFSTV9SU1RDVDEJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHgxMCkKKyNkZWZpbmUgQVJNX1JTVENUMgkodm9sYXRpbGUgX191MTYgKikoQ0xLR0VOX1JFU0VUX0JBU0UgKyAweDE0KQorI2RlZmluZSBBUk1fU1lTU1QJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHgxOCkKKworCisjZGVmaW5lIENLX0NMS0lOCTEyIC8qIE1IeiAqLworI2RlZmluZSBDS19SQVRFRgkxCisjZGVmaW5lIENLX0lETEVGCTIKKyNkZWZpbmUgQ0tfRU5BQkxFRgk0CisjZGVmaW5lIENLX1NFTEVDVEYJOAorI2lmbmRlZiBfX0FTU0VNQkxFUl9fCisjZGVmaW5lIENLX0RQTEwxCSgodm9sYXRpbGUgX191MTYgKikweGZmZmVjZjAwKQorI2Vsc2UKKyNkZWZpbmUgQ0tfRFBMTDEgKDB4ZmZmZWNmMDApCisjZW5kaWYKKyNkZWZpbmUgU0VUQVJNX0lETEVfU0hJRlQKKworLyogQVJNX0NLQ1RMIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgUEVSRElWCQkwCisjZGVmaW5lIExDRERJVgkJMgorI2RlZmluZSBBUk1ESVYJCTQKKyNkZWZpbmUgRFNQRElWCQk2CisjZGVmaW5lIFRDRElWCQk4CisjZGVmaW5lIERTUE1NVURJVgkxMAorI2RlZmluZSBBUk1fVElNWE8JMTIKKyNkZWZpbmUgRU5fRFNQQ0sJMTMKKyNkZWZpbmUgQVJNX0lOVEhDS19TRUwJMTQgLyogUkVWSVNJVCAtLSB3aGVyZSBpcyB0aGlzIHVzZWQ/ICovCisKKyNkZWZpbmUgQVJNX0NLQ1RMX1JTUlZEX0JJVDE1CQkoMSA8PCAxNSkKKyNkZWZpbmUgQVJNX0NLQ1RMX0FSTV9JTlRIQ0tfU0VMCSgxIDw8IDE0KQorI2RlZmluZSBBUk1fQ0tDVExfRU5fRFNQQ0sJCSgxIDw8IDEzKQorI2RlZmluZSBBUk1fQ0tDVExfQVJNX1RJTVhPCQkoMSA8PCAxMikKKyNkZWZpbmUgQVJNX0NLQ1RMX0RTUE1NVV9ESVYxCQkoMSA8PCAxMSkKKyNkZWZpbmUgQVJNX0NLQ1RMX0RTUE1NVV9ESVYyCQkoMSA8PCAxMCkKKyNkZWZpbmUgQVJNX0NLQ1RMX1RDRElWMQkJKDEgPDwgOSkKKyNkZWZpbmUgQVJNX0NLQ1RMX1RDRElWMgkJKDEgPDwgOCkKKyNkZWZpbmUgQVJNX0NLQ1RMX0RTUERJVjEJCSgxIDw8IDcpCisjZGVmaW5lIEFSTV9DS0NUTF9EU1BESVYwCQkoMSA8PCA2KQorI2RlZmluZSBBUk1fQ0tDVExfQVJNRElWMQkJKDEgPDwgNSkKKyNkZWZpbmUgQVJNX0NLQ1RMX0FSTURJVjAJCSgxIDw8IDQpCisjZGVmaW5lIEFSTV9DS0NUTF9MQ0RESVYxCQkoMSA8PCAzKQorI2RlZmluZSBBUk1fQ0tDVExfTENERElWMAkJKDEgPDwgMikKKyNkZWZpbmUgQVJNX0NLQ1RMX1BFUkRJVjEJCSgxIDw8IDEpCisjZGVmaW5lIEFSTV9DS0NUTF9QRVJESVYwCQkoMSA8PCAwKQorCisvKiBBUk1fSURMRUNUMSBiaXQgc2hpZnRzICovCisjZGVmaW5lIElETFdEVF9BUk0JMAorI2RlZmluZSBJRExYT1JQX0FSTQkxCisjZGVmaW5lIElETFBFUl9BUk0JMgorI2RlZmluZSBJRExMQ0RfQVJNCTMKKyNkZWZpbmUgSURMTEJfQVJNCTQKKyNkZWZpbmUgSURMSFNBQl9BUk0JNQorI2RlZmluZSBJRExJRl9BUk0JNgorI2RlZmluZSBJRExEUExMX0FSTQk3CisjZGVmaW5lIElETEFQSV9BUk0JOAorI2RlZmluZSBJRExUSU1fQVJNCTkKKyNkZWZpbmUgU0VUQVJNX0lETEUJMTEKKworLyogQVJNX0lETEVDVDIgYml0IHNoaWZ0cyAqLworI2RlZmluZSBFTl9XRFRDSwkwCisjZGVmaW5lIEVOX1hPUlBDSwkxCisjZGVmaW5lIEVOX1BFUkNLCTIKKyNkZWZpbmUgRU5fTENEQ0sJMworI2RlZmluZSBFTl9MQkNLCQk0CisjZGVmaW5lIEVOX0hTQUJDSwk1CisjZGVmaW5lIEVOX0FQSUNLCTYKKyNkZWZpbmUgRU5fVElNQ0sJNworI2RlZmluZSBETUFDS19SRVEJOAorI2RlZmluZSBFTl9HUElPQ0sJOQorI2RlZmluZSBFTl9MQkZSRUVDSwkxMAorCisjZGVmaW5lIEFSTV9SU1RDVDFfU1dfUlNUCSgxIDw8IDMpCisjZGVmaW5lIEFSTV9SU1RDVDFfRFNQX1JTVAkoMSA8PCAyKQorI2RlZmluZSBBUk1fUlNUQ1QxX0RTUF9FTgkoMSA8PCAxKQorI2RlZmluZSBBUk1fUlNUQ1QxX0FSTV9SU1QJKDEgPDwgMCkKKworLyogQVJNX1JTVENUMiBiaXQgc2hpZnRzICovCisjZGVmaW5lIEVOX1BFUgkJMAorCisjZGVmaW5lIEFSTV9TWVNTVF9SU1JWRF9CSVQxNQkoMSA8PCAxNSkKKyNkZWZpbmUgQVJNX1NZU1NUX1JTUlZEX0JJVDE0CSgxIDw8IDE0KQorI2RlZmluZSBBUk1fU1lTU1RfQ0xPQ0tfU0VMRUNUMiAoMSA8PCAxMykKKyNkZWZpbmUgQVJNX1NZU1NUX0NMT0NLX1NFTEVDVDEgKDEgPDwgMTIpCisjZGVmaW5lIEFSTV9TWVNTVF9DTE9DS19TRUxFQ1QwICgxIDw8IDExKQorI2RlZmluZSBBUk1fU1lTU1RfUlNSVkRfQklUMTAJKDEgPDwgMTApCisjZGVmaW5lIEFSTV9TWVNTVF9SU1JWRF9CSVQ5CSgxIDw8IDkpCisjZGVmaW5lIEFSTV9TWVNTVF9SU1JWRF9CSVQ4CSgxIDw8IDgpCisjZGVmaW5lIEFSTV9TWVNTVF9SU1JWRF9CSVQ3CSgxIDw8IDcpCisjZGVmaW5lIEFSTV9TWVNTVF9JRExFX0RTUAkoMSA8PCA2KQorI2RlZmluZSBBUk1fU1lTU1RfUE9SCQkoMSA8PCA1KQorI2RlZmluZSBBUk1fU1lTU1RfRVhUX1JTVAkoMSA8PCA0KQorI2RlZmluZSBBUk1fU1lTU1RfQVJNX01DUlNUCSgxIDw8IDMpCisjZGVmaW5lIEFSTV9TWVNTVF9BUk1fV0RSU1QJKDEgPDwgMikKKyNkZWZpbmUgQVJNX1NZU1NUX0dMT0JfU1dSU1QJKDEgPDwgMSkKKyNkZWZpbmUgQVJNX1NZU1NUX0RTUF9XRFJTVAkoMSA8PCAwKQorCisvKiBUYWJsZSAxNS0yMy4gRFBMTCBDb250cm9sIFJlZ2lzdGVyczogKi8KKyNkZWZpbmUgRFBMTF9DVExfUkVHCQkodm9sYXRpbGUgX191MTYgKikoMHhmZmZlY2YwMCkKKworLyogVGFibGUgMTUtMjQuIENvbnRyb2wgUmVnaXN0ZXIgKENUTF9SRUcpOiAqLworCisjZGVmaW5lIERQTExfQ1RMX1JFR19JT0IJCSgxIDw8IDEzKQorI2RlZmluZSBEUExMX0NUTF9SRUdfUExMX01VTFQJCUZsZCg1LDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogT01BUCBJTlRFUlJVUFQgUkVHSVNURVJTICovCisjZGVmaW5lIElSUV9JVFIJCQkweDAwCisjZGVmaW5lIElSUV9NSVIJCQkweDA0CisjZGVmaW5lIElSUV9TSVJfSVJRCQkweDEwCisjZGVmaW5lIElSUV9TSVJfRklRCQkweDE0CisjZGVmaW5lIElSUV9DT05UUk9MX1JFRwkJMHgxOAorI2RlZmluZSBJUlFfSVNSCQkJMHg5YworI2RlZmluZSBJUlFfSUxSMAkJMHgxYworCisjZGVmaW5lIFJFR19JSEwxX01JUiAgKE9NQVBfSUgxX0JBU0UrSVJRX01JUikKKyNkZWZpbmUgUkVHX0lITDJfTUlSICAoT01BUF9JSDJfQkFTRStJUlFfTUlSKQorCisvKiBJTlRFUlJVUFQgTEVWRUwgUkVHSVNURVIgQklUUyAqLworI2RlZmluZSBJTFJfUFJJT1JJVFlfTUFTSwkoMHgzYykKKyNkZWZpbmUgSUxSX1BSSU9SSVRZX1NISUZUCSgyKQorI2RlZmluZSBJTFJfTEVWRUxfVFJJR0dFUgkoMTw8MSkKKyNkZWZpbmUgSUxSX0ZJUQkJCSgxPDwwKQorCisjZGVmaW5lIElSUV9MRVZFTF9JTlQJCTEKKyNkZWZpbmUgSVJRX0VER0VfSU5UCQkwCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE3MTBoMy5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAxNzEwaDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTg4MWJkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAxNzEwaDMuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMuCisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPiwgS3NoaXRpaiBHdXB0YSA8a3NoaXRpakB0aS5jb20+CisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBUSSBPTUFQIEgzIGJvYXJkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIGV4YWN0bHkgdW5jb21tZW50IG9uZSAqLworI2RlZmluZSBDRkdfQk9PVF9DUzAJICAvKiBST00gY29kZSAtPiBzaWduZWQgWC1Mb2FkZXIgaW4gTk5BRCAqLworLy8jZGVmaW5lIENGR19CT09UX0NTMwkgIC8qIHVuc2lnbmVkIFgtbG9hZGVyIGluIE5PUiBmb3IgZGV2ZWxvcG1lbnQgKi8KKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYgCisvLyN1bmRlZiBDRkdfUFJJTlRGIAorCisvKiB1bmNvbW1lbnQgaXQgaWYgeW91IG5lZWQgdGltZXIgYmFzZWQgdWRlbGF5KCkuIGl0IHRha2VzIGFib3V0IDI1MCBieXRlcyAqLworLy8jZGVmaW5lIENGR19VREVMQVkKKyAKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisjZGVmaW5lIENPTkZJR19BUk05MjZFSlMJMQkvKiBUaGlzIGlzIGFuIGFybTkyNmVqcyBDUFUgY29yZSAgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAJMQkJCS8qIGluIGEgVEkgT01BUCBjb3JlICAgICovCisjZGVmaW5lIENPTkZJR19PTUFQMTcxMAkxCQkvKiB3aGljaCBpcyBpbiBhIDE3MTAgICovCisjZGVmaW5lIENPTkZJR19IM19PTUFQMTcxMAkxCS8qICBhIEgzIEJvYXJkICAqLworCisvKiBpbnB1dCBjbG9jayBvZiBQTEwgKi8KKy8qIHRoZSBPTUFQMTcxMCBIMyBoYXMgMTJNSHogaW5wdXQgY2xvY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkxMjAwMDAwMAorCisKKyNpZmRlZiBDRkdfUFJJTlRGCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCSgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQkoNDgwMDAwMDApCS8qIGNhbiBiZSAxMk0vMzJLaHogb3IgNDhNaHogKi8KKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkweGZmZmIwMDAwCS8qIHVhcnQxLCBibHVldG9vdGggdWFydCBvbiBoZWxlbiAqLworCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCTEKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCTExNTIwMAorCisjZW5kaWYgLyogQ0ZHX1BSSU5URiAqLworCisjaW5jbHVkZSA8Y29uZmlncy9vbWFwMTUxMC5oPgorCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19QQlNJWkUJMjU2CisjZGVmaW5lIENGR19MT0FEQUREUiAJMHgxMTAwMDAwMAorICAKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworIAorLyogVGhlIDE3MTAgaGFzIDYgdGltZXJzLCB0aGV5IGNhbiBiZSBkcml2ZW4gYnkgdGhlIFJlZkNsayAoMTJNaHopIG9yIGJ5CisgKiBEUExMMS4gVGhpcyB0aW1lIGlzIGZ1cnRoZXIgc3ViZGl2aWRlZCBieSBhIGxvY2FsIGRpdmlzb3IuCisgKi8KKyNkZWZpbmUgQ0ZHX1RJTUVSQkFTRQkweEZGRkVDNTAwCS8qIHVzZSB0aW1lciAxICovCisjZGVmaW5lIENGR19QVlQJNwkvKiAyXihwdnQrMSksIGRpdmlkZSBieSAyNTYgKi8KKyNkZWZpbmUgQ0ZHX0haCSgoQ09ORklHX1NZU19DTEtfRlJFUSkvKDIgPDwgQ0ZHX1BWVCkpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgxMjgqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX05BTkRfSzlGNTYxNiAgICAvKiBTYW1zdW5nIDE2LWJpdCAzMk1CIGNoaXAgKi8KKworI2lmZGVmIENGR19CT09UX0NTMAorI2RlZmluZSBOQU5EX0FERFIgMHgwYzAwMDAwMCAgLyogcGh5c2ljYWwgYWRkcmVzcyB0byBhY2Nlc3MgbmFuZCBhdCBDUzMqLworI2Vsc2UKKyNkZWZpbmUgTkFORF9BRERSIDB4MGEwMDAwMDAgIC8qIHBoeXNpY2FsIGFkZHJlc3MgdG8gYWNjZXNzIG5hbmQgYXQgQ1MyQiovCisjZW5kaWYKKworLyogSDMgTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMCAtIDB4MDAxMDAwMCAJQm9vdGluZyBJbWFnZQorICogMHgwMDEwMDAwIC0gMHgwMDUwMDAwIAlVLUJvb3QgSW1hZ2UKKyAqIDB4MDA1MDAwMCAtIDB4MDA4MDAwMCAJVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwODAwMDAgLSAweDIwMDAwMDAgCWRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUCTB4MDAxMDAwMAorI2RlZmluZSBOQU5EX1VCT09UX0VORAkJMHgwMDUwMDAwCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJMHg0MDAwCisgIAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBkb3sgKih2b2xhdGlsZSBfX3U4ICopKCh1bnNpZ25lZCBsb25nKWFkciArIDIpID0gKF9fdTgpKGQpOyB9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIGRveyAqKHZvbGF0aWxlIF9fdTggKikoKHVuc2lnbmVkIGxvbmcpYWRyICsgNCkgPSAoX191OCkoZCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIGRveyAqKHZvbGF0aWxlIF9fdTE2ICopKCh1bnNpZ25lZCBsb25nKWFkcikgPSAoX191MTYpKGQpOyB9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpICgodm9sYXRpbGUgX191MTYpKCoodm9sYXRpbGUgX191MTYgKikodW5zaWduZWQgbG9uZylhZHIpKQorCisjZGVmaW5lIEdQSU8xX0RBVEFJTgkJMHhmZmZiZTQyYworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKSAgCXdoaWxlKCEoKCoodm9sYXRpbGUgX191MTYgKikoR1BJTzFfREFUQUlOKSAmIDB4MDQwMCkgPT0gMHgwNDAwKSk7CisgCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpICAgIAorI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUoYWRyKSAgICAKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikgICAgICAgICAKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikgICAgICAgICAKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkgICAgIAorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpICAgICAgIAorCisKKyNlbmRpZgkJCQkJCQkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MjBoNC5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAyNDIwaDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDk1ZDdmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAyNDIwaDQuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDUgVGV4YXMgSW5zdHJ1bWVudHMuCisgKiAKKyAqIFgtTG9hZGVyIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIFRJIE9NQVAgSDQgYm9hcmQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYgCisvLyN1bmRlZiBDRkdfUFJJTlRGIAorCisvKiB1bmNvbW1lbnQgaXQgaWYgeW91IG5lZWQgdGltZXIgYmFzZWQgdWRlbGF5KCkuIGl0IHRha2VzIGFib3V0IDI1MCBieXRlcyAqLworLy8jZGVmaW5lIENGR19VREVMQVkKKyAKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19BUk0xMTM2ICAgICAgICAgICAxICAgIC8qIFRoaXMgaXMgYW4gYXJtMTEzNiBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUCAgICAgICAgICAgICAgMSAgICAvKiBpbiBhIFRJIE9NQVAgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUDI0MjAJICAgICAgICAgMSAgICAvKiB3aGljaCBpcyBpbiBhIDI0MjAgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAyNDIwSDQgICAgICAgIDEgICAgLyogYW5kIG9uIGEgSDQgYm9hcmQgKi8KKworI2RlZmluZSBDT05GSUdfT01BUDI0MlgKKworI2RlZmluZSBQUkNNX0NPTkZJR19JSSAgICAgICAgICAgMSAgICAKKy8vI2RlZmluZSBQUkNNX0NPTkZJR19JSUkgICAgICAgICAgIDEgICAgCisjZGVmaW5lIENPTkZJR19QQVJUSUFMX1NSQU0gICAgICAxCisKKy8vI2RlZmluZSBDRkdfU0RSQU1fRERSCQkJMQorI2RlZmluZSBDRkdfU0RSQU1fQ09NQk8JCTIKKy8vI2RlZmluZSBDRkdfU0RSQU1fU0RSCQkJMworLy8jZGVmaW5lIENGR19TRFJBTV9TVEFDS0VECQk0CisJIAorLyogQ2hpcHNlbGVjdCBhbmQgTkFORCBpbmZvcm1hdGlvbiA6CisgICBTaW5jZSB3ZSBzaGFyZSB0aGUgbWVtLmggZnJvbSB1LWJvb3QsIHdlIGRlZmluZSBmZXcgbWFjcm9zIGhlcmUKKyAgIHNvIGFzIHRvIHBpY2sgdGhlIHJpZ2h0IGdwbWMgdmFsdWVzIGZyb20gdGhlcmUgZm9yIHRoZSBtYWNyb3MgaW4gbWVtLmgKKyovCisvKiBOQU5EIGZpeGVkIGF0IENTNSAqLworI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTMCBTTU5BTkQKKyNkZWZpbmUgT01BUDI0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfNjRNCisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwX01BUCBDRkdfRkxBU0hfQkFTRQorI2RlZmluZSBDRkdfTkFORF9CT09UCisjZGVmaW5lIE5BTkRfTEVHQUNZCisKKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMjQyMC5oPiAgICAgICAgLyogZ2V0IGNoaXAgYW5kIGJvYXJkIGRlZnMgKi8KKworI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgMTIwMDAwMDAKKy8qIGlucHV0IGNsb2NrIG9mIFBMTCAqLworLyogdGhlIE9NQVAyNDIwIEg0IGhhcyAxMk1IeiwgMTNNSHosIG9yIDE5LjJNaHogY3J5c3RhbCBpbnB1dCAqLworI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRICAgICAgVl9TQ0xLCisKKyNpZmRlZiBDRkdfUFJJTlRGCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCSgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQkoNDgwMDAwMDApCS8qIGNhbiBiZSAxMk0vMzJLaHogb3IgNDhNaHogKi8KKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMSAgICAgICAgIE9NQVAyNDIwX1VBUlQxCisgCisvKgorICogc2VsZWN0IHNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU0VSSUFMMSAgICAgICAgICAgMSAgICAvKiBVQVJUMSBvbiBINCAqLworCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgICAxCisjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgICAxMTUyMDAKKyNkZWZpbmUgQ0ZHX1BCU0laRQkyNTYKKworI2VuZGlmIC8qIENGR19QUklOVEYgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9BREFERFIgCTB4ODAwMDAwMDAKKyAgCisjdW5kZWYJQ0ZHX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgxMjgqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX05BTkRfSzlLMTIxNiAgICAvKiBTYW1zdW5nIDE2LWJpdCA2NE1CIGNoaXAgKi8KKworI2RlZmluZSBOQU5EX0FERFIgMHgwNDAwMDAwMCAgLyogcGh5c2ljYWwgYWRkcmVzcyB0byBhY2Nlc3MgbmFuZCBhdCBDUzAqLworIAorLyogSDQgTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMCAtIDB4MDAxMDAwMCAJQm9vdGluZyBJbWFnZQorICogMHgwMDEwMDAwIC0gMHgwMDUwMDAwIAlVLUJvb3QgSW1hZ2UKKyAqIDB4MDA1MDAwMCAtIDB4MDA4MDAwMCAJVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwODAwMDAgLSAweDQwMDAwMDAgCWRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUCTB4MDA0MDAwMAorI2RlZmluZSBOQU5EX1VCT09UX0VORAkJMHgwMDgwMDAwCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJMHg0MDAwCisgIAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBkbyB7Kih2b2xhdGlsZSB1MTYgKikweDY4MDBBMDdDID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIGRvIHsqKHZvbGF0aWxlIHUxNiAqKTB4NjgwMEEwODAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIGRvIHsqKHZvbGF0aWxlIHUxNiAqKTB4NjgwMEEwODQgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgKCoodm9sYXRpbGUgdTE2ICopMHg2ODAwQTA4NCkKKworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorICAKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgZG8geyoodm9sYXRpbGUgdTMyICopKDB4NjgwMEEwNTApIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKSgweDY4MDBBMDUwKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisgIAorI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKSAgICAKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikgICAgCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpICAgICAgICAgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpICAgICAgICAgCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpICAgICAKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKSAgICAgICAKKworCisjZW5kaWYJCQkJCQkJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAyNDMwc2RwLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MzBzZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRhNjFmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAyNDMwc2RwLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMuCisgKiAKKyAqIFgtTG9hZGVyIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIFRJIE9NQVAgSDQgYm9hcmQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYgCisvLyN1bmRlZiBDRkdfUFJJTlRGIAorCisvKiB1bmNvbW1lbnQgaXQgaWYgeW91IG5lZWQgdGltZXIgYmFzZWQgdWRlbGF5KCkuIGl0IHRha2VzIGFib3V0IDI1MCBieXRlcyAqLworLy8jZGVmaW5lIENGR19VREVMQVkKKyAKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19BUk0xMTM2ICAgICAgICAgICAxICAgIC8qIFRoaXMgaXMgYW4gYXJtMTEzNiBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUCAgICAgICAgICAgICAgMSAgICAvKiBpbiBhIFRJIE9NQVAgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUDI0MzBINCAgICAgICAgMSAgICAvKiBhbmQgb24gYSBINCBib2FyZCAqLworCisjZGVmaW5lIENPTkZJR19PTUFQMjQzWCAxCisKKy8vI2RlZmluZSBQUkNNX0NPTkZJR181QQkJIDEKKyNkZWZpbmUgUFJDTV9DT05GSUdfMiAgICAgICAgICAgMSAvKiAyNDMwIEVTMiszMzBBUk0rRERSLTE2NS1QSVNNTyAqLworCisjZGVmaW5lIE9NQVAyNDMwX1NRVUFSRV9DTE9DS19JTlBVVCAxCisKKy8qIE1lbW9yeSB0eXBlICovCisvLyNkZWZpbmUgQ0ZHX1NEUkFNX0REUgkJCTEgLyogbm90IHRlc3RlZCAqLworLy8jZGVmaW5lIENGR19TRFJBTV9DT01CTwkJMiAvKiBub3QgdGVzdGVkICovCisjZGVmaW5lIENGR18yNDMwU0RSQU1fRERSCQkzCisvLyNkZWZpbmUgQ0ZHX1NEUkFNX1NUQUNLRUQJCTQgLyogbm90IHRlc3RlZCAqLworCisvKiBUaGUgYWN0dWFsIHJlZ2lzdGVyIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiB1LWJvb3QtIG1lbS5oICovCisvKiBTRFJBTSBCYW5rIEFsbG9jYXRpb24gbWV0aG9kICovCisvLyNkZWZpbmUgU0RSQ19CX1JfQyAgICAgICAgICAxCisvLyNkZWZpbmUgU0RSQ19CMV9SX0IwX0MgICAgICAxCisjZGVmaW5lIFNEUkNfUl9CX0MgICAgICAgICAgICAxCisKKy8qIEJvb3QgdHlwZSAqLworLy8jZGVmaW5lIENGR19OQU5EIDEKKyNkZWZpbmUgQ0ZHX09ORU5BTkQgMQorCisjIGRlZmluZSBOQU5EX0JBU0UgICAgICAgICAgICAweDBDMDAwMDAwICAvKiBOQU5EIGZsYXNoICovCisjIGRlZmluZSBPTkVOQU5EX0JBU0UJICAgICAgMHgyMDAwMDAwMCAgLyogT25lTmFuZCBmbGFzaCAqLworCisjaWZkZWYgQ0ZHX05BTkQKKyNkZWZpbmUgTkFORF9MRUdBQ1kKKyNkZWZpbmUgT01BUDI0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfNjRNCisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwX01BUCBOQU5EX0JBU0UKKyNlbHNlCisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzEyOE0KKyNkZWZpbmUgT01BUDI0WFhfR1BNQ19DUzBfTUFQIE9ORU5BTkRfQkFTRQorI2RlZmluZSBPTkVOQU5EX0FERFIgT05FTkFORF9CQVNFICAvKiBwaHlzaWNhbCBhZGRyZXNzIHRvIGFjY2VzcyBPbmVOQU5EIGF0IENTMCovCisjZW5kaWYKKworLyogQW5vdGhlciBkZXBlbmRlbmN5IG9uIHUtYm9vdCAqLworI2RlZmluZSBzZGVsYXkgZGVsYXkKKwkgCisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDI0MzAuaD4gICAgICAgIC8qIGdldCBjaGlwIGFuZCBib2FyZCBkZWZzICovCisKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIDEzMDAwMDAwCisvKiBpbnB1dCBjbG9jayBvZiBQTEwgKi8KKy8qIHRoZSBPTUFQMjQyMCBINCBoYXMgMTJNSHosIDEzTUh6LCBvciAxOS4yTWh6IGNyeXN0YWwgaW5wdXQgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgICAgIFZfU0NMSworCisjaWZkZWYgQ0ZHX1BSSU5URgorCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQkoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJKDQ4MDAwMDAwKQkvKiBjYW4gYmUgMTJNLzMyS2h6IG9yIDQ4TWh6ICovCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEgICAgICAgICBPTUFQMjQzMF9VQVJUMQorIAorLyoKKyAqIHNlbGVjdCBzZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NFUklBTDEgICAgICAgICAgIDEgICAgLyogVUFSVDEgb24gMjQzMFNEUCAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAgMQorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAgMTE1MjAwCisjZGVmaW5lIENGR19QQlNJWkUJMjU2CisKKyNlbmRpZiAvKiBDRkdfUFJJTlRGICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSIAkweDgwMDA4MDAwCisgIAorI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMTI4KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKworI2lmZGVmIENGR19OQU5ECisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIE5BTkQgSW5mby4KKyAqLworI2RlZmluZSBDRkdfTkFORF9LOUsxMjE2ICAgIC8qIFNhbXN1bmcgMTYtYml0IDY0TUIgY2hpcCAqLworCisvKiBOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogMHgwMDAwMDAwIC0gMHgwMDEwMDAwIAlCb290aW5nIEltYWdlCisgKiAweDAwMTAwMDAgLSAweDAwNTAwMDAgCVUtQm9vdCBJbWFnZQorICogMHgwMDUwMDAwIC0gMHgwMDgwMDAwIAlVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqIDB4MDA4MDAwMCAtIDB4MDBCMDAwMCAJS2VybmVsIEltYWdlCisgKiAweDAwQjAwMDAgLSAweDQwMDAwMDAgCWRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUCTB4MDA0MDAwMAorI2RlZmluZSBOQU5EX1VCT09UX0VORAkJMHgwMDgwMDAwCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJMHg0MDAwCisgIAorI2RlZmluZSBHUE1DX0NPTkZJRwkJKE9NQVAyNFhYX0dQTUNfQkFTRSsweDUwKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8wCShPTUFQMjRYWF9HUE1DX0JBU0UrMHg3QykKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMAkoT01BUDI0WFhfR1BNQ19CQVNFKzB4ODApCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzAJKE9NQVAyNFhYX0dQTUNfQkFTRSsweDg0KQorCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSAoKih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wKQorI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpICAgIAorI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUoYWRyKSAgICAKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikgICAgICAgICAKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikgICAgICAgICAKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkgICAgIAorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpICAgICAgIAorCisjZWxzZQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgb25lTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19TWU5DX0JVUlNUX1JFQUQgICAgIDEKKworLyogT25lTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqICAgMHgwMDAwMDAwIC0gMHgwMDgwMDAwICAgICAgICBYLUxvYWRlciAKKyAqICAgMHgwMDgwMDAwIC0gMHgwMGMwMDAwICAgICAgICBVLWJvb3QgSW1hZ2UKKyAqICAgMHgwMGMwMDAwIC0gMHgwMGUwMDAwICAgICAgICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqICAgMHgwMGUwMDAwIC0gMHgwMTIwMDAwICAgICAgICBLZXJuZWwgSW1hZ2UKKyAqICAgMHgwMTIwMDAwIC0gMHg0MDAwMDAwICAgICAgICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKworI2RlZmluZSBPTkVOQU5EX1NUQVJUX0JMT0NLICAgICAgICAgICAgIDQKKyNkZWZpbmUgT05FTkFORF9FTkRfQkxPQ0sgICAgICAgICAgICAgCTYKKyNkZWZpbmUgT05FTkFORF9QQUdFX1NJWkUgICAgICAgICAgICAgICAyMDQ4ICAgICAgICAgICAgLyogMktCICovCisjZGVmaW5lIE9ORU5BTkRfQkxPQ0tfU0laRSAgICAgICAgICAgICAgMHgyMDAwMCAgICAgICAgIC8qIDEyOEtCICovCisKKyNlbmRpZiAvLyBvbmVOQU5ECisjZW5kaWYJCQkJCQkJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzNDMwbGFicmFkb3IuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMGxhYnJhZG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjYwODg3MgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMGxhYnJhZG9yLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYgCisgKiBUZXhhcyBJbnN0cnVtZW50cyA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBUSSBPTUFQIFNEUDM0MzAgYm9hcmQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYgCisvLyN1bmRlZiBDRkdfUFJJTlRGIAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQVJNQ09SVEVYQTggICAgICAgMSAgICAvKiBUaGlzIGlzIGFuIEFSTSBWNyBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUCAgICAgICAgICAgICAgMSAgICAvKiBpbiBhIFRJIE9NQVAgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUDM0WFggICAgICAgICAgMSAgICAvKiB3aGljaCBpcyBhIDM0WFggKi8KKyNkZWZpbmUgQ09ORklHX09NQVAzNDMwICAgICAgICAgIDEgICAgLyogd2hpY2ggaXMgaW4gYSAzNDMwICovCisjZGVmaW5lIENPTkZJR18zNDMwTEFCUkFET1IgICAgICAxICAgIC8qIHdvcmtpbmcgb24gTGFicmFkb3IgKi8KKy8vI2RlZmluZSBDT05GSUdfMzQzMF9BU18zNDEwICAgIDEgICAgLyogdHJ1ZSBmb3IgMzQzMCBpbiAzNDEwIG1vZGUgKi8KKworI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPiAgICAgICAgLyogZ2V0IGNoaXAgYW5kIGJvYXJkIGRlZnMgKi8KKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisgCisvKiBDbG9jayBEZWZpbmVzICovCisjZGVmaW5lIFZfT1NDSyAgICAgICAgICAgICAgICAgICAyNjAwMDAwMCAgLyogQ2xvY2sgb3V0cHV0IGZyb20gVDIgKi8KKworI2lmIChWX09TQ0sgPiAxOTIwMDAwMCkgICAgICAgICAgCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICAoVl9PU0NLID4+IDEpCisjZWxzZQorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgVl9PU0NLCisjZW5kaWYKKworI2RlZmluZSBQUkNNX0NMS19DRkcyXzI2Nk1IWiAgICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTMzTUh6IEREUiAqLworLy8jZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMzMyTUhaICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTY2TUh6IEREUiAqLworI2RlZmluZSBQUkNNX1BDTEtfT1BQMiAgICAgICAgICAgMSAgICAvKiBBUk09NTAwTUh6IC0gVkREMT0xLjIwdiAqLworCisvKiBNZW1vcnkgdHlwZSAqLworI2RlZmluZSBDRkdfMzQzMFNEUkFNX0REUiAgICAgICAgMQorCisvKiBUaGUgYWN0dWFsIHJlZ2lzdGVyIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiB1LWJvb3QtIG1lbS5oICovCisvKiBTRFJBTSBCYW5rIEFsbG9jYXRpb24gbWV0aG9kICovCisvLyNkZWZpbmUgU0RSQ19CX1JfQyAgICAgICAgICAgICAxCisvLyNkZWZpbmUgU0RSQ19CMV9SX0IwX0MgICAgICAgICAxCisjZGVmaW5lIFNEUkNfUl9CX0MgICAgICAgICAgICAgICAxCisKKy8qIEJvb3QgdHlwZSAqLworI2RlZmluZSBDRkdfTkFORCAxCisvLyNkZWZpbmUgQ0ZHX09ORU5BTkQgMQorCisjIGRlZmluZSBOQU5EX0JBU0VfQURSICAgICAgICAgICBOQU5EX0JBU0UgIC8qIE5BTkQgZmxhc2ggKi8KKyMgZGVmaW5lIE9ORU5BTkRfQkFTRSAgICAgICAgICAgIE9ORU5BTkRfTUFQICAvKiBPbmVOYW5kIGZsYXNoICovCisKKyNpZmRlZiBDRkdfTkFORAorI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV8xMjhNICAvKiB1ID0gb2Zkb24ndCBuZWVkIHNvIG11Y2ggZm9yIG5hbmQgcG9ydCAqLworI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9NQVAgTkFORF9CQVNFX0FEUgorI2Vsc2UKKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfMTI4TQorI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9NQVAgT05FTkFORF9CQVNFCisjZGVmaW5lIE9ORU5BTkRfQUREUiBPTkVOQU5EX0JBU0UgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgT25lTkFORCBhdCBDUzAqLworI2VuZGlmCisKKworI2lmZGVmIENGR19QUklOVEYKKworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUgICAgICgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLICAgICAgICAgICg0ODAwMDAwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMyAgICAgICAgIE9NQVAzNFhYX1VBUlQzCisgCisvKgorICogc2VsZWN0IHNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU0VSSUFMMyAgICAgICAgICAgMyAgICAvKiBVQVJUMyBvbiBib2FyZCAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAgMworCisjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgICAxMTUyMDAKKyNkZWZpbmUgQ0ZHX1BCU0laRSAgICAgICAgICAgICAgIDI1NgorCisjZW5kaWYgLyogQ0ZHX1BSSU5URiAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT0FEQUREUiAgICAgICAgICAgICAweDgwMDA4MDAwCisgIAorI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRSAgICAgICAgICgxMjgqMTAyNCkgLyogcmVndWxhciBzdGFjayAqLworCisjaWZkZWYgQ0ZHX05BTkQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgTkFORCBJbmZvLgorICovCisKKworI2RlZmluZSBDRkdfTkFORF9LOUYxRzA4UjBBICAgIC8qIE1pY3JvbiAxNi1iaXQgMjU2TUIgY2hpcCBsYXJnZSBwYWdlIE5BTkQgY2hpcCovCisjZGVmaW5lIE5BTkRfMTZCSVQKKworLyogTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMDAgLSAweDAwMDdGRkZGICBCb290aW5nIEltYWdlCisgKiAweDAwMDgwMDAwIC0gMHgwMDBCRkZGRiAgVS1Cb290IEltYWdlCisgKiAweDAwMEMwMDAwIC0gMHgwMDBGRkZGRiAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwMTAwMDAwIC0gMHgwMDJGRkZGRiAgS2VybmVsIEltYWdlCisgKiAweDAwMzAwMDAwIC0gMHgwODAwMDAwMCAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisjZGVmaW5lIE5BTkRfVUJPT1RfU1RBUlQgICAgICAgICAweDAwODAwMDAgLyogTGVhdmluZyBmaXJzdCA0IGJsb2NrcyBmb3IgeC1sb2FkICovCisjZGVmaW5lIE5BTkRfVUJPT1RfRU5EICAgICAgICAgICAweDAwQzAwMDAgLyogR2l2aW5nIGEgc3BhY2Ugb2YgMiBibG9ja3MgPSAyNTZLQiAqLworI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUgICAgICAgICAgMHgyMDAwMAorICAKKyNkZWZpbmUgR1BNQ19DT05GSUcgICAgICAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg1MCkKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg3QykKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg4MCkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfMCAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg4NCkKKworI2lmZGVmIE5BTkRfMTZCSVQKKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCkKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNlbHNlIC8qIHRvIHN1cHBvcnQgOC1iaXQgTkFORCBkZXZpY2VzICovCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCk7CisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZW5kaWYKKworI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikgCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpIAorI2RlZmluZSBOQU5EX0NUTF9TRVRDTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkgCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkgCisKKyNlbHNlCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBvbmVOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX1NZTkNfQlVSU1RfUkVBRCAgICAgIDEKKworLyogT25lTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqICAgMHgwMDAwMDAwIC0gMHgwMDgwMDAwICBYLUxvYWRlciAKKyAqICAgMHgwMDgwMDAwIC0gMHgwMGMwMDAwICAgVS1ib290IEltYWdlCisgKiAgIDB4MDBjMDAwMCAtIDB4MDBlMDAwMCAgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogICAweDAwZTAwMDAgLSAweDAxMjAwMDAgICBLZXJuZWwgSW1hZ2UKKyAqICAgMHgwMTIwMDAwIC0gMHg0MDAwMDAwICAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisKKyNkZWZpbmUgT05FTkFORF9TVEFSVF9CTE9DSyAgICAgIDQKKyNkZWZpbmUgT05FTkFORF9FTkRfQkxPQ0sgICAgICAgIDYKKyNkZWZpbmUgT05FTkFORF9QQUdFX1NJWkUgICAgICAgIDIwNDggICAgIC8qIDJLQiAqLworI2RlZmluZSBPTkVOQU5EX0JMT0NLX1NJWkUgICAgICAgMHgyMDAwMCAgLyogMTI4S0IgKi8KKworI2VuZGlmICAvKiBvbmVOQU5EICovCisjZW5kaWYgLyogX19DT05GSUdfSCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBzZHAuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMHNkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODgwZWQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBzZHAuaApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNiAKKyAqIFRleGFzIEluc3RydW1lbnRzIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFgtTG9hZGVyIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIFRJIE9NQVAgU0RQMzQzMCBib2FyZC4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKiBzZXJpYWwgcHJpbnRmIGZhY2lsaXR5IHRha2VzIGFib3V0IDMuNUsgKi8KKyNkZWZpbmUgQ0ZHX1BSSU5URiAKKy8vI3VuZGVmIENGR19QUklOVEYgCisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19BUk1DT1JURVhBOCAgICAgICAxICAgIC8qIFRoaXMgaXMgYW4gQVJNIFY3IENQVSBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQICAgICAgICAgICAgICAxICAgIC8qIGluIGEgVEkgT01BUCBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQMzRYWCAgICAgICAgICAxICAgIC8qIHdoaWNoIGlzIGEgMzRYWCAqLworI2RlZmluZSBDT05GSUdfT01BUDM0MzAgICAgICAgICAgMSAgICAvKiB3aGljaCBpcyBpbiBhIDM0MzAgKi8KKyNkZWZpbmUgQ09ORklHXzM0MzBTRFAgICAgICAgICAgIDEgICAgLyogd29ya2luZyB3aXRoIFNEUCAqLworLy8jZGVmaW5lIENPTkZJR18zNDMwX0FTXzM0MTAJIDEgICAgLyogdHJ1ZSBmb3IgMzQzMCBpbiAzNDEwIG1vZGUgKi8KKworLyogRW5hYmxlIHRoZSBiZWxvdyBtYWNybyBpZiBNTUMgYm9vdCBzdXBwb3J0IGlzIHJlcXVpcmVkICovCisvLyNkZWZpbmUgQ09ORklHX01NQyAgICAgICAgICAgICAgIDEKKyNpZiBkZWZpbmVkKENPTkZJR19NTUMpCisJI2RlZmluZSBDRkdfQ01EX01NQyAgICAgICAgICAgICAgMQorCSNkZWZpbmUgQ0ZHX0NNRF9GQVQgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+ICAgICAgICAvKiBnZXQgY2hpcCBhbmQgYm9hcmQgZGVmcyAqLworCisvKiB1bmNvbW1lbnQgaXQgaWYgeW91IG5lZWQgdGltZXIgYmFzZWQgdWRlbGF5KCkuIGl0IHRha2VzIGFib3V0IDI1MCBieXRlcyAqLworLy8jZGVmaW5lIENGR19VREVMQVkKKyAKKy8qIENsb2NrIERlZmluZXMgKi8KKyNkZWZpbmUgVl9PU0NLICAgICAgICAgICAgICAgICAgIDE5MjAwMDAwICAvKiBDbG9jayBvdXRwdXQgZnJvbSBUMiAqLworCisjaWYgKFZfT1NDSyA+IDE5MjAwMDAwKSAgICAgICAgICAKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIChWX09TQ0sgPj4gMSkKKyNlbHNlCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICBWX09TQ0sKKyNlbmRpZgorCisvLyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8yNjZNSFogICAxICAgIC8qIFZERDI9MS4xNXYgLSAxMzNNSHogRERSICovCisjZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMzMyTUhaICAgICAxICAgIC8qIFZERDI9MS4xNXYgLSAxNjZNSHogRERSICovCisjZGVmaW5lIFBSQ01fUENMS19PUFAyICAgICAgICAgICAxICAgIC8qIEFSTT0zODFNSHogLSBWREQxPTEuMjB2ICovCisKKy8qIE1lbW9yeSB0eXBlICovCisjZGVmaW5lIENGR18zNDMwU0RSQU1fRERSICAgICAgICAxCisKKy8qIFRoZSBhY3R1YWwgcmVnaXN0ZXIgdmFsdWVzIGFyZSBkZWZpbmVkIGluIHUtYm9vdC0gbWVtLmggKi8KKy8qIFNEUkFNIEJhbmsgQWxsb2NhdGlvbiBtZXRob2QgKi8KKy8vI2RlZmluZSBTRFJDX0JfUl9DICAgICAgICAgICAgIDEKKy8vI2RlZmluZSBTRFJDX0IxX1JfQjBfQyAgICAgICAgIDEKKyNkZWZpbmUgU0RSQ19SX0JfQyAgICAgICAgICAgICAgIDEKKworLyogQm9vdCB0eXBlICovCisjZGVmaW5lIENGR19OQU5EIDEKKy8vI2RlZmluZSBDRkdfT05FTkFORCAxCisKKyMgZGVmaW5lIE5BTkRfQkFTRV9BRFIgICAgICAgICAgIE5BTkRfQkFTRSAgLyogTkFORCBmbGFzaCAqLworIyBkZWZpbmUgT05FTkFORF9CQVNFICAgICAgICAgICAgT05FTkFORF9NQVAgIC8qIE9uZU5hbmQgZmxhc2ggKi8KKworI2lmZGVmIENGR19OQU5ECisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzEyOE0KKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfTUFQIE5BTkRfQkFTRV9BRFIKKyNlbHNlCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzEyOE0KKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfTUFQIE9ORU5BTkRfQkFTRQorI2RlZmluZSBPTkVOQU5EX0FERFIgT05FTkFORF9CQVNFICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIE9uZU5BTkQgYXQgQ1MwKi8KKyNlbmRpZgorIAorI2lmZGVmIENGR19QUklOVEYKKworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUgICAgICgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLICAgICAgICAgICg0ODAwMDAwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMSAgICAgICAgIE9NQVAzNFhYX1VBUlQxCisgCisvKgorICogc2VsZWN0IHNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU0VSSUFMMSAgICAgICAgICAgMSAgICAvKiBVQVJUMSBvbiAzNDMwU0RQICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgICAxCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgIDExNTIwMAorI2RlZmluZSBDRkdfUEJTSVpFICAgICAgICAgICAgICAgMjU2CisKKyNlbmRpZiAvKiBDRkdfUFJJTlRGICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSICAgICAgICAgICAgIDB4ODAwMDgwMDAKKyAgCisjdW5kZWYJQ0ZHX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFICAgICAgICAgKDEyOCoxMDI0KSAvKiByZWd1bGFyIHN0YWNrICovCisKKyNpZmRlZiBDRkdfTkFORAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBOQU5EIEluZm8uCisgKi8KKworCisjZGVmaW5lIENGR19OQU5EX0s5RjFHMDhSMEEgICAgLyogU2Ftc3VuZyA4LWJpdCAxMjhNQiBjaGlwIGxhcmdlIHBhZ2UgTkFORCBjaGlwKi8KKyNkZWZpbmUgTkFORF84QklUCisKKy8qIE5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAweDAwMDAwMDAwIC0gMHgwMDA3RkZGRiAgQm9vdGluZyBJbWFnZQorICogMHgwMDA4MDAwMCAtIDB4MDAwQkZGRkYgIFUtQm9vdCBJbWFnZQorICogMHgwMDBDMDAwMCAtIDB4MDAwRkZGRkYgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogMHgwMDEwMDAwMCAtIDB4MDAyRkZGRkYgIEtlcm5lbCBJbWFnZQorICogMHgwMDMwMDAwMCAtIDB4MDgwMDAwMDAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUICAgICAgICAgMHgwMDgwMDAwIC8qIExlYXZpbmcgZmlyc3QgNCBibG9ja3MgZm9yIHgtbG9hZCAqLworI2RlZmluZSBOQU5EX1VCT09UX0VORCAgICAgICAgICAgMHgwMEMwMDAwIC8qIEdpdmluZyBhIHNwYWNlIG9mIDIgYmxvY2tzID0gMjU2S0IgKi8KKyNkZWZpbmUgTkFORF9CTE9DS19TSVpFICAgICAgICAgIDB4MjAwMDAKKyAgCisjZGVmaW5lIEdQTUNfQ09ORklHICAgICAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4NTApCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4N0MpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODApCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODQpCisKKyNpZmRlZiBOQU5EXzE2QklUCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzApCisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZWxzZSAvKiB0byBzdXBwb3J0IDgtYml0IE5BTkQgZGV2aWNlcyAqLworI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzApOworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2VuZGlmCisKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpIAorI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikgCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpIAorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpIAorCisjZWxzZQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgb25lTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19TWU5DX0JVUlNUX1JFQUQgICAgICAxCisKKy8qIE9uZU5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAgIDB4MDAwMDAwMCAtIDB4MDA4MDAwMCAgWC1Mb2FkZXIgCisgKiAgIDB4MDA4MDAwMCAtIDB4MDBjMDAwMCAgIFUtYm9vdCBJbWFnZQorICogICAweDAwYzAwMDAgLSAweDAwZTAwMDAgICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqICAgMHgwMGUwMDAwIC0gMHgwMTIwMDAwICAgS2VybmVsIEltYWdlCisgKiAgIDB4MDEyMDAwMCAtIDB4NDAwMDAwMCAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworCisjZGVmaW5lIE9ORU5BTkRfU1RBUlRfQkxPQ0sgICAgICA0CisjZGVmaW5lIE9ORU5BTkRfRU5EX0JMT0NLICAgICAgICA2CisjZGVmaW5lIE9ORU5BTkRfUEFHRV9TSVpFICAgICAgICAyMDQ4ICAgICAvKiAyS0IgKi8KKyNkZWZpbmUgT05FTkFORF9CTE9DS19TSVpFICAgICAgIDB4MjAwMDAgIC8qIDEyOEtCICovCisKKyNlbmRpZiAgLyogb25lTkFORCAqLworI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzZXZtLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDNldm0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zODEwYTE3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzZXZtLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWlzdHJhbCBTb2x1dGlvbnMgUHZ0IEx0ZC4KKyAqCisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBPTUFQM0VWTSBib2FyZC4KKyAqCisgKiBEZXJpdmVkIGZyb20gL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMHNkcC5oCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYKKy8vI3VuZGVmIENGR19QUklOVEYKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0FSTUNPUlRFWEE4ICAgICAgIDEgICAgLyogVGhpcyBpcyBhbiBBUk0gVjcgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgIDEgICAgLyogaW4gYSBUSSBPTUFQIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAzNFhYICAgICAgICAgIDEgICAgLyogd2hpY2ggaXMgYSAzNFhYICovCisjZGVmaW5lIENPTkZJR19PTUFQMzQzMCAgICAgICAgICAxICAgIC8qIHdoaWNoIGlzIGluIGEgMzQzMCAqLworLy8jZGVmaW5lIENPTkZJR18zNDMwU0RQICAgICAgICAgICAxICAgIC8qIHdvcmtpbmcgd2l0aCBTRFAgKi8KKy8vI2RlZmluZSBDT05GSUdfMzQzMF9BU18zNDEwCSAxICAgIC8qIHRydWUgZm9yIDM0MzAgaW4gMzQxMCBtb2RlICovCisKKyNkZWZpbmUgQ09ORklHX09NQVAzRVZNICAgICAgICAgIDEgICAgLyogd29ya2luZyB3aXRoIEVWTSAqLworCisvKiBFbmFibGUgdGhlIGJlbG93IG1hY3JvIGlmIE1NQyBib290IHN1cHBvcnQgaXMgcmVxdWlyZWQgKi8KKyNkZWZpbmUgQ09ORklHX01NQyAgICAgICAgICAgICAgIDEKKyNpZiBkZWZpbmVkKENPTkZJR19NTUMpCisJI2RlZmluZSBDRkdfQ01EX01NQyAgICAgICAgICAgICAgMQorCSNkZWZpbmUgQ0ZHX0NNRF9GQVQgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+ICAgICAgICAvKiBnZXQgY2hpcCBhbmQgYm9hcmQgZGVmcyAqLworCisvKiB1bmNvbW1lbnQgaXQgaWYgeW91IG5lZWQgdGltZXIgYmFzZWQgdWRlbGF5KCkuIGl0IHRha2VzIGFib3V0IDI1MCBieXRlcyAqLworLy8jZGVmaW5lIENGR19VREVMQVkKKworLyogQ2xvY2sgRGVmaW5lcyAqLworI2RlZmluZSBWX09TQ0sgICAgICAgICAgICAgICAgICAgMjYwMDAwMDAgIC8qIENsb2NrIG91dHB1dCBmcm9tIFQyICovCisKKyNpZiAoVl9PU0NLID4gMTkyMDAwMDApCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICAoVl9PU0NLID4+IDEpCisjZWxzZQorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgVl9PU0NLCisjZW5kaWYKKworLy8jZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMjY2TUhaICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTMzTUh6IEREUiAqLworI2RlZmluZSBQUkNNX0NMS19DRkcyXzMzMk1IWiAgICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTY2TUh6IEREUiAqLworI2RlZmluZSBQUkNNX1BDTEtfT1BQMiAgICAgICAgICAgMSAgICAvKiBBUk09MzgxTUh6IC0gVkREMT0xLjIwdiAqLworCisvKiBNZW1vcnkgdHlwZSAqLworI2RlZmluZSBDRkdfT01BUEVWTV9ERFIJCTEKKyNkZWZpbmUgQ0ZHXzM0MzBTRFJBTV9ERFIJMQorI2RlZmluZSBDT05GSUdfRERSXzI1Nk1CX1NUQUNLRUQKKworLyogVGhlIGFjdHVhbCByZWdpc3RlciB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gdS1ib290LSBtZW0uaCAqLworLyogU0RSQU0gQmFuayBBbGxvY2F0aW9uIG1ldGhvZCAqLworLy8jZGVmaW5lIFNEUkNfQl9SX0MgICAgICAgICAgICAgMQorLy8jZGVmaW5lIFNEUkNfQjFfUl9CMF9DICAgICAgICAgMQorI2RlZmluZSBTRFJDX1JfQl9DICAgICAgICAgICAgICAgMQorCisKKyMgZGVmaW5lIE5BTkRfQkFTRV9BRFIgICAgICAgICAgIE5BTkRfQkFTRSAgLyogTkFORCBmbGFzaCAqLworIyBkZWZpbmUgT05FTkFORF9CQVNFICAgICAgICAgICAgT05FTkFORF9NQVAgIC8qIE9uZU5hbmQgZmxhc2ggKi8KKworI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV8xMjhNCisjZGVmaW5lIE9ORU5BTkRfQUREUiBPTkVOQU5EX0JBU0UgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgT25lTkFORCBhdCBDUzAqLworCisjaWZkZWYgQ0ZHX1BSSU5URgorCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRSAgICAgKC00KQorI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsgICAgICAgICAgKDQ4MDAwMDAwKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xICAgICAgICAgT01BUDM0WFhfVUFSVDEKKworLyoKKyAqIHNlbGVjdCBzZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NFUklBTDEgICAgICAgICAgIDEgICAgLyogVUFSVDEgb24gT01BUDNFVk0gKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgICAgIDEKKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAgMTE1MjAwCisjZGVmaW5lIENGR19QQlNJWkUgICAgICAgICAgICAgICAyNTYKKworI2VuZGlmIC8qIENGR19QUklOVEYgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9BREFERFIgICAgICAgICAgICAgMHg4MDAwODAwMAorCisjdW5kZWYJQ0ZHX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhY2sgc2l6ZXMKKyAqCisgKiBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUgICAgICAgICAoMTI4KjEwMjQpIC8qIHJlZ3VsYXIgc3RhY2sgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgTkFORCBJbmZvLgorICovCisKKworI2RlZmluZSBDRkdfTkFORF9LOUYxRzA4UjBBICAgIC8qIFNhbXN1bmcgOC1iaXQgMTI4TUIgY2hpcCBsYXJnZSBwYWdlIE5BTkQgY2hpcCovCisjZGVmaW5lIE5BTkRfMTZCSVQKKworLyogTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMDAgLSAweDAwMDdGRkZGICBCb290aW5nIEltYWdlCisgKiAweDAwMDgwMDAwIC0gMHgwMDIzRkZGRiAgVS1Cb290IEltYWdlCisgKiAweDAwMjQwMDAwIC0gMHgwMDI3RkZGRiAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwMjgwMDAwIC0gMHgwMDc3RkZGRiAgS2VybmVsIEltYWdlCisgKiAweDAwNzgwMDAwIC0gMHgwODAwMDAwMCAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisjZGVmaW5lIE5BTkRfVUJPT1RfU1RBUlQgICAgICAgICAweDAwODAwMDAgLyogTGVhdmluZyBmaXJzdCA0IGJsb2NrcyBmb3IgeC1sb2FkICovCisjZGVmaW5lIE5BTkRfVUJPT1RfRU5EICAgICAgICAgICAweDAyNDAwMDAgLyogR2l2aW5nIGEgc3BhY2Ugb2YgMiBibG9ja3MgPSAyNTZLQiAqLworI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUgICAgICAgICAgMHgyMDAwMAorCisjZGVmaW5lIEdQTUNfQ09ORklHICAgICAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4NTApCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4N0MpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODApCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODQpCisKKyNpZmRlZiBOQU5EXzE2QklUCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzApCisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZWxzZSAvKiB0byBzdXBwb3J0IDgtYml0IE5BTkQgZGV2aWNlcyAqLworI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzApOworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2VuZGlmCisKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBvbmVOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX1NZTkNfQlVSU1RfUkVBRCAgICAgIDEKKworLyogT25lTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqICAgMHgwMDAwMDAwIC0gMHgwMDgwMDAwICBYLUxvYWRlcgorICogICAweDAwODAwMDAgLSAweDAyNDAwMDAgICBVLWJvb3QgSW1hZ2UKKyAqICAgMHgwMjQwMDAwIC0gMHgwMjgwMDAwICAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAgIDB4MDI4MDAwMCAtIDB4MDc4MDAwMCAgIEtlcm5lbCBJbWFnZQorICogICAweDA3ODAwMDAgLSAweDgwMDAwMDAgICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKworI2RlZmluZSBPTkVOQU5EX1NUQVJUX0JMT0NLICAgICAgNAorI2RlZmluZSBPTkVOQU5EX0VORF9CTE9DSyAgICAgICAgMTgKKyNkZWZpbmUgT05FTkFORF9QQUdFX1NJWkUgICAgICAgIDIwNDggICAgIC8qIDJLQiAqLworI2RlZmluZSBPTkVOQU5EX0JMT0NLX1NJWkUgICAgICAgMHgyMDAwMCAgLyogMTI4S0IgKi8KKworI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9mYXQuaCBiL3gtbG9hZGVyL2luY2x1ZGUvZmF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1NzNiYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvZmF0LmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBSL08gKFYpRkFUIDEyLzE2LzMyIGZpbGVzeXN0ZW0gaW1wbGVtZW50YXRpb24gYnkgTWFyY3VzIFN1bmRiZXJnCisgKgorICogMjAwMi0wNy0yOCAtIHJqb25lc0BuZXh1cy10ZWNoLm5ldCAtIHBvcnRlZCB0byBwcGNib290IHYxLjEuNgorICogMjAwMy0wMy0xMCAtIGtoYXJyaXNAbmV4dXMtdGVjaC5uZXQgLSBwb3J0ZWQgdG8gdS1ib290CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0ZBVF9IXworI2RlZmluZSBfRkFUX0hfCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAorCisjZGVmaW5lIFNFQ1RPUl9TSVpFIEZTX0JMT0NLX1NJWkUKKworI2RlZmluZSBGU19CTE9DS19TSVpFIDUxMgorCisjaWYgRlNfQkxPQ0tfU0laRSAhPSBTRUNUT1JfU0laRQorI2Vycm9yIEZTX0JMT0NLX1NJWkUgIT0gU0VDVE9SX1NJWkUgLSBUaGlzIGNvZGUgbmVlZHMgdG8gYmUgZml4ZWQhCisjZW5kaWYKKworI2RlZmluZSBNQVhfQ0xVU1RTSVpFCTY1NTM2CisjZGVmaW5lIERJUkVOVFNQRVJCTE9DSwkoRlNfQkxPQ0tfU0laRS9zaXplb2YoZGlyX2VudHJ5KSkKKyNkZWZpbmUgRElSRU5UU1BFUkNMVVNUCSgobXlkYXRhLT5jbHVzdF9zaXplKlNFQ1RPUl9TSVpFKS9zaXplb2YoZGlyX2VudHJ5KSkKKworI2RlZmluZSBGQVRCVUZCTE9DS1MJNgorI2RlZmluZSBGQVRCVUZTSVpFCShGU19CTE9DS19TSVpFKkZBVEJVRkJMT0NLUykKKyNkZWZpbmUgRkFUMTJCVUZTSVpFCSgoRkFUQlVGU0laRSoyKS8zKQorI2RlZmluZSBGQVQxNkJVRlNJWkUJKEZBVEJVRlNJWkUvMikKKyNkZWZpbmUgRkFUMzJCVUZTSVpFCShGQVRCVUZTSVpFLzQpCisKKworLyogRmlsZXN5c3RlbSBpZGVudGlmaWVycyAqLworI2RlZmluZSBGQVQxMl9TSUdOCSJGQVQxMiAgICIKKyNkZWZpbmUgRkFUMTZfU0lHTgkiRkFUMTYgICAiCisjZGVmaW5lIEZBVDMyX1NJR04JIkZBVDMyICAgIgorI2RlZmluZSBTSUdOTEVOCQk3CisKKy8qIEZpbGUgYXR0cmlidXRlcyAqLworI2RlZmluZSBBVFRSX1JPICAgICAgMQorI2RlZmluZSBBVFRSX0hJRERFTiAgMgorI2RlZmluZSBBVFRSX1NZUyAgICAgNAorI2RlZmluZSBBVFRSX1ZPTFVNRSAgOAorI2RlZmluZSBBVFRSX0RJUiAgICAgMTYKKyNkZWZpbmUgQVRUUl9BUkNIICAgIDMyCisKKyNkZWZpbmUgQVRUUl9WRkFUICAgICAoQVRUUl9STyB8IEFUVFJfSElEREVOIHwgQVRUUl9TWVMgfCBBVFRSX1ZPTFVNRSkKKworI2RlZmluZSBERUxFVEVEX0ZMQUcJKChjaGFyKTB4ZTUpIC8qIE1hcmtzIGRlbGV0ZWQgZmlsZXMgd2hlbiBpbiBuYW1lWzBdICovCisjZGVmaW5lIGFSSU5HCQkweDA1CSAgICAgLyogVXNlZCB0byByZXByZXNlbnQgJ+UnIGluIG5hbWVbMF0gKi8KKworLyogSW5kaWNhdGVzIHRoYXQgdGhlIGVudHJ5IGlzIHRoZSBsYXN0IGxvbmcgZW50cnkgaW4gYSBzZXQgb2YgbG9uZworICogZGlyIGVudHJpZXMKKyAqLworI2RlZmluZSBMQVNUX0xPTkdfRU5UUllfTUFTSwkweDQwCisKKy8qIEZsYWdzIHRlbGxpbmcgd2hldGhlciB3ZSBzaG91bGQgcmVhZCBhIGZpbGUgb3IgbGlzdCBhIGRpcmVjdG9yeSAqLworI2RlZmluZSBMU19OTwkwCisjZGVmaW5lIExTX1lFUwkxCisjZGVmaW5lIExTX0RJUgkxCisjZGVmaW5lIExTX1JPT1QJMgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgRkFUX0RQUklOVChhcmdzLi4uKQlwcmludGYoYXJncykKKyNlbHNlCisjZGVmaW5lIEZBVF9EUFJJTlQoYXJncy4uLikKKyNlbmRpZgorI2RlZmluZSBGQVRfRVJST1IoYXJnKQkJcHJpbnRmKGFyZykKKworI2RlZmluZSBJU0RJUkRFTElNKGMpICAgKChjKSA9PSAnLycgfHwgKGMpID09ICdcXCcpCisKKyNkZWZpbmUgRlNUWVBFX05PTkUJKC0xKQorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoX19LRVJORUxfXykKKyNkZWZpbmUgRkFUMkNQVTE2CWxlMTZfdG9fY3B1CisjZGVmaW5lIEZBVDJDUFUzMglsZTMyX3RvX2NwdQorI2Vsc2UKKyNpZiBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgRkFUMkNQVTE2KHgpCSh4KQorI2RlZmluZSBGQVQyQ1BVMzIoeCkJKHgpCisjZWxzZQorI2RlZmluZSBGQVQyQ1BVMTYoeCkJKCgoKHgpICYgMHgwMGZmKSA8PCA4KSB8ICgoKHgpICYgMHhmZjAwKSA+PiA4KSkKKyNkZWZpbmUgRkFUMkNQVTMyKHgpCSgoKCh4KSAmIDB4MDAwMDAwZmYpIDw8IDI0KSAgfAlcCisJIAkJICgoKHgpICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwJXAorCQkJICgoKHgpICYgMHgwMGZmMDAwMCkgPj4gOCkgIHwJXAorCQkJICgoKHgpICYgMHhmZjAwMDAwMCkgPj4gMjQpKQorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBUT0xPV0VSKGMpCWlmKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJyl7KGMpKz0oJ2EnIC0gJ0EnKTt9CisjZGVmaW5lIFNUQVJUKGRlbnQpCShGQVQyQ1BVMTYoKGRlbnQpLT5zdGFydCkgXAorCQkJKyAobXlkYXRhLT5mYXRzaXplICE9IDMyID8gMCA6IFwKKwkJCSAgKEZBVDJDUFUxNigoZGVudCktPnN0YXJ0aGkpIDw8IDE2KSkpCisKKwordHlwZWRlZiBzdHJ1Y3QgYm9vdF9zZWN0b3IgeworCV9fdTgJaWdub3JlZFszXTsJLyogQm9vdHN0cmFwIGNvZGUgKi8KKwljaGFyCXN5c3RlbV9pZFs4XTsJLyogTmFtZSBvZiBmcyAqLworCV9fdTgJc2VjdG9yX3NpemVbMl07CS8qIEJ5dGVzL3NlY3RvciAqLworCV9fdTgJY2x1c3Rlcl9zaXplOwkvKiBTZWN0b3JzL2NsdXN0ZXIgKi8KKwlfX3UxNglyZXNlcnZlZDsJLyogTnVtYmVyIG9mIHJlc2VydmVkIHNlY3RvcnMgKi8KKwlfX3U4CWZhdHM7CQkvKiBOdW1iZXIgb2YgRkFUcyAqLworCV9fdTgJZGlyX2VudHJpZXNbMl07CS8qIE51bWJlciBvZiByb290IGRpcmVjdG9yeSBlbnRyaWVzICovCisJX191OAlzZWN0b3JzWzJdOwkvKiBOdW1iZXIgb2Ygc2VjdG9ycyAqLworCV9fdTgJbWVkaWE7CQkvKiBNZWRpYSBjb2RlICovCisJX191MTYJZmF0X2xlbmd0aDsJLyogU2VjdG9ycy9GQVQgKi8KKwlfX3UxNglzZWNzX3RyYWNrOwkvKiBTZWN0b3JzL3RyYWNrICovCisJX191MTYJaGVhZHM7CQkvKiBOdW1iZXIgb2YgaGVhZHMgKi8KKwlfX3UzMgloaWRkZW47CQkvKiBOdW1iZXIgb2YgaGlkZGVuIHNlY3RvcnMgKi8KKwlfX3UzMgl0b3RhbF9zZWN0OwkvKiBOdW1iZXIgb2Ygc2VjdG9ycyAoaWYgc2VjdG9ycyA9PSAwKSAqLworCisJLyogRkFUMzIgb25seSAqLworCV9fdTMyCWZhdDMyX2xlbmd0aDsJLyogU2VjdG9ycy9GQVQgKi8KKwlfX3UxNglmbGFnczsJCS8qIEJpdCA4OiBmYXQgbWlycm9yaW5nLCBsb3cgNDogYWN0aXZlIGZhdCAqLworCV9fdTgJdmVyc2lvblsyXTsJLyogRmlsZXN5c3RlbSB2ZXJzaW9uICovCisJX191MzIJcm9vdF9jbHVzdGVyOwkvKiBGaXJzdCBjbHVzdGVyIGluIHJvb3QgZGlyZWN0b3J5ICovCisJX191MTYJaW5mb19zZWN0b3I7CS8qIEZpbGVzeXN0ZW0gaW5mbyBzZWN0b3IgKi8KKwlfX3UxNgliYWNrdXBfYm9vdDsJLyogQmFja3VwIGJvb3Qgc2VjdG9yICovCisJX191MTYJcmVzZXJ2ZWQyWzZdOwkvKiBVbnVzZWQgKi8KK30gYm9vdF9zZWN0b3I7CisKK3R5cGVkZWYgc3RydWN0IHZvbHVtZV9pbmZvCit7CisJX191OCBkcml2ZV9udW1iZXI7CS8qIEJJT1MgZHJpdmUgbnVtYmVyICovCisJX191OCByZXNlcnZlZDsJCS8qIFVudXNlZCAqLworCV9fdTggZXh0X2Jvb3Rfc2lnbjsJLyogMHgyOSBpZiBmaWVsZHMgYmVsb3cgZXhpc3QgKERPUyAzLjMrKSAqLworCV9fdTggdm9sdW1lX2lkWzRdOwkvKiBWb2x1bWUgSUQgbnVtYmVyICovCisJY2hhciB2b2x1bWVfbGFiZWxbMTFdOwkvKiBWb2x1bWUgbGFiZWwgKi8KKwljaGFyIGZzX3R5cGVbOF07CS8qIFR5cGljYWxseSBGQVQxMiwgRkFUMTYsIG9yIEZBVDMyICovCisJLyogQm9vdCBjb2RlIGNvbWVzIG5leHQsIGFsbCBidXQgMiBieXRlcyB0byBmaWxsIHVwIHNlY3RvciAqLworCS8qIEJvb3Qgc2lnbiBjb21lcyBsYXN0LCAyIGJ5dGVzICovCit9IHZvbHVtZV9pbmZvOworCit0eXBlZGVmIHN0cnVjdCBkaXJfZW50cnkgeworCWNoYXIJbmFtZVs4XSxleHRbM107CS8qIE5hbWUgYW5kIGV4dGVuc2lvbiAqLworCV9fdTgJYXR0cjsJCS8qIEF0dHJpYnV0ZSBiaXRzICovCisJX191OAlsY2FzZTsJCS8qIENhc2UgZm9yIGJhc2UgYW5kIGV4dGVuc2lvbiAqLworCV9fdTgJY3RpbWVfbXM7CS8qIENyZWF0aW9uIHRpbWUsIG1pbGxpc2Vjb25kcyAqLworCV9fdTE2CWN0aW1lOwkJLyogQ3JlYXRpb24gdGltZSAqLworCV9fdTE2CWNkYXRlOwkJLyogQ3JlYXRpb24gZGF0ZSAqLworCV9fdTE2CWFkYXRlOwkJLyogTGFzdCBhY2Nlc3MgZGF0ZSAqLworCV9fdTE2CXN0YXJ0aGk7CS8qIEhpZ2ggMTYgYml0cyBvZiBjbHVzdGVyIGluIEZBVDMyICovCisJX191MTYJdGltZSxkYXRlLHN0YXJ0Oy8qIFRpbWUsIGRhdGUgYW5kIGZpcnN0IGNsdXN0ZXIgKi8KKwlfX3UzMglzaXplOwkJLyogRmlsZSBzaXplIGluIGJ5dGVzICovCit9IGRpcl9lbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgZGlyX3Nsb3QgeworCV9fdTggICAgaWQ7CQkvKiBTZXF1ZW5jZSBudW1iZXIgZm9yIHNsb3QgKi8KKwlfX3U4ICAgIG5hbWUwXzRbMTBdOwkvKiBGaXJzdCA1IGNoYXJhY3RlcnMgaW4gbmFtZSAqLworCV9fdTggICAgYXR0cjsJCS8qIEF0dHJpYnV0ZSBieXRlICovCisJX191OCAgICByZXNlcnZlZDsJLyogVW51c2VkICovCisJX191OCAgICBhbGlhc19jaGVja3N1bTsvKiBDaGVja3N1bSBmb3IgOC4zIGFsaWFzICovCisJX191OCAgICBuYW1lNV8xMFsxMl07CS8qIDYgbW9yZSBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KKwlfX3UxNiAgIHN0YXJ0OwkJLyogVW51c2VkICovCisJX191OCAgICBuYW1lMTFfMTJbNF07CS8qIExhc3QgMiBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KK30gZGlyX3Nsb3Q7CisKKy8qIFByaXZhdGUgZmlsZXN5c3RlbSBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CWZhdHNpemU7CS8qIFNpemUgb2YgRkFUIGluIGJpdHMgKi8KKwlfX3UxNglmYXRsZW5ndGg7CS8qIExlbmd0aCBvZiBGQVQgaW4gc2VjdG9ycyAqLworCV9fdTE2CWZhdF9zZWN0OwkvKiBTdGFydGluZyBzZWN0b3Igb2YgdGhlIEZBVCAqLworCV9fdTE2CXJvb3RkaXJfc2VjdDsJLyogU3RhcnQgc2VjdG9yIG9mIHJvb3QgZGlyZWN0b3J5ICovCisJX191MTYJY2x1c3Rfc2l6ZTsJLyogU2l6ZSBvZiBjbHVzdGVycyBpbiBzZWN0b3JzICovCisJc2hvcnQJZGF0YV9iZWdpbjsJLyogVGhlIHNlY3RvciBvZiB0aGUgZmlyc3QgY2x1c3RlciwgY2FuIGJlIG5lZ2F0aXZlICovCisJX191MzIJZmF0YnVmW0ZBVEJVRlNJWkVdOyAvKiBDdXJyZW50IEZBVCBidWZmZXIgKi8KKwlpbnQJZmF0YnVmbnVtOwkvKiBVc2VkIGJ5IGdldF9mYXRlbnQsIGluaXQgdG8gLTEgKi8KK30gZnNkYXRhOworCit0eXBlZGVmIGludAkoZmlsZV9kZXRlY3Rmc19mdW5jKSh2b2lkKTsKK3R5cGVkZWYgaW50CShmaWxlX2xzX2Z1bmMpKGNvbnN0IGNoYXIgKmRpcik7Cit0eXBlZGVmIGxvbmcJKGZpbGVfcmVhZF9mdW5jKShjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmZmVyLAorCQkJCSB1bnNpZ25lZCBsb25nIG1heHNpemUpOworCitzdHJ1Y3QgZmlsZXN5c3RlbSB7CisJZmlsZV9kZXRlY3Rmc19mdW5jICpkZXRlY3Q7CisJZmlsZV9sc19mdW5jCSAgICpsczsKKwlmaWxlX3JlYWRfZnVuYwkgICAqcmVhZDsKKwljb25zdCBjaGFyCSAgICBuYW1lWzEyXTsKK307CisKKy8qIEZBVCB0YWJsZXMgKi8KK2ZpbGVfZGV0ZWN0ZnNfZnVuYwlmaWxlX2ZhdF9kZXRlY3RmczsKK2ZpbGVfbHNfZnVuYwkJZmlsZV9mYXRfbHM7CitmaWxlX3JlYWRfZnVuYwkJZmlsZV9mYXRfcmVhZDsKKworLyogQ3VycmVudGx5IHRoaXMgZG9lc24ndCBjaGVjayBpZiB0aGUgZGlyIGV4aXN0cyBvciBpcyB2YWxpZC4uLiAqLworaW50IGZpbGVfY2QoY29uc3QgY2hhciAqcGF0aCk7CitpbnQgZmlsZV9mYXRfZGV0ZWN0ZnModm9pZCk7CitpbnQgZmlsZV9mYXRfbHMoY29uc3QgY2hhciAqZGlyKTsKK2xvbmcgZmlsZV9mYXRfcmVhZChjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIG1heHNpemUpOworY29uc3QgY2hhciAqZmlsZV9nZXRmc25hbWUoaW50IGlkeCk7CitpbnQgZmF0X3JlZ2lzdGVyX2RldmljZShibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYywgaW50IHBhcnRfbm8pOworCisjZW5kaWYgLyogX0ZBVF9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9pZGUuaCBiL3gtbG9hZGVyL2luY2x1ZGUvaWRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlZjMyZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvaWRlLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmCV9JREVfSAorI2RlZmluZSBfSURFX0gKKworI2RlZmluZQlJREVfQlVTKGRldikJKGRldiA+PiAxKQorCisjaWZkZWYgQ09ORklHX0lERV9MRUQKKworLyoKKyAqIExFRCBQb3J0CisgKi8KKyNkZWZpbmUJTEVEX1BPUlQJKCh1Y2hhciAqKShQRVI4X0JBU0UgKyAweDMwMDApKQorI2RlZmluZSBMRURfSURFMQkweDAxCisjZGVmaW5lIExFRF9JREUyCTB4MDIKKyNkZWZpbmUJREVWSUNFX0xFRChkKQkoKGQgJiAyKSB8ICgoZCAmIDIpID09IDApKSAvKiBkZXBlbmRzIG9uIGJpdCBwb3NpdGlvbnMhICovCisKKyNlbmRpZiAvKiBDT05GSUdfSURFX0xFRCAqLworCisjaWZkZWYgQ0ZHXzY0QklUX0xCQQordHlwZWRlZiB1aW50NjRfdCBsYmFpbnRfdDsKKyNlbHNlCit0eXBlZGVmIHVsb25nIGxiYWludF90OworI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbiBQcm90b3R5cGVzCisgKi8KKwordm9pZCAgaWRlX2luaXQgICh2b2lkKTsKK3Vsb25nIGlkZV9yZWFkCShpbnQgZGV2aWNlLCBsYmFpbnRfdCBibGtuciwgdWxvbmcgYmxrY250LCB1bG9uZyAqYnVmZmVyKTsKK3Vsb25nIGlkZV93cml0ZSAoaW50IGRldmljZSwgbGJhaW50X3QgYmxrbnIsIHVsb25nIGJsa2NudCwgdWxvbmcgKmJ1ZmZlcik7CisKKyNlbmRpZiAvKiBfSURFX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvaW1hZ2UuaCBiL3gtbG9hZGVyL2luY2x1ZGUvaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjc4ZTkwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9pbWFnZS5oCkBAIC0wLDAgKzEsNjc5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA4IFNlbWloYWxmCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDUKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgYW4gaW50ZXJmYWNlIHRvIFUtQm9vdC4gSW5jbHVkaW5nCisgKiB0aGlzICh1bm1vZGlmaWVkKSBoZWFkZXIgZmlsZSBpbiBhbm90aGVyIGZpbGUgaXMgY29uc2lkZXJlZCBub3JtYWwKKyAqIHVzZSBvZiBVLUJvb3QsIGFuZCBkb2VzICpub3QqIGZhbGwgdW5kZXIgdGhlIGhlYWRpbmcgb2YgImRlcml2ZWQKKyAqIHdvcmsiLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX0lNQUdFX0hfXworI2RlZmluZSBfX0lNQUdFX0hfXworCisjaW5jbHVkZSAiY29tcGlsZXIuaCIKKworI2lmZGVmIFVTRV9IT1NUQ0MKKworLyogbmV3IHVJbWFnZSBmb3JtYXQgc3VwcG9ydCBlbmFibGVkIG9uIGhvc3QgKi8KKyNkZWZpbmUgQ09ORklHX0ZJVAkJMQorI2RlZmluZSBDT05GSUdfT0ZfTElCRkRUCTEKKyNkZWZpbmUgQ09ORklHX0ZJVF9WRVJCT1NFCTEgLyogZW5hYmxlIGZpdF9mb3JtYXRfe2Vycm9yLHdhcm5pbmd9KCkgKi8KKworI2Vsc2UKKworI2luY2x1ZGUgPGNvbW1hbmQuaD4KKworI2VuZGlmIC8qIFVTRV9IT1NUQ0MgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKyNpbmNsdWRlIDxmZHQuaD4KKyNpbmNsdWRlIDxsaWJmZHQuaD4KKyNpbmNsdWRlIDxmZHRfc3VwcG9ydC5oPgorI2RlZmluZSBDT05GSUdfTUQ1CQkvKiBGSVQgaW1hZ2VzIG5lZWQgTUQ1IHN1cHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX1NIQTEJCS8qIGFuZCBTSEExICovCisjZW5kaWYKKworLyoKKyAqIE9wZXJhdGluZyBTeXN0ZW0gQ29kZXMKKyAqLworI2RlZmluZSBJSF9PU19JTlZBTElECQkwCS8qIEludmFsaWQgT1MJKi8KKyNkZWZpbmUgSUhfT1NfT1BFTkJTRAkJMQkvKiBPcGVuQlNECSovCisjZGVmaW5lIElIX09TX05FVEJTRAkJMgkvKiBOZXRCU0QJKi8KKyNkZWZpbmUgSUhfT1NfRlJFRUJTRAkJMwkvKiBGcmVlQlNECSovCisjZGVmaW5lIElIX09TXzRfNEJTRAkJNAkvKiA0LjRCU0QJKi8KKyNkZWZpbmUgSUhfT1NfTElOVVgJCTUJLyogTGludXgJKi8KKyNkZWZpbmUgSUhfT1NfU1ZSNAkJNgkvKiBTVlI0CQkqLworI2RlZmluZSBJSF9PU19FU0lYCQk3CS8qIEVzaXgJCSovCisjZGVmaW5lIElIX09TX1NPTEFSSVMJCTgJLyogU29sYXJpcwkqLworI2RlZmluZSBJSF9PU19JUklYCQk5CS8qIElyaXgJCSovCisjZGVmaW5lIElIX09TX1NDTwkJMTAJLyogU0NPCQkqLworI2RlZmluZSBJSF9PU19ERUxMCQkxMQkvKiBEZWxsCQkqLworI2RlZmluZSBJSF9PU19OQ1IJCTEyCS8qIE5DUgkJKi8KKyNkZWZpbmUgSUhfT1NfTFlOWE9TCQkxMwkvKiBMeW54T1MJKi8KKyNkZWZpbmUgSUhfT1NfVlhXT1JLUwkJMTQJLyogVnhXb3JrcwkqLworI2RlZmluZSBJSF9PU19QU09TCQkxNQkvKiBwU09TCQkqLworI2RlZmluZSBJSF9PU19RTlgJCTE2CS8qIFFOWAkJKi8KKyNkZWZpbmUgSUhfT1NfVV9CT09UCQkxNwkvKiBGaXJtd2FyZQkqLworI2RlZmluZSBJSF9PU19SVEVNUwkJMTgJLyogUlRFTVMJKi8KKyNkZWZpbmUgSUhfT1NfQVJUT1MJCTE5CS8qIEFSVE9TCSovCisjZGVmaW5lIElIX09TX1VOSVRZCQkyMAkvKiBVbml0eSBPUwkqLworI2RlZmluZSBJSF9PU19JTlRFR1JJVFkJCTIxCS8qIElOVEVHUklUWQkqLworCisvKgorICogQ1BVIEFyY2hpdGVjdHVyZSBDb2RlcyAoc3VwcG9ydGVkIGJ5IExpbnV4KQorICovCisjZGVmaW5lIElIX0FSQ0hfSU5WQUxJRAkJMAkvKiBJbnZhbGlkIENQVQkqLworI2RlZmluZSBJSF9BUkNIX0FMUEhBCQkxCS8qIEFscGhhCSovCisjZGVmaW5lIElIX0FSQ0hfQVJNCQkyCS8qIEFSTQkJKi8KKyNkZWZpbmUgSUhfQVJDSF9JMzg2CQkzCS8qIEludGVsIHg4NgkqLworI2RlZmluZSBJSF9BUkNIX0lBNjQJCTQJLyogSUE2NAkJKi8KKyNkZWZpbmUgSUhfQVJDSF9NSVBTCQk1CS8qIE1JUFMJCSovCisjZGVmaW5lIElIX0FSQ0hfTUlQUzY0CQk2CS8qIE1JUFMJIDY0IEJpdCAqLworI2RlZmluZSBJSF9BUkNIX1BQQwkJNwkvKiBQb3dlclBDCSovCisjZGVmaW5lIElIX0FSQ0hfUzM5MAkJOAkvKiBJQk0gUzM5MAkqLworI2RlZmluZSBJSF9BUkNIX1NICQk5CS8qIFN1cGVySAkqLworI2RlZmluZSBJSF9BUkNIX1NQQVJDCQkxMAkvKiBTcGFyYwkqLworI2RlZmluZSBJSF9BUkNIX1NQQVJDNjQJCTExCS8qIFNwYXJjIDY0IEJpdCAqLworI2RlZmluZSBJSF9BUkNIX002OEsJCTEyCS8qIE02OEsJCSovCisjZGVmaW5lIElIX0FSQ0hfTUlDUk9CTEFaRQkxNAkvKiBNaWNyb0JsYXplICAgKi8KKyNkZWZpbmUgSUhfQVJDSF9OSU9TMgkJMTUJLyogTmlvcy1JSQkqLworI2RlZmluZSBJSF9BUkNIX0JMQUNLRklOCTE2CS8qIEJsYWNrZmluCSovCisjZGVmaW5lIElIX0FSQ0hfQVZSMzIJCTE3CS8qIEFWUjMyCSovCisjZGVmaW5lIElIX0FSQ0hfU1QyMDAJICAgICAgICAxOAkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1QyMDAgICovCisKKy8qCisgKiBJbWFnZSBUeXBlcworICoKKyAqICJTdGFuZGFsb25lIFByb2dyYW1zIiBhcmUgZGlyZWN0bHkgcnVubmFibGUgaW4gdGhlIGVudmlyb25tZW50CisgKglwcm92aWRlZCBieSBVLUJvb3Q7IGl0IGlzIGV4cGVjdGVkIHRoYXQgKGlmIHRoZXkgYmVoYXZlCisgKgl3ZWxsKSB5b3UgY2FuIGNvbnRpbnVlIHRvIHdvcmsgaW4gVS1Cb290IGFmdGVyIHJldHVybiBmcm9tCisgKgl0aGUgU3RhbmRhbG9uZSBQcm9ncmFtLgorICogIk9TIEtlcm5lbCBJbWFnZXMiIGFyZSB1c3VhbGx5IGltYWdlcyBvZiBzb21lIEVtYmVkZGVkIE9TIHdoaWNoCisgKgl3aWxsIHRha2Ugb3ZlciBjb250cm9sIGNvbXBsZXRlbHkuIFVzdWFsbHkgdGhlc2UgcHJvZ3JhbXMKKyAqCXdpbGwgaW5zdGFsbCB0aGVpciBvd24gc2V0IG9mIGV4Y2VwdGlvbiBoYW5kbGVycywgZGV2aWNlCisgKglkcml2ZXJzLCBzZXQgdXAgdGhlIE1NVSwgZXRjLiAtIHRoaXMgbWVhbnMsIHRoYXQgeW91IGNhbm5vdAorICoJZXhwZWN0IHRvIHJlLWVudGVyIFUtQm9vdCBleGNlcHQgYnkgcmVzZXR0aW5nIHRoZSBDUFUuCisgKiAiUkFNRGlzayBJbWFnZXMiIGFyZSBtb3JlIG9yIGxlc3MganVzdCBkYXRhIGJsb2NrcywgYW5kIHRoZWlyCisgKglwYXJhbWV0ZXJzIChhZGRyZXNzLCBzaXplKSBhcmUgcGFzc2VkIHRvIGFuIE9TIGtlcm5lbCB0aGF0IGlzCisgKgliZWluZyBzdGFydGVkLgorICogIk11bHRpLUZpbGUgSW1hZ2VzIiBjb250YWluIHNldmVyYWwgaW1hZ2VzLCB0eXBpY2FsbHkgYW4gT1MKKyAqCShMaW51eCkga2VybmVsIGltYWdlIGFuZCBvbmUgb3IgbW9yZSBkYXRhIGltYWdlcyBsaWtlCisgKglSQU1EaXNrcy4gVGhpcyBjb25zdHJ1Y3QgaXMgdXNlZnVsIGZvciBpbnN0YW5jZSB3aGVuIHlvdSB3YW50CisgKgl0byBib290IG92ZXIgdGhlIG5ldHdvcmsgdXNpbmcgQk9PVFAgZXRjLiwgd2hlcmUgdGhlIGJvb3QKKyAqCXNlcnZlciBwcm92aWRlcyBqdXN0IGEgc2luZ2xlIGltYWdlIGZpbGUsIGJ1dCB5b3Ugd2FudCB0byBnZXQKKyAqCWZvciBpbnN0YW5jZSBhbiBPUyBrZXJuZWwgYW5kIGEgUkFNRGlzayBpbWFnZS4KKyAqCisgKgkiTXVsdGktRmlsZSBJbWFnZXMiIHN0YXJ0IHdpdGggYSBsaXN0IG9mIGltYWdlIHNpemVzLCBlYWNoCisgKglpbWFnZSBzaXplIChpbiBieXRlcykgc3BlY2lmaWVkIGJ5IGFuICJ1aW50MzJfdCIgaW4gbmV0d29yaworICoJYnl0ZSBvcmRlci4gVGhpcyBsaXN0IGlzIHRlcm1pbmF0ZWQgYnkgYW4gIih1aW50MzJfdCkwIi4KKyAqCUltbWVkaWF0ZWx5IGFmdGVyIHRoZSB0ZXJtaW5hdGluZyAwIGZvbGxvdyB0aGUgaW1hZ2VzLCBvbmUgYnkKKyAqCW9uZSwgYWxsIGFsaWduZWQgb24gInVpbnQzMl90IiBib3VuZGFyaWVzIChzaXplIHJvdW5kZWQgdXAgdG8KKyAqCWEgbXVsdGlwbGUgb2YgNCBieXRlcyAtIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZmlsZSkuCisgKgorICogIkZpcm13YXJlIEltYWdlcyIgYXJlIGJpbmFyeSBpbWFnZXMgY29udGFpbmluZyBmaXJtd2FyZSAobGlrZQorICoJVS1Cb290IG9yIEZQR0EgaW1hZ2VzKSB3aGljaCB1c3VhbGx5IHdpbGwgYmUgcHJvZ3JhbW1lZCB0bworICoJZmxhc2ggbWVtb3J5LgorICoKKyAqICJTY3JpcHQgZmlsZXMiIGFyZSBjb21tYW5kIHNlcXVlbmNlcyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkKKyAqCVUtQm9vdCdzIGNvbW1hbmQgaW50ZXJwcmV0ZXI7IHRoaXMgZmVhdHVyZSBpcyBlc3BlY2lhbGx5CisgKgl1c2VmdWwgd2hlbiB5b3UgY29uZmlndXJlIFUtQm9vdCB0byB1c2UgYSByZWFsIHNoZWxsIChodXNoKQorICoJYXMgY29tbWFuZCBpbnRlcnByZXRlciAoPT4gU2hlbGwgU2NyaXB0cykuCisgKi8KKworI2RlZmluZSBJSF9UWVBFX0lOVkFMSUQJCTAJLyogSW52YWxpZCBJbWFnZQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9TVEFOREFMT05FCTEJLyogU3RhbmRhbG9uZSBQcm9ncmFtCQkqLworI2RlZmluZSBJSF9UWVBFX0tFUk5FTAkJMgkvKiBPUyBLZXJuZWwgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfUkFNRElTSwkJMwkvKiBSQU1EaXNrIEltYWdlCQkqLworI2RlZmluZSBJSF9UWVBFX01VTFRJCQk0CS8qIE11bHRpLUZpbGUgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfRklSTVdBUkUJNQkvKiBGaXJtd2FyZSBJbWFnZQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9TQ1JJUFQJCTYJLyogU2NyaXB0IGZpbGUJCQkqLworI2RlZmluZSBJSF9UWVBFX0ZJTEVTWVNURU0JNwkvKiBGaWxlc3lzdGVtIEltYWdlIChhbnkgdHlwZSkJKi8KKyNkZWZpbmUgSUhfVFlQRV9GTEFURFQJCTgJLyogQmluYXJ5IEZsYXQgRGV2aWNlIFRyZWUgQmxvYgkqLworI2RlZmluZSBJSF9UWVBFX0tXQklNQUdFCTkJLyogS2lya3dvb2QgQm9vdCBJbWFnZQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9JTVhJTUFHRQkxMAkvKiBGcmVlc2NhbGUgSU1YQm9vdCBJbWFnZQkqLworCisvKgorICogQ29tcHJlc3Npb24gVHlwZXMKKyAqLworI2RlZmluZSBJSF9DT01QX05PTkUJCTAJLyogIE5vCSBDb21wcmVzc2lvbiBVc2VkCSovCisjZGVmaW5lIElIX0NPTVBfR1pJUAkJMQkvKiBnemlwCSBDb21wcmVzc2lvbiBVc2VkCSovCisjZGVmaW5lIElIX0NPTVBfQlpJUDIJCTIJLyogYnppcDIgQ29tcHJlc3Npb24gVXNlZAkqLworI2RlZmluZSBJSF9DT01QX0xaTUEJCTMJLyogbHptYSAgQ29tcHJlc3Npb24gVXNlZAkqLworI2RlZmluZSBJSF9DT01QX0xaTwkJNAkvKiBsem8gICBDb21wcmVzc2lvbiBVc2VkCSovCisKKyNkZWZpbmUgSUhfTUFHSUMJMHgyNzA1MTk1NgkvKiBJbWFnZSBNYWdpYyBOdW1iZXIJCSovCisjZGVmaW5lIElIX05NTEVOCQkzMgkvKiBJbWFnZSBOYW1lIExlbmd0aAkJKi8KKworLyoKKyAqIExlZ2FjeSBmb3JtYXQgaW1hZ2UgaGVhZGVyLAorICogYWxsIGRhdGEgaW4gbmV0d29yayBieXRlIG9yZGVyIChha2EgbmF0dXJhbCBha2EgYmlnZW5kaWFuKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaW1hZ2VfaGVhZGVyIHsKKwl1aW50MzJfdAlpaF9tYWdpYzsJLyogSW1hZ2UgSGVhZGVyIE1hZ2ljIE51bWJlcgkqLworCXVpbnQzMl90CWloX2hjcmM7CS8qIEltYWdlIEhlYWRlciBDUkMgQ2hlY2tzdW0JKi8KKwl1aW50MzJfdAlpaF90aW1lOwkvKiBJbWFnZSBDcmVhdGlvbiBUaW1lc3RhbXAJKi8KKwl1aW50MzJfdAlpaF9zaXplOwkvKiBJbWFnZSBEYXRhIFNpemUJCSovCisJdWludDMyX3QJaWhfbG9hZDsJLyogRGF0YQkgTG9hZCAgQWRkcmVzcwkJKi8KKwl1aW50MzJfdAlpaF9lcDsJCS8qIEVudHJ5IFBvaW50IEFkZHJlc3MJCSovCisJdWludDMyX3QJaWhfZGNyYzsJLyogSW1hZ2UgRGF0YSBDUkMgQ2hlY2tzdW0JKi8KKwl1aW50OF90CQlpaF9vczsJCS8qIE9wZXJhdGluZyBTeXN0ZW0JCSovCisJdWludDhfdAkJaWhfYXJjaDsJLyogQ1BVIGFyY2hpdGVjdHVyZQkJKi8KKwl1aW50OF90CQlpaF90eXBlOwkvKiBJbWFnZSBUeXBlCQkJKi8KKwl1aW50OF90CQlpaF9jb21wOwkvKiBDb21wcmVzc2lvbiBUeXBlCQkqLworCXVpbnQ4X3QJCWloX25hbWVbSUhfTk1MRU5dOwkvKiBJbWFnZSBOYW1lCQkqLworfSBpbWFnZV9oZWFkZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaW1hZ2VfaW5mbyB7CisJdWxvbmcJCXN0YXJ0LCBlbmQ7CQkvKiBzdGFydC9lbmQgb2YgYmxvYiAqLworCXVsb25nCQlpbWFnZV9zdGFydCwgaW1hZ2VfbGVuOyAvKiBzdGFydCBvZiBpbWFnZSB3aXRoaW4gYmxvYiwgbGVuIG9mIGltYWdlICovCisJdWxvbmcJCWxvYWQ7CQkJLyogbG9hZCBhZGRyIGZvciB0aGUgaW1hZ2UgKi8KKwl1aW50OF90CQljb21wLCB0eXBlLCBvczsJCS8qIGNvbXByZXNzaW9uLCB0eXBlIG9mIGltYWdlLCBvcyB0eXBlICovCit9IGltYWdlX2luZm9fdDsKKworLyoKKyAqIExlZ2FjeSBhbmQgRklUIGZvcm1hdCBoZWFkZXJzIHVzZWQgYnkgZG9fYm9vdG0oKSBhbmQgZG9fYm9vdG1fPG9zPigpCisgKiByb3V0aW5lcy4KKyAqLworc3RydWN0IGJkOworCit0eXBlZGVmIHN0cnVjdCBib290bV9oZWFkZXJzIHsKKwkvKgorCSAqIExlZ2FjeSBvcyBpbWFnZSBoZWFkZXIsIGlmIGl0IGlzIGEgbXVsdGkgY29tcG9uZW50IGltYWdlCisJICogdGhlbiBib290X2dldF9yYW1kaXNrKCkgYW5kIGdldF9mZHQoKSB3aWxsIGF0dGVtcHQgdG8gZ2V0CisJICogZGF0YSBmcm9tIHNlY29uZCBhbmQgdGhpcmQgY29tcG9uZW50IGFjY29yZGluZ2x5LgorCSAqLworCWltYWdlX2hlYWRlcl90CSpsZWdhY3lfaGRyX29zOwkJLyogaW1hZ2UgaGVhZGVyIHBvaW50ZXIgKi8KKwlpbWFnZV9oZWFkZXJfdAlsZWdhY3lfaGRyX29zX2NvcHk7CS8qIGhlYWRlciBjb3B5ICovCisJdWxvbmcJCWxlZ2FjeV9oZHJfdmFsaWQ7CisKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJY29uc3QgY2hhcgkqZml0X3VuYW1lX2NmZzsJLyogY29uZmlndXJhdGlvbiBub2RlIHVuaXQgbmFtZSAqLworCisJdm9pZAkJKmZpdF9oZHJfb3M7CS8qIG9zIEZJVCBpbWFnZSBoZWFkZXIgKi8KKwljb25zdCBjaGFyCSpmaXRfdW5hbWVfb3M7CS8qIG9zIHN1YmltYWdlIG5vZGUgdW5pdCBuYW1lICovCisJaW50CQlmaXRfbm9mZnNldF9vczsJLyogb3Mgc3ViaW1hZ2Ugbm9kZSBvZmZzZXQgKi8KKworCXZvaWQJCSpmaXRfaGRyX3JkOwkvKiBpbml0IHJhbWRpc2sgRklUIGltYWdlIGhlYWRlciAqLworCWNvbnN0IGNoYXIJKmZpdF91bmFtZV9yZDsJLyogaW5pdCByYW1kaXNrIHN1YmltYWdlIG5vZGUgdW5pdCBuYW1lICovCisJaW50CQlmaXRfbm9mZnNldF9yZDsJLyogaW5pdCByYW1kaXNrIHN1YmltYWdlIG5vZGUgb2Zmc2V0ICovCisKKwl2b2lkCQkqZml0X2hkcl9mZHQ7CS8qIEZEVCBibG9iIEZJVCBpbWFnZSBoZWFkZXIgKi8KKwljb25zdCBjaGFyCSpmaXRfdW5hbWVfZmR0OwkvKiBGRFQgYmxvYiBzdWJpbWFnZSBub2RlIHVuaXQgbmFtZSAqLworCWludAkJZml0X25vZmZzZXRfZmR0Oy8qIEZEVCBibG9iIHN1YmltYWdlIG5vZGUgb2Zmc2V0ICovCisjZW5kaWYKKworI2lmbmRlZiBVU0VfSE9TVENDCisJaW1hZ2VfaW5mb190CW9zOwkJLyogb3MgaW1hZ2UgaW5mbyAqLworCXVsb25nCQllcDsJCS8qIGVudHJ5IHBvaW50IG9mIE9TICovCisKKwl1bG9uZwkJcmRfc3RhcnQsIHJkX2VuZDsvKiByYW1kaXNrIHN0YXJ0L2VuZCAqLworCisjaWZkZWYgQ09ORklHX09GX0xJQkZEVAorCWNoYXIJCSpmdF9hZGRyOwkvKiBmbGF0IGRldiB0cmVlIGFkZHJlc3MgKi8KKyNlbmRpZgorCXVsb25nCQlmdF9sZW47CQkvKiBsZW5ndGggb2YgZmxhdCBkZXZpY2UgdHJlZSAqLworCisJdWxvbmcJCWluaXRyZF9zdGFydDsKKwl1bG9uZwkJaW5pdHJkX2VuZDsKKwl1bG9uZwkJY21kbGluZV9zdGFydDsKKwl1bG9uZwkJY21kbGluZV9lbmQ7CisJc3RydWN0IGJkCSprYmQ7CisjZW5kaWYKKworCWludAkJdmVyaWZ5OwkJLyogZ2V0ZW52KCJ2ZXJpZnkiKVswXSAhPSAnbicgKi8KKworI2RlZmluZQlCT09UTV9TVEFURV9TVEFSVAkoMHgwMDAwMDAwMSkKKyNkZWZpbmUJQk9PVE1fU1RBVEVfTE9BRE9TCSgweDAwMDAwMDAyKQorI2RlZmluZQlCT09UTV9TVEFURV9SQU1ESVNLCSgweDAwMDAwMDA0KQorI2RlZmluZQlCT09UTV9TVEFURV9GRFQJCSgweDAwMDAwMDA4KQorI2RlZmluZQlCT09UTV9TVEFURV9PU19DTURMSU5FCSgweDAwMDAwMDEwKQorI2RlZmluZQlCT09UTV9TVEFURV9PU19CRF9UCSgweDAwMDAwMDIwKQorI2RlZmluZQlCT09UTV9TVEFURV9PU19QUkVQCSgweDAwMDAwMDQwKQorI2RlZmluZQlCT09UTV9TVEFURV9PU19HTwkoMHgwMDAwMDA4MCkKKwlpbnQJCXN0YXRlOworCisjaWZkZWYgQ09ORklHX0xNQgorCXN0cnVjdCBsbWIJbG1iOwkJLyogZm9yIG1lbW9yeSBtZ210ICovCisjZW5kaWYKK30gYm9vdG1faGVhZGVyc190OworCisvKgorICogU29tZSBzeXN0ZW1zIChmb3IgZXhhbXBsZSBMV01PTikgaGF2ZSB2ZXJ5IHNob3J0IHdhdGNoZG9nIHBlcmlvZHM7CisgKiB3ZSBtdXN0IG1ha2Ugc3VyZSB0byBzcGxpdCBsb25nIG9wZXJhdGlvbnMgbGlrZSBtZW1tb3ZlKCkgb3IKKyAqIGNoZWNrc3VtIGNhbGN1bGF0aW9ucyBpbnRvIHJlYXNvbmFibGUgY2h1bmtzLgorICovCisjaWZuZGVmIENIVU5LU1oKKyNkZWZpbmUgQ0hVTktTWiAoNjQgKiAxMDI0KQorI2VuZGlmCisKKyNpZm5kZWYgQ0hVTktTWl9DUkMzMgorI2RlZmluZSBDSFVOS1NaX0NSQzMyICg2NCAqIDEwMjQpCisjZW5kaWYKKworI2lmbmRlZiBDSFVOS1NaX01ENQorI2RlZmluZSBDSFVOS1NaX01ENSAoNjQgKiAxMDI0KQorI2VuZGlmCisKKyNpZm5kZWYgQ0hVTktTWl9TSEExCisjZGVmaW5lIENIVU5LU1pfU0hBMSAoNjQgKiAxMDI0KQorI2VuZGlmCisKKyNkZWZpbmUgdWltYWdlX3RvX2NwdSh4KQkJYmUzMl90b19jcHUoeCkKKyNkZWZpbmUgY3B1X3RvX3VpbWFnZSh4KQkJY3B1X3RvX2JlMzIoeCkKKworLyoKKyAqIFRyYW5zbGF0aW9uIHRhYmxlIGZvciBlbnRyaWVzIG9mIGEgc3BlY2lmaWMgdHlwZTsgdXNlZCBieQorICogZ2V0X3RhYmxlX2VudHJ5X2lkKCkgYW5kIGdldF90YWJsZV9lbnRyeV9uYW1lKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHRhYmxlX2VudHJ5IHsKKwlpbnQJaWQ7CisJY2hhcgkqc25hbWU7CQkvKiBzaG9ydCAoaW5wdXQpIG5hbWUgdG8gZmluZCB0YWJsZSBlbnRyeSAqLworCWNoYXIJKmxuYW1lOwkJLyogbG9uZyAob3V0cHV0KSBuYW1lIHRvIHByaW50IGZvciBtZXNzYWdlcyAqLworfSB0YWJsZV9lbnRyeV90OworCisvKgorICogZ2V0X3RhYmxlX2VudHJ5X2lkKCkgc2NhbnMgdGhlIHRyYW5zbGF0aW9uIHRhYmxlIHRyeWluZyB0byBmaW5kIGFuCisgKiBlbnRyeSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHNob3J0IG5hbWUuIElmIGEgbWF0Y2hpbmcgZW50cnkgaXMKKyAqIGZvdW5kLCBpdCdzIGlkIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKi8KK2ludCBnZXRfdGFibGVfZW50cnlfaWQgKHRhYmxlX2VudHJ5X3QgKnRhYmxlLAorCQljb25zdCBjaGFyICp0YWJsZV9uYW1lLCBjb25zdCBjaGFyICpuYW1lKTsKKy8qCisgKiBnZXRfdGFibGVfZW50cnlfbmFtZSgpIHNjYW5zIHRoZSB0cmFuc2xhdGlvbiB0YWJsZSB0cnlpbmcgdG8gZmluZAorICogYW4gZW50cnkgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBpZC4gSWYgYSBtYXRjaGluZyBlbnRyeSBpcyBmb3VuZCwKKyAqIGl0cyBsb25nIG5hbWUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqLworY2hhciAqZ2V0X3RhYmxlX2VudHJ5X25hbWUgKHRhYmxlX2VudHJ5X3QgKnRhYmxlLCBjaGFyICptc2csIGludCBpZCk7CisKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfb3NfbmFtZSAodWludDhfdCBvcyk7Citjb25zdCBjaGFyICpnZW5pbWdfZ2V0X2FyY2hfbmFtZSAodWludDhfdCBhcmNoKTsKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfdHlwZV9uYW1lICh1aW50OF90IHR5cGUpOworY29uc3QgY2hhciAqZ2VuaW1nX2dldF9jb21wX25hbWUgKHVpbnQ4X3QgY29tcCk7CitpbnQgZ2VuaW1nX2dldF9vc19pZCAoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZ2VuaW1nX2dldF9hcmNoX2lkIChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBnZW5pbWdfZ2V0X3R5cGVfaWQgKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGdlbmltZ19nZXRfY29tcF9pZCAoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGdlbmltZ19wcmludF9zaXplICh1aW50MzJfdCBzaXplKTsKKworI2lmbmRlZiBVU0VfSE9TVENDCisvKiBJbWFnZSBmb3JtYXQgdHlwZXMsIHJldHVybmVkIGJ5IF9nZXRfZm9ybWF0KCkgcm91dGluZSAqLworI2RlZmluZSBJTUFHRV9GT1JNQVRfSU5WQUxJRAkweDAwCisjZGVmaW5lIElNQUdFX0ZPUk1BVF9MRUdBQ1kJMHgwMQkvKiBsZWdhY3kgaW1hZ2VfaGVhZGVyIGJhc2VkIGZvcm1hdCAqLworI2RlZmluZSBJTUFHRV9GT1JNQVRfRklUCTB4MDIJLyogbmV3LCBsaWJmZHQgYmFzZWQgZm9ybWF0ICovCisKK2ludCBnZW5pbWdfZ2V0X2Zvcm1hdCAodm9pZCAqaW1nX2FkZHIpOworaW50IGdlbmltZ19oYXNfY29uZmlnIChib290bV9oZWFkZXJzX3QgKmltYWdlcyk7Cit1bG9uZyBnZW5pbWdfZ2V0X2ltYWdlICh1bG9uZyBpbWdfYWRkcik7CisKK2ludCBib290X2dldF9yYW1kaXNrIChpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSwgYm9vdG1faGVhZGVyc190ICppbWFnZXMsCisJCXVpbnQ4X3QgYXJjaCwgdWxvbmcgKnJkX3N0YXJ0LCB1bG9uZyAqcmRfZW5kKTsKKworCisjaWZkZWYgQ09ORklHX09GX0xJQkZEVAoraW50IGJvb3RfZ2V0X2ZkdCAoaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdLCBib290bV9oZWFkZXJzX3QgKmltYWdlcywKKwkJY2hhciAqKm9mX2ZsYXRfdHJlZSwgdWxvbmcgKm9mX3NpemUpOworaW50IGJvb3RfcmVsb2NhdGVfZmR0IChzdHJ1Y3QgbG1iICpsbWIsIHVsb25nIGJvb3RtYXBfYmFzZSwKKwkJY2hhciAqKm9mX2ZsYXRfdHJlZSwgdWxvbmcgKm9mX3NpemUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QUEMpIHx8IGRlZmluZWQoQ09ORklHX002OEspCitpbnQgYm9vdF9yYW1kaXNrX2hpZ2ggKHN0cnVjdCBsbWIgKmxtYiwgdWxvbmcgcmRfZGF0YSwgdWxvbmcgcmRfbGVuLAorCQkgIHVsb25nICppbml0cmRfc3RhcnQsIHVsb25nICppbml0cmRfZW5kKTsKKworaW50IGJvb3RfZ2V0X2NtZGxpbmUgKHN0cnVjdCBsbWIgKmxtYiwgdWxvbmcgKmNtZF9zdGFydCwgdWxvbmcgKmNtZF9lbmQsCisJCQl1bG9uZyBib290bWFwX2Jhc2UpOworaW50IGJvb3RfZ2V0X2tiZCAoc3RydWN0IGxtYiAqbG1iLCBiZF90ICoqa2JkLCB1bG9uZyBib290bWFwX2Jhc2UpOworI2VuZGlmIC8qIENPTkZJR19QUEMgfHwgQ09ORklHX002OEsgKi8KKyNlbmRpZiAvKiAhVVNFX0hPU1RDQyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExlZ2FjeSBmb3JtYXQgc3BlY2lmaWMgY29kZSAocHJlZml4ZWQgd2l0aCBpbWFnZV8pICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgaW1hZ2VfZ2V0X2hlYWRlcl9zaXplICh2b2lkKQoreworCXJldHVybiAoc2l6ZW9mIChpbWFnZV9oZWFkZXJfdCkpOworfQorCisjZGVmaW5lIGltYWdlX2dldF9oZHJfbChmKSBcCisJc3RhdGljIGlubGluZSB1aW50MzJfdCBpbWFnZV9nZXRfIyNmKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpIFwKKwl7IFwKKwkJcmV0dXJuIHVpbWFnZV90b19jcHUgKGhkci0+aWhfIyNmKTsgXAorCX0KK2ltYWdlX2dldF9oZHJfbCAobWFnaWMpCQkvKiBpbWFnZV9nZXRfbWFnaWMgKi8KK2ltYWdlX2dldF9oZHJfbCAoaGNyYykJCS8qIGltYWdlX2dldF9oY3JjICovCitpbWFnZV9nZXRfaGRyX2wgKHRpbWUpCQkvKiBpbWFnZV9nZXRfdGltZSAqLworaW1hZ2VfZ2V0X2hkcl9sIChzaXplKQkJLyogaW1hZ2VfZ2V0X3NpemUgKi8KK2ltYWdlX2dldF9oZHJfbCAobG9hZCkJCS8qIGltYWdlX2dldF9sb2FkICovCitpbWFnZV9nZXRfaGRyX2wgKGVwKQkJLyogaW1hZ2VfZ2V0X2VwICovCitpbWFnZV9nZXRfaGRyX2wgKGRjcmMpCQkvKiBpbWFnZV9nZXRfZGNyYyAqLworCisjZGVmaW5lIGltYWdlX2dldF9oZHJfYihmKSBcCisJc3RhdGljIGlubGluZSB1aW50OF90IGltYWdlX2dldF8jI2YoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikgXAorCXsgXAorCQlyZXR1cm4gaGRyLT5paF8jI2Y7IFwKKwl9CitpbWFnZV9nZXRfaGRyX2IgKG9zKQkJLyogaW1hZ2VfZ2V0X29zICovCitpbWFnZV9nZXRfaGRyX2IgKGFyY2gpCQkvKiBpbWFnZV9nZXRfYXJjaCAqLworaW1hZ2VfZ2V0X2hkcl9iICh0eXBlKQkJLyogaW1hZ2VfZ2V0X3R5cGUgKi8KK2ltYWdlX2dldF9oZHJfYiAoY29tcCkJCS8qIGltYWdlX2dldF9jb21wICovCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqaW1hZ2VfZ2V0X25hbWUgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJcmV0dXJuIChjaGFyICopaGRyLT5paF9uYW1lOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGltYWdlX2dldF9kYXRhX3NpemUgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJcmV0dXJuIGltYWdlX2dldF9zaXplIChoZHIpOworfQorCisvKioKKyAqIGltYWdlX2dldF9kYXRhIC0gZ2V0IGltYWdlIHBheWxvYWQgc3RhcnQgYWRkcmVzcworICogQGhkcjogaW1hZ2UgaGVhZGVyCisgKgorICogaW1hZ2VfZ2V0X2RhdGEoKSByZXR1cm5zIGFkZHJlc3Mgb2YgdGhlIGltYWdlIHBheWxvYWQuIEZvciBzaW5nbGUKKyAqIGNvbXBvbmVudCBpbWFnZXMgaXQgaXMgaW1hZ2UgZGF0YSBzdGFydC4gRm9yIG11bHRpIGNvbXBvbmVudAorICogaW1hZ2VzIGl0IHBvaW50cyB0byB0aGUgbnVsbCB0ZXJtaW5hdGVkIHRhYmxlIG9mIHN1Yi1pbWFnZXMgc2l6ZXMuCisgKgorICogcmV0dXJuczoKKyAqICAgICBpbWFnZSBwYXlsb2FkIGRhdGEgc3RhcnQgYWRkcmVzcworICovCitzdGF0aWMgaW5saW5lIHVsb25nIGltYWdlX2dldF9kYXRhIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXJldHVybiAoKHVsb25nKWhkciArIGltYWdlX2dldF9oZWFkZXJfc2l6ZSAoKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgaW1hZ2VfZ2V0X2ltYWdlX3NpemUgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJcmV0dXJuIChpbWFnZV9nZXRfc2l6ZSAoaGRyKSArIGltYWdlX2dldF9oZWFkZXJfc2l6ZSAoKSk7Cit9CitzdGF0aWMgaW5saW5lIHVsb25nIGltYWdlX2dldF9pbWFnZV9lbmQgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJcmV0dXJuICgodWxvbmcpaGRyICsgaW1hZ2VfZ2V0X2ltYWdlX3NpemUgKGhkcikpOworfQorCisjZGVmaW5lIGltYWdlX3NldF9oZHJfbChmKSBcCisJc3RhdGljIGlubGluZSB2b2lkIGltYWdlX3NldF8jI2YoaW1hZ2VfaGVhZGVyX3QgKmhkciwgdWludDMyX3QgdmFsKSBcCisJeyBcCisJCWhkci0+aWhfIyNmID0gY3B1X3RvX3VpbWFnZSAodmFsKTsgXAorCX0KK2ltYWdlX3NldF9oZHJfbCAobWFnaWMpCQkvKiBpbWFnZV9zZXRfbWFnaWMgKi8KK2ltYWdlX3NldF9oZHJfbCAoaGNyYykJCS8qIGltYWdlX3NldF9oY3JjICovCitpbWFnZV9zZXRfaGRyX2wgKHRpbWUpCQkvKiBpbWFnZV9zZXRfdGltZSAqLworaW1hZ2Vfc2V0X2hkcl9sIChzaXplKQkJLyogaW1hZ2Vfc2V0X3NpemUgKi8KK2ltYWdlX3NldF9oZHJfbCAobG9hZCkJCS8qIGltYWdlX3NldF9sb2FkICovCitpbWFnZV9zZXRfaGRyX2wgKGVwKQkJLyogaW1hZ2Vfc2V0X2VwICovCitpbWFnZV9zZXRfaGRyX2wgKGRjcmMpCQkvKiBpbWFnZV9zZXRfZGNyYyAqLworCisjZGVmaW5lIGltYWdlX3NldF9oZHJfYihmKSBcCisJc3RhdGljIGlubGluZSB2b2lkIGltYWdlX3NldF8jI2YoaW1hZ2VfaGVhZGVyX3QgKmhkciwgdWludDhfdCB2YWwpIFwKKwl7IFwKKwkJaGRyLT5paF8jI2YgPSB2YWw7IFwKKwl9CitpbWFnZV9zZXRfaGRyX2IgKG9zKQkJLyogaW1hZ2Vfc2V0X29zICovCitpbWFnZV9zZXRfaGRyX2IgKGFyY2gpCQkvKiBpbWFnZV9zZXRfYXJjaCAqLworaW1hZ2Vfc2V0X2hkcl9iICh0eXBlKQkJLyogaW1hZ2Vfc2V0X3R5cGUgKi8KK2ltYWdlX3NldF9oZHJfYiAoY29tcCkJCS8qIGltYWdlX3NldF9jb21wICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbWFnZV9zZXRfbmFtZSAoaW1hZ2VfaGVhZGVyX3QgKmhkciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJuY3B5IChpbWFnZV9nZXRfbmFtZSAoaGRyKSwgbmFtZSwgSUhfTk1MRU4pOworfQorCitpbnQgaW1hZ2VfY2hlY2tfaGNyYyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcik7CitpbnQgaW1hZ2VfY2hlY2tfZGNyYyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcik7CisjaWZuZGVmIFVTRV9IT1NUQ0MKK2ludCBnZXRlbnZfeWVzbm8gKGNoYXIgKnZhcik7Cit1bG9uZyBnZXRlbnZfYm9vdG1fbG93KHZvaWQpOworcGh5c19zaXplX3QgZ2V0ZW52X2Jvb3RtX3NpemUodm9pZCk7Cit2b2lkIG1lbW1vdmVfd2QgKHZvaWQgKnRvLCB2b2lkICpmcm9tLCBzaXplX3QgbGVuLCB1bG9uZyBjaHVua3N6KTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBpbWFnZV9jaGVja19tYWdpYyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwlyZXR1cm4gKGltYWdlX2dldF9tYWdpYyAoaGRyKSA9PSBJSF9NQUdJQyk7Cit9CitzdGF0aWMgaW5saW5lIGludCBpbWFnZV9jaGVja190eXBlIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyLCB1aW50OF90IHR5cGUpCit7CisJcmV0dXJuIChpbWFnZV9nZXRfdHlwZSAoaGRyKSA9PSB0eXBlKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGltYWdlX2NoZWNrX2FyY2ggKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIsIHVpbnQ4X3QgYXJjaCkKK3sKKwlyZXR1cm4gKGltYWdlX2dldF9hcmNoIChoZHIpID09IGFyY2gpOworfQorc3RhdGljIGlubGluZSBpbnQgaW1hZ2VfY2hlY2tfb3MgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIsIHVpbnQ4X3Qgb3MpCit7CisJcmV0dXJuIChpbWFnZV9nZXRfb3MgKGhkcikgPT0gb3MpOworfQorCit1bG9uZyBpbWFnZV9tdWx0aV9jb3VudCAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcik7Cit2b2lkIGltYWdlX211bHRpX2dldGltZyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkciwgdWxvbmcgaWR4LAorCQkJdWxvbmcgKmRhdGEsIHVsb25nICpsZW4pOworCit2b2lkIGltYWdlX3ByaW50X2NvbnRlbnRzIChjb25zdCB2b2lkICpoZHIpOworCisjaWZuZGVmIFVTRV9IT1NUQ0MKK3N0YXRpYyBpbmxpbmUgaW50IGltYWdlX2NoZWNrX3RhcmdldF9hcmNoIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworI2lmIGRlZmluZWQoX19BUk1fXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9BUk0pKQorI2VsaWYgZGVmaW5lZChfX2F2cjMyX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfQVZSMzIpKQorI2VsaWYgZGVmaW5lZChfX2JmaW5fXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9CTEFDS0ZJTikpCisjZWxpZiBkZWZpbmVkKF9fSTM4Nl9fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX0kzODYpKQorI2VsaWYgZGVmaW5lZChfX002OEtfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9NNjhLKSkKKyNlbGlmIGRlZmluZWQoX19taWNyb2JsYXplX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfTUlDUk9CTEFaRSkpCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX01JUFMpKQorI2VsaWYgZGVmaW5lZChfX25pb3MyX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfTklPUzIpKQorI2VsaWYgZGVmaW5lZChfX1BQQ19fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX1BQQykpCisjZWxpZiBkZWZpbmVkKF9fc2hfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9TSCkpCisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9TUEFSQykpCisjZWxzZQorIyBlcnJvciBVbmtub3duIENQVSB0eXBlCisjZW5kaWYKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBVU0VfSE9TVENDICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTmV3IHVJbWFnZSBmb3JtYXQgc3BlY2lmaWMgY29kZSAocHJlZml4ZWQgd2l0aCBmaXRfKSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCisjZGVmaW5lIEZJVF9JTUFHRVNfUEFUSAkJIi9pbWFnZXMiCisjZGVmaW5lIEZJVF9DT05GU19QQVRICQkiL2NvbmZpZ3VyYXRpb25zIgorCisvKiBoYXNoIG5vZGUgKi8KKyNkZWZpbmUgRklUX0hBU0hfTk9ERU5BTUUJImhhc2giCisjZGVmaW5lIEZJVF9BTEdPX1BST1AJCSJhbGdvIgorI2RlZmluZSBGSVRfVkFMVUVfUFJPUAkJInZhbHVlIgorCisvKiBpbWFnZSBub2RlICovCisjZGVmaW5lIEZJVF9EQVRBX1BST1AJCSJkYXRhIgorI2RlZmluZSBGSVRfVElNRVNUQU1QX1BST1AJInRpbWVzdGFtcCIKKyNkZWZpbmUgRklUX0RFU0NfUFJPUAkJImRlc2NyaXB0aW9uIgorI2RlZmluZSBGSVRfQVJDSF9QUk9QCQkiYXJjaCIKKyNkZWZpbmUgRklUX1RZUEVfUFJPUAkJInR5cGUiCisjZGVmaW5lIEZJVF9PU19QUk9QCQkib3MiCisjZGVmaW5lIEZJVF9DT01QX1BST1AJCSJjb21wcmVzc2lvbiIKKyNkZWZpbmUgRklUX0VOVFJZX1BST1AJCSJlbnRyeSIKKyNkZWZpbmUgRklUX0xPQURfUFJPUAkJImxvYWQiCisKKy8qIGNvbmZpZ3VyYXRpb24gbm9kZSAqLworI2RlZmluZSBGSVRfS0VSTkVMX1BST1AJCSJrZXJuZWwiCisjZGVmaW5lIEZJVF9SQU1ESVNLX1BST1AJInJhbWRpc2siCisjZGVmaW5lIEZJVF9GRFRfUFJPUAkJImZkdCIKKyNkZWZpbmUgRklUX0RFRkFVTFRfUFJPUAkiZGVmYXVsdCIKKworI2RlZmluZSBGSVRfTUFYX0hBU0hfTEVOCTIwCS8qIG1heChjcmMzMl9sZW4oNCksIHNoYTFfbGVuKDIwKSkgKi8KKworLyogY21kbGluZSBhcmd1bWVudCBmb3JtYXQgcGFyc2luZyAqLworaW5saW5lIGludCBmaXRfcGFyc2VfY29uZiAoY29uc3QgY2hhciAqc3BlYywgdWxvbmcgYWRkcl9jdXJyLAorCQl1bG9uZyAqYWRkciwgY29uc3QgY2hhciAqKmNvbmZfbmFtZSk7CitpbmxpbmUgaW50IGZpdF9wYXJzZV9zdWJpbWFnZSAoY29uc3QgY2hhciAqc3BlYywgdWxvbmcgYWRkcl9jdXJyLAorCQl1bG9uZyAqYWRkciwgY29uc3QgY2hhciAqKmltYWdlX25hbWUpOworCit2b2lkIGZpdF9wcmludF9jb250ZW50cyAoY29uc3Qgdm9pZCAqZml0KTsKK3ZvaWQgZml0X2ltYWdlX3ByaW50IChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjb25zdCBjaGFyICpwKTsKK3ZvaWQgZml0X2ltYWdlX3ByaW50X2hhc2ggKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNvbnN0IGNoYXIgKnApOworCisvKioKKyAqIGZpdF9nZXRfZW5kIC0gZ2V0IEZJVCBpbWFnZSBzaXplCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICoKKyAqIHJldHVybnM6CisgKiAgICAgc2l6ZSBvZiB0aGUgRklUIGltYWdlIChibG9iKSBpbiBtZW1vcnkKKyAqLworc3RhdGljIGlubGluZSB1bG9uZyBmaXRfZ2V0X3NpemUgKGNvbnN0IHZvaWQgKmZpdCkKK3sKKwlyZXR1cm4gZmR0X3RvdGFsc2l6ZSAoZml0KTsKK30KKworLyoqCisgKiBmaXRfZ2V0X2VuZCAtIGdldCBGSVQgaW1hZ2UgZW5kCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICoKKyAqIHJldHVybnM6CisgKiAgICAgZW5kIGFkZHJlc3Mgb2YgdGhlIEZJVCBpbWFnZSAoYmxvYikgaW4gbWVtb3J5CisgKi8KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZml0X2dldF9lbmQgKGNvbnN0IHZvaWQgKmZpdCkKK3sKKwlyZXR1cm4gKHVsb25nKWZpdCArIGZkdF90b3RhbHNpemUgKGZpdCk7Cit9CisKKy8qKgorICogZml0X2dldF9uYW1lIC0gZ2V0IEZJVCBub2RlIG5hbWUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKgorICogcmV0dXJuczoKKyAqICAgICBOVUxMLCBvbiBlcnJvcgorICogICAgIHBvaW50ZXIgdG8gbm9kZSBuYW1lLCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZml0X2dldF9uYW1lIChjb25zdCB2b2lkICpmaXRfaGRyLAorCQlpbnQgbm9mZnNldCwgaW50ICpsZW4pCit7CisJcmV0dXJuIGZkdF9nZXRfbmFtZSAoZml0X2hkciwgbm9mZnNldCwgbGVuKTsKK30KKworaW50IGZpdF9nZXRfZGVzYyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY2hhciAqKmRlc2MpOworaW50IGZpdF9nZXRfdGltZXN0YW1wIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB0aW1lX3QgKnRpbWVzdGFtcCk7CisKK2ludCBmaXRfaW1hZ2VfZ2V0X25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgY29uc3QgY2hhciAqaW1hZ2VfdW5hbWUpOworaW50IGZpdF9pbWFnZV9nZXRfb3MgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKm9zKTsKK2ludCBmaXRfaW1hZ2VfZ2V0X2FyY2ggKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKmFyY2gpOworaW50IGZpdF9pbWFnZV9nZXRfdHlwZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqdHlwZSk7CitpbnQgZml0X2ltYWdlX2dldF9jb21wIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICpjb21wKTsKK2ludCBmaXRfaW1hZ2VfZ2V0X2xvYWQgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVsb25nICpsb2FkKTsKK2ludCBmaXRfaW1hZ2VfZ2V0X2VudHJ5IChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1bG9uZyAqZW50cnkpOworaW50IGZpdF9pbWFnZV9nZXRfZGF0YSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwKKwkJCQljb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKTsKKworaW50IGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjaGFyICoqYWxnbyk7CitpbnQgZml0X2ltYWdlX2hhc2hfZ2V0X3ZhbHVlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICoqdmFsdWUsCisJCQkJaW50ICp2YWx1ZV9sZW4pOworCitpbnQgZml0X3NldF90aW1lc3RhbXAgKHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHRpbWVfdCB0aW1lc3RhbXApOworaW50IGZpdF9zZXRfaGFzaGVzICh2b2lkICpmaXQpOworaW50IGZpdF9pbWFnZV9zZXRfaGFzaGVzICh2b2lkICpmaXQsIGludCBpbWFnZV9ub2Zmc2V0KTsKK2ludCBmaXRfaW1hZ2VfaGFzaF9zZXRfdmFsdWUgKHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKnZhbHVlLAorCQkJCWludCB2YWx1ZV9sZW4pOworCitpbnQgZml0X2ltYWdlX2NoZWNrX2hhc2hlcyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCk7CitpbnQgZml0X2FsbF9pbWFnZV9jaGVja19oYXNoZXMgKGNvbnN0IHZvaWQgKmZpdCk7CitpbnQgZml0X2ltYWdlX2NoZWNrX29zIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IG9zKTsKK2ludCBmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCBhcmNoKTsKK2ludCBmaXRfaW1hZ2VfY2hlY2tfdHlwZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCB0eXBlKTsKK2ludCBmaXRfaW1hZ2VfY2hlY2tfY29tcCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCBjb21wKTsKK2ludCBmaXRfY2hlY2tfZm9ybWF0IChjb25zdCB2b2lkICpmaXQpOworCitpbnQgZml0X2NvbmZfZ2V0X25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgY29uc3QgY2hhciAqY29uZl91bmFtZSk7CitpbnQgZml0X2NvbmZfZ2V0X2tlcm5lbF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0KTsKK2ludCBmaXRfY29uZl9nZXRfcmFtZGlza19ub2RlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0KTsKK2ludCBmaXRfY29uZl9nZXRfZmR0X25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQpOworCit2b2lkIGZpdF9jb25mX3ByaW50IChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjb25zdCBjaGFyICpwKTsKKworI2lmbmRlZiBVU0VfSE9TVENDCitzdGF0aWMgaW5saW5lIGludCBmaXRfaW1hZ2VfY2hlY2tfdGFyZ2V0X2FyY2ggKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGUpCit7CisjaWYgZGVmaW5lZChfX0FSTV9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9BUk0pKQorI2VsaWYgZGVmaW5lZChfX2F2cjMyX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX0FWUjMyKSkKKyNlbGlmIGRlZmluZWQoX19iZmluX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX0JMQUNLRklOKSkKKyNlbGlmIGRlZmluZWQoX19JMzg2X18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX0kzODYpKQorI2VsaWYgZGVmaW5lZChfX002OEtfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfTTY4SykpCisjZWxpZiBkZWZpbmVkKF9fbWljcm9ibGF6ZV9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9NSUNST0JMQVpFKSkKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX01JUFMpKQorI2VsaWYgZGVmaW5lZChfX25pb3MyX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX05JT1MyKSkKKyNlbGlmIGRlZmluZWQoX19QUENfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfUFBDKSkKKyNlbGlmIGRlZmluZWQoX19zaF9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9TSCkpCisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfU1BBUkMpKQorI2Vsc2UKKyMgZXJyb3IgVW5rbm93biBDUFUgdHlwZQorI2VuZGlmCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogVVNFX0hPU1RDQyAqLworCisjaWZkZWYgQ09ORklHX0ZJVF9WRVJCT1NFCisjZGVmaW5lIGZpdF91bnN1cHBvcnRlZChtc2cpCXByaW50ZiAoIiEgJXM6JWQgIiBcCisJCQkJIkZJVCBpbWFnZXMgbm90IHN1cHBvcnRlZCBmb3IgJyVzJ1xuIiwgXAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgKG1zZykpCisKKyNkZWZpbmUgZml0X3Vuc3VwcG9ydGVkX3Jlc2V0KG1zZykJcHJpbnRmICgiISAlczolZCAiIFwKKwkJCQkiRklUIGltYWdlcyBub3Qgc3VwcG9ydGVkIGZvciAnJXMnICIgXAorCQkJCSItIG11c3QgcmVzZXQgYm9hcmQgdG8gcmVjb3ZlciFcbiIsIFwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIChtc2cpKQorI2Vsc2UKKyNkZWZpbmUgZml0X3Vuc3VwcG9ydGVkKG1zZykKKyNkZWZpbmUgZml0X3Vuc3VwcG9ydGVkX3Jlc2V0KG1zZykKKyNlbmRpZiAvKiBDT05GSUdfRklUX1ZFUkJPU0UgKi8KKyNlbmRpZiAvKiBDT05GSUdfRklUICovCisKKyNlbmRpZgkvKiBfX0lNQUdFX0hfXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5YjBjODYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmgKQEAgLTAsMCArMSw2OSBAQAorI2lmbmRlZiBfTElOVVhfQllURU9SREVSX0JJR19FTkRJQU5fSAorI2RlZmluZSBfTElOVVhfQllURU9SREVSX0JJR19FTkRJQU5fSAorCisjaWZuZGVmIF9fQklHX0VORElBTgorI2RlZmluZSBfX0JJR19FTkRJQU4gNDMyMQorI2VuZGlmCisjaWZuZGVmIF9fQklHX0VORElBTl9CSVRGSUVMRAorI2RlZmluZSBfX0JJR19FTkRJQU5fQklURklFTEQKKyNlbmRpZgorI2RlZmluZQlfX0JZVEVfT1JERVIJX19CSUdfRU5ESUFOCisKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgorCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbmwoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbnRvaGwoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbnMoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbnRvaHMoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlNjQoeCkgX19fc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTY0X3RvX2NwdSh4KSBfX19zd2FiNjQoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTMyKHgpIF9fX3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGUzMl90b19jcHUoeCkgX19fc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGUxNih4KSBfX19zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMTZfdG9fY3B1KHgpIF9fX3N3YWIxNigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlNjQoeCkgKChfX3U2NCkoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmU2NF90b19jcHUoeCkgKChfX3U2NCkoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUzMl90b19jcHUoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUxNl90b19jcHUoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlNjQoeCkgX19zd2FiNjQoKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1KHgpIF9fc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMih4KSBfX3N3YWIzMigoeCkpCisjZGVmaW5lIF9fbGUzMl90b19jcHUoeCkgX19zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2KHgpIF9fc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdSh4KSBfX3N3YWIxNigoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlNjQoeCkgKChfX3U2NCkoeCkpCisjZGVmaW5lIF9fYmU2NF90b19jcHUoeCkgKChfX3U2NCkoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzIoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fYmUzMl90b19jcHUoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTYoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fYmUxNl90b19jcHUoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlNjRwKHgpIF9fc3dhYjY0cCgoeCkpCisjZGVmaW5lIF9fbGU2NF90b19jcHVwKHgpIF9fc3dhYjY0cCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMzJwKHgpIF9fc3dhYjMycCgoeCkpCisjZGVmaW5lIF9fbGUzMl90b19jcHVwKHgpIF9fc3dhYjMycCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMTZwKHgpIF9fc3dhYjE2cCgoeCkpCisjZGVmaW5lIF9fbGUxNl90b19jcHVwKHgpIF9fc3dhYjE2cCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlNjRwKHgpICgqKF9fdTY0KikoeCkpCisjZGVmaW5lIF9fYmU2NF90b19jcHVwKHgpICgqKF9fdTY0KikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzJwKHgpICgqKF9fdTMyKikoeCkpCisjZGVmaW5lIF9fYmUzMl90b19jcHVwKHgpICgqKF9fdTMyKikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTZwKHgpICgqKF9fdTE2KikoeCkpCisjZGVmaW5lIF9fYmUxNl90b19jcHVwKHgpICgqKF9fdTE2KikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlNjRzKHgpIF9fc3dhYjY0cygoeCkpCisjZGVmaW5lIF9fbGU2NF90b19jcHVzKHgpIF9fc3dhYjY0cygoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMzJzKHgpIF9fc3dhYjMycygoeCkpCisjZGVmaW5lIF9fbGUzMl90b19jcHVzKHgpIF9fc3dhYjMycygoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMTZzKHgpIF9fc3dhYjE2cygoeCkpCisjZGVmaW5lIF9fbGUxNl90b19jcHVzKHgpIF9fc3dhYjE2cygoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlNjRzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMnMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fYmUzMl90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19iZTE2cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19iZTE2X3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorCisjZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9CSUdfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZmY4NTBmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oCkBAIC0wLDAgKzEsMTgwIEBACisjaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfR0VORVJJQ19ICisjZGVmaW5lIF9MSU5VWF9CWVRFT1JERVJfR0VORVJJQ19ICisKKy8qCisgKiBsaW51eC9ieXRlb3JkZXJfZ2VuZXJpYy5oCisgKiBHZW5lcmljIEJ5dGUtcmVvcmRlcmluZyBzdXBwb3J0CisgKgorICogRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPiAxOTk3MDcwNworICogICAgZ2F0aGVyZWQgYWxsIHRoZSBnb29kIGlkZWFzIGZyb20gYWxsIGFzbS1mb28vYnl0ZW9yZGVyLmggaW50byBvbmUgZmlsZSwKKyAqICAgIGNsZWFuZWQgdGhlbSB1cC4KKyAqICAgIEkgaG9wZSBpdCBpcyBjb21wbGlhbnQgd2l0aCBub24tR0NDIGNvbXBpbGVycy4KKyAqICAgIEkgZGVjaWRlZCB0byBwdXQgX19CWVRFT1JERVJfSEFTX1U2NF9fIGluIGJ5dGVvcmRlci5oLAorICogICAgYmVjYXVzZSBJIHdhc24ndCBzdXJlIGl0IHdvdWxkIGJlIG9rIHRvIHB1dCBpdCBpbiB0eXBlcy5oCisgKiAgICBVcGdyYWRlZCBpdCB0byAyLjEuNDMKKyAqIEZyYW5jb2lzLVJlbmUgUmlkZWF1IDxmYXJlQHR1bmVzLm9yZz4gMTk5NzEwMTIKKyAqICAgIFVwZ3JhZGVkIGl0IHRvIDIuMS41NworICogICAgdG8gcGxlYXNlIExpbnVzIFQuLCByZXBsYWNlZCBodWdlICNpZmRlZidzIGJldHdlZW4gbGl0dGxlL2JpZyBlbmRpYW4KKyAqICAgIGJ5IG5lc3RlZGx5ICNpbmNsdWRlJ2QgZmlsZXMuCisgKiBGcmFuY29pcy1SZW5lIFJpZGVhdSA8ZmFyZUB0dW5lcy5vcmc+IDE5OTcxMjA1CisgKiAgICBNYWRlIGl0IHRvIDIuMS43MTsgbm93IGEgZmFjZWxpZnQ6CisgKiAgICBQdXQgZmlsZXMgdW5kZXIgaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvCisgKiAgICBTcGxpdCBzd2FiIGZyb20gZ2VuZXJpYyBzdXBwb3J0LgorICoKKyAqIFRPRE86CisgKiAgID0gUmVndWxhciBrZXJuZWwgbWFpbnRhaW5lcnMgY291bGQgYWxzbyByZXBsYWNlIGFsbCB0aGVzZSBtYW51YWwKKyAqICAgIGJ5dGVzd2FwIG1hY3JvcyB0aGF0IHJlbWFpbiwgZGlzc2VtaW5hdGVkIGFtb25nIGRyaXZlcnMsCisgKiAgICBhZnRlciBzb21lIGdyZXAgb3IgdGhlIHNvdXJjZXMuLi4KKyAqICAgPSBMaW51cyBtaWdodCB3YW50IHRvIHJlbmFtZSBhbGwgdGhlc2UgbWFjcm9zIGFuZCBmaWxlcyB0byBmaXQgaGlzIHRhc3RlLAorICogICAgdG8gZml0IGhpcyBwZXJzb25hbCBuYW1pbmcgc2NoZW1lLgorICogICA9IGl0IHNlZW1zIHRoYXQgYSBmZXcgZHJpdmVycyB3b3VsZCBhbHNvIGFwcHJlY2lhdGUKKyAqICAgIG55YmJsZSBzd2FwcGluZyBzdXBwb3J0Li4uCisgKiAgID0gZXZlcnkgYXJjaGl0ZWN0dXJlIGNvdWxkIGFkZCB0aGVpciBieXRlc3dhcCBtYWNybyBpbiBhc20vYnl0ZW9yZGVyLmgKKyAqICAgIHNlZSBob3cgc29tZSBhcmNoaXRlY3R1cmVzIGFscmVhZHkgZG8gKGkzODYsIGFscGhhLCBwcGMsIGV0YykKKyAqICAgPSBjcHVfdG9fYmVYWCBhbmQgYmVYWF90b19jcHUgbWlnaHQgc29tZSBkYXkgbmVlZCB0byBiZSB3ZWxsCisgKiAgICBkaXN0aW5ndWlzaGVkIHRocm91Z2hvdXQgdGhlIGtlcm5lbC4gVGhpcyBpcyBub3QgdGhlIGNhc2UgY3VycmVudGx5LAorICogICAgc2luY2UgbGl0dGxlIGVuZGlhbiwgYmlnIGVuZGlhbiwgYW5kIHBkcCBlbmRpYW4gbWFjaGluZXMgbmVlZG4ndCBpdC4KKyAqICAgIEJ1dCB0aGlzIG1pZ2h0IGJlIHRoZSBjYXNlIGZvciwgc2F5LCBhIHBvcnQgb2YgTGludXggdG8gMjAvMjEgYml0CisgKiAgICBhcmNoaXRlY3R1cmVzIChhbmQgRjIxIExpbnV4IGFkZGljdCBhcm91bmQ/KS4KKyAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHRvIGJlIGRlZmluZWQgYnkgPGFzbS9ieXRlb3JkZXIuaD46CisgKgorICogQ29udmVyc2lvbiBvZiBsb25nIGFuZCBzaG9ydCBpbnQgYmV0d2VlbiBuZXR3b3JrIGFuZCBob3N0IGZvcm1hdAorICoJbnRvaGwoX191MzIgeCkKKyAqCW50b2hzKF9fdTE2IHgpCisgKglodG9ubChfX3UzMiB4KQorICoJaHRvbnMoX191MTYgeCkKKyAqIEl0IHNlZW1zIHRoYXQgc29tZSBwcm9ncmFtcyAod2hpY2g/IHdoZXJlPyBvciBwZXJoYXBzIGEgc3RhbmRhcmQ/IFBPU0lYPykKKyAqIG1pZ2h0IGxpa2UgdGhlIGFib3ZlIHRvIGJlIGZ1bmN0aW9ucywgbm90IG1hY3JvcyAod2h5PykuCisgKiBpZiB0aGF0J3MgdHJ1ZSwgdGhlbiBkZXRlY3QgdGhlbSwgYW5kIHRha2UgbWVhc3VyZXMuCisgKiBBbnl3YXksIHRoZSBtZWFzdXJlIGlzOiBkZWZpbmUgb25seSBfX19udG9obCBhcyBhIG1hY3JvIGluc3RlYWQsCisgKiBhbmQgaW4gYSBzZXBhcmF0ZSBmaWxlLCBoYXZlCisgKiB1bnNpZ25lZCBsb25nIGlubGluZSBudG9obCh4KXtyZXR1cm4gX19fbnRvaGwoeCk7fQorICoKKyAqIFRoZSBzYW1lIGZvciBjb25zdGFudCBhcmd1bWVudHMKKyAqCV9fY29uc3RhbnRfbnRvaGwoX191MzIgeCkKKyAqCV9fY29uc3RhbnRfbnRvaHMoX191MTYgeCkKKyAqCV9fY29uc3RhbnRfaHRvbmwoX191MzIgeCkKKyAqCV9fY29uc3RhbnRfaHRvbnMoX191MTYgeCkKKyAqCisgKiBDb252ZXJzaW9uIG9mIFhYLWJpdCBpbnRlZ2VycyAoMTYtIDMyLSBvciA2NC0pCisgKiBiZXR3ZWVuIG5hdGl2ZSBDUFUgZm9ybWF0IGFuZCBsaXR0bGUvYmlnIGVuZGlhbiBmb3JtYXQKKyAqIDY0LWJpdCBzdHVmZiBvbmx5IGRlZmluZWQgZm9yIHByb3BlciBhcmNoaXRlY3R1cmVzCisgKgljcHVfdG9fW2JsXWVYWChfX3VYWCB4KQorICoJW2JsXWVYWF90b19jcHUoX191WFggeCkKKyAqCisgKiBUaGUgc2FtZSwgYnV0IHRha2VzIGEgcG9pbnRlciB0byB0aGUgdmFsdWUgdG8gY29udmVydAorICoJY3B1X3RvX1tibF1lWFhwKF9fdVhYIHgpCisgKglbYmxdZVhYX3RvX2NwdXAoX191WFggeCkKKyAqCisgKiBUaGUgc2FtZSwgYnV0IGNoYW5nZSBpbiBzaXR1CisgKgljcHVfdG9fW2JsXWVYWHMoX191WFggeCkKKyAqCVtibF1lWFhfdG9fY3B1cyhfX3VYWCB4KQorICoKKyAqIFNlZSBhc20tZm9vL2J5dGVvcmRlci5oIGZvciBleGFtcGxlcyBvZiBob3cgdG8gcHJvdmlkZQorICogYXJjaGl0ZWN0dXJlLW9wdGltaXplZCB2ZXJzaW9ucworICoKKyAqLworCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pCisvKgorICogaW5zaWRlIHRoZSBrZXJuZWwsIHdlIGNhbiB1c2Ugbmlja25hbWVzOworICogb3V0c2lkZSBvZiBpdCwgd2UgbXVzdCBhdm9pZCBQT1NJWCBuYW1lc3BhY2UgcG9sbHV0aW9uLi4uCisgKi8KKyNkZWZpbmUgY3B1X3RvX2xlNjQgX19jcHVfdG9fbGU2NAorI2RlZmluZSBsZTY0X3RvX2NwdSBfX2xlNjRfdG9fY3B1CisjZGVmaW5lIGNwdV90b19sZTMyIF9fY3B1X3RvX2xlMzIKKyNkZWZpbmUgbGUzMl90b19jcHUgX19sZTMyX3RvX2NwdQorI2RlZmluZSBjcHVfdG9fbGUxNiBfX2NwdV90b19sZTE2CisjZGVmaW5lIGxlMTZfdG9fY3B1IF9fbGUxNl90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2JlNjQgX19jcHVfdG9fYmU2NAorI2RlZmluZSBiZTY0X3RvX2NwdSBfX2JlNjRfdG9fY3B1CisjZGVmaW5lIGNwdV90b19iZTMyIF9fY3B1X3RvX2JlMzIKKyNkZWZpbmUgYmUzMl90b19jcHUgX19iZTMyX3RvX2NwdQorI2RlZmluZSBjcHVfdG9fYmUxNiBfX2NwdV90b19iZTE2CisjZGVmaW5lIGJlMTZfdG9fY3B1IF9fYmUxNl90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2xlNjRwIF9fY3B1X3RvX2xlNjRwCisjZGVmaW5lIGxlNjRfdG9fY3B1cCBfX2xlNjRfdG9fY3B1cAorI2RlZmluZSBjcHVfdG9fbGUzMnAgX19jcHVfdG9fbGUzMnAKKyNkZWZpbmUgbGUzMl90b19jcHVwIF9fbGUzMl90b19jcHVwCisjZGVmaW5lIGNwdV90b19sZTE2cCBfX2NwdV90b19sZTE2cAorI2RlZmluZSBsZTE2X3RvX2NwdXAgX19sZTE2X3RvX2NwdXAKKyNkZWZpbmUgY3B1X3RvX2JlNjRwIF9fY3B1X3RvX2JlNjRwCisjZGVmaW5lIGJlNjRfdG9fY3B1cCBfX2JlNjRfdG9fY3B1cAorI2RlZmluZSBjcHVfdG9fYmUzMnAgX19jcHVfdG9fYmUzMnAKKyNkZWZpbmUgYmUzMl90b19jcHVwIF9fYmUzMl90b19jcHVwCisjZGVmaW5lIGNwdV90b19iZTE2cCBfX2NwdV90b19iZTE2cAorI2RlZmluZSBiZTE2X3RvX2NwdXAgX19iZTE2X3RvX2NwdXAKKyNkZWZpbmUgY3B1X3RvX2xlNjRzIF9fY3B1X3RvX2xlNjRzCisjZGVmaW5lIGxlNjRfdG9fY3B1cyBfX2xlNjRfdG9fY3B1cworI2RlZmluZSBjcHVfdG9fbGUzMnMgX19jcHVfdG9fbGUzMnMKKyNkZWZpbmUgbGUzMl90b19jcHVzIF9fbGUzMl90b19jcHVzCisjZGVmaW5lIGNwdV90b19sZTE2cyBfX2NwdV90b19sZTE2cworI2RlZmluZSBsZTE2X3RvX2NwdXMgX19sZTE2X3RvX2NwdXMKKyNkZWZpbmUgY3B1X3RvX2JlNjRzIF9fY3B1X3RvX2JlNjRzCisjZGVmaW5lIGJlNjRfdG9fY3B1cyBfX2JlNjRfdG9fY3B1cworI2RlZmluZSBjcHVfdG9fYmUzMnMgX19jcHVfdG9fYmUzMnMKKyNkZWZpbmUgYmUzMl90b19jcHVzIF9fYmUzMl90b19jcHVzCisjZGVmaW5lIGNwdV90b19iZTE2cyBfX2NwdV90b19iZTE2cworI2RlZmluZSBiZTE2X3RvX2NwdXMgX19iZTE2X3RvX2NwdXMKKyNlbmRpZgorCisKKy8qCisgKiBIYW5kbGUgbnRvaGwgYW5kIHN1Y2hlcy4gVGhlc2UgaGF2ZSB2YXJpb3VzIGNvbXBhdGliaWxpdHkKKyAqIGlzc3VlcyAtIGxpa2Ugd2Ugd2FudCB0byBnaXZlIHRoZSBwcm90b3R5cGUgZXZlbiB0aG91Z2ggd2UKKyAqIGFsc28gaGF2ZSBhIG1hY3JvIGZvciB0aGVtIGluIGNhc2Ugc29tZSBzdHJhbmdlIHByb2dyYW0KKyAqIHdhbnRzIHRvIHRha2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHRoaW5nIG9yIHNvbWV0aGluZy4uCisgKgorICogTm90ZSB0aGF0IHRoZXNlIHVzZWQgdG8gcmV0dXJuIGEgImxvbmciIGluIGxpYmM1LCBldmVuIHRob3VnaAorICogbG9uZyBpcyBvZnRlbiA2NC1iaXQgdGhlc2UgZGF5cy4uIFRodXMgdGhlIGNhc3RzLgorICoKKyAqIFRoZXkgaGF2ZSB0byBiZSBtYWNyb3MgaW4gb3JkZXIgdG8gZG8gdGhlIGNvbnN0YW50IGZvbGRpbmcKKyAqIGNvcnJlY3RseSAtIGlmIHRoZSBhcmd1bWVudCBwYXNzZWQgaW50byBhIGlubGluZSBmdW5jdGlvbgorICogaXQgaXMgbm8gbG9uZ2VyIGNvbnN0YW50IGFjY29yZGluZyB0byBnY2MuLgorICovCisKKyN1bmRlZiBudG9obAorI3VuZGVmIG50b2hzCisjdW5kZWYgaHRvbmwKKyN1bmRlZiBodG9ucworCisvKgorICogRG8gdGhlIHByb3RvdHlwZXMuIFNvbWVib2R5IG1pZ2h0IHdhbnQgdG8gdGFrZSB0aGUKKyAqIGFkZHJlc3Mgb3Igc29tZSBzdWNoIHNpY2sgdGhpbmcuLgorICovCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAoZGVmaW5lZCAoX19HTElCQ19fKSAmJiBfX0dMSUJDX18gPj0gMikKK2V4dGVybiBfX3UzMgkJCW50b2hsKF9fdTMyKTsKK2V4dGVybiBfX3UzMgkJCWh0b25sKF9fdTMyKTsKKyNlbHNlCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQJbnRvaGwodW5zaWduZWQgbG9uZyBpbnQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50CWh0b25sKHVuc2lnbmVkIGxvbmcgaW50KTsKKyNlbmRpZgorZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGludAludG9ocyh1bnNpZ25lZCBzaG9ydCBpbnQpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGludAlodG9ucyh1bnNpZ25lZCBzaG9ydCBpbnQpOworCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gMikKKworI2RlZmluZSBfX19odG9ubCh4KSBfX2NwdV90b19iZTMyKHgpCisjZGVmaW5lIF9fX2h0b25zKHgpIF9fY3B1X3RvX2JlMTYoeCkKKyNkZWZpbmUgX19fbnRvaGwoeCkgX19iZTMyX3RvX2NwdSh4KQorI2RlZmluZSBfX19udG9ocyh4KSBfX2JlMTZfdG9fY3B1KHgpCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IChkZWZpbmVkIChfX0dMSUJDX18pICYmIF9fR0xJQkNfXyA+PSAyKQorI2RlZmluZSBodG9ubCh4KSBfX19odG9ubCh4KQorI2RlZmluZSBudG9obCh4KSBfX19udG9obCh4KQorI2Vsc2UKKyNkZWZpbmUgaHRvbmwoeCkgKCh1bnNpZ25lZCBsb25nKV9fX2h0b25sKHgpKQorI2RlZmluZSBudG9obCh4KSAoKHVuc2lnbmVkIGxvbmcpX19fbnRvaGwoeCkpCisjZW5kaWYKKyNkZWZpbmUgaHRvbnMoeCkgX19faHRvbnMoeCkKKyNkZWZpbmUgbnRvaHMoeCkgX19fbnRvaHMoeCkKKworI2VuZGlmIC8qIE9QVElNSVpFICovCisKKworI2VuZGlmIC8qIF9MSU5VWF9CWVRFT1JERVJfR0VORVJJQ19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTQ2ZjNlYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaApAQCAtMCwwICsxLDY5IEBACisjaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfTElUVExFX0VORElBTl9ICisjZGVmaW5lIF9MSU5VWF9CWVRFT1JERVJfTElUVExFX0VORElBTl9ICisKKyNpZm5kZWYgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIF9fTElUVExFX0VORElBTiAxMjM0CisjZW5kaWYKKyNpZm5kZWYgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECisjZGVmaW5lIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAorI2VuZGlmCisjZGVmaW5lCV9fQllURV9PUkRFUglfX0xJVFRMRV9FTkRJQU4KKworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiLmg+CisKKyNkZWZpbmUgX19jb25zdGFudF9odG9ubCh4KSBfX19jb25zdGFudF9zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X250b2hsKHgpIF9fX2NvbnN0YW50X3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbnMoeCkgX19fY29uc3RhbnRfc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9udG9ocyh4KSBfX19jb25zdGFudF9zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTY0KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlNjRfdG9fY3B1KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTMyKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMzJfdG9fY3B1KHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTE2KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMTZfdG9fY3B1KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTY0KHgpIF9fX2NvbnN0YW50X3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmU2NF90b19jcHUoeCkgX19fY29uc3RhbnRfc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmUzMih4KSBfX19jb25zdGFudF9zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlMzJfdG9fY3B1KHgpIF9fX2NvbnN0YW50X3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoeCkgX19fY29uc3RhbnRfc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTE2X3RvX2NwdSh4KSBfX19jb25zdGFudF9zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTMyKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1KHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTY0KHgpIF9fc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdSh4KSBfX3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzIoeCkgX19zd2FiMzIoKHgpKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1KHgpIF9fc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNih4KSBfX3N3YWIxNigoeCkpCisjZGVmaW5lIF9fYmUxNl90b19jcHUoeCkgX19zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0cCh4KSAoKihfX3U2NCopKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1cCh4KSAoKihfX3U2NCopKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTMycCh4KSAoKihfX3UzMiopKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1cCh4KSAoKihfX3UzMiopKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2cCh4KSAoKihfX3UxNiopKHgpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1cCh4KSAoKihfX3UxNiopKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTY0cCh4KSBfX3N3YWI2NHAoKHgpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1cCh4KSBfX3N3YWI2NHAoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTMycCh4KSBfX3N3YWIzMnAoKHgpKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1cCh4KSBfX3N3YWIzMnAoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTE2cCh4KSBfX3N3YWIxNnAoKHgpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1cCh4KSBfX3N3YWIxNnAoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2xlMzJzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNnMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fbGUxNl90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19iZTY0cyh4KSBfX3N3YWI2NHMoKHgpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1cyh4KSBfX3N3YWI2NHMoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTMycyh4KSBfX3N3YWIzMnMoKHgpKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1cyh4KSBfX3N3YWIzMnMoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTE2cyh4KSBfX3N3YWIxNnMoKHgpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1cyh4KSBfX3N3YWIxNnMoKHgpKQorCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaD4KKworI2VuZGlmIC8qIF9MSU5VWF9CWVRFT1JERVJfTElUVExFX0VORElBTl9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjFkNTcwZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWIuaApAQCAtMCwwICsxLDE1OCBAQAorI2lmbmRlZiBfTElOVVhfQllURU9SREVSX1NXQUJfSAorI2RlZmluZSBfTElOVVhfQllURU9SREVSX1NXQUJfSAorCisvKgorICogbGludXgvYnl0ZW9yZGVyL3N3YWIuaAorICogQnl0ZS1zd2FwcGluZywgaW5kZXBlbmRlbnRseSBmcm9tIENQVSBlbmRpYW5uZXNzCisgKglzd2FiWFhbcHNdPyhmb28pCisgKgorICogRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPiAxOTk3MTIwNQorICogICAgc2VwYXJhdGVkIHN3YWIgZnVuY3Rpb25zIGZyb20gY3B1X3RvX1hYLAorICogICAgdG8gY2xlYW4gdXAgc3VwcG9ydCBmb3IgYml6YXJyZS1lbmRpYW4gYXJjaGl0ZWN0dXJlcy4KKyAqCisgKiBTZWUgYXNtLWkzODYvYnl0ZW9yZGVyLmggYW5kIHN1Y2hlcyBmb3IgZXhhbXBsZXMgb2YgaG93IHRvIHByb3ZpZGUKKyAqIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgb3B0aW1pemVkIHZlcnNpb25zCisgKgorICovCisKKy8qIGNhc3RzIGFyZSBuZWNlc3NhcnkgZm9yIGNvbnN0YW50cywgYmVjYXVzZSB3ZSBuZXZlciBrbm93IGhvdyBmb3Igc3VyZQorICogaG93IFUvVUwvVUxMIG1hcCB0byBfX3UxNiwgX191MzIsIF9fdTY0LiBBdCBsZWFzdCBub3QgaW4gYSBwb3J0YWJsZSB3YXkuCisgKi8KKyNkZWZpbmUgX19fc3dhYjE2KHgpIFwKKwkoKF9fdTE2KSggXAorCQkoKChfX3UxNikoeCkgJiAoX191MTYpMHgwMGZmVSkgPDwgOCkgfCBcCisJCSgoKF9fdTE2KSh4KSAmIChfX3UxNikweGZmMDBVKSA+PiA4KSApKQorI2RlZmluZSBfX19zd2FiMzIoeCkgXAorCSgoX191MzIpKCBcCisJCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDAwMGZmVUwpIDw8IDI0KSB8IFwKKwkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMGZmMDBVTCkgPDwgIDgpIHwgXAorCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMGZmMDAwMFVMKSA+PiAgOCkgfCBcCisJCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweGZmMDAwMDAwVUwpID4+IDI0KSApKQorI2RlZmluZSBfX19zd2FiNjQoeCkgXAorCSgoX191NjQpKCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwMDAwMGZmVUxMKSA8PCA1NikgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwMDBmZjAwVUxMKSA8PCA0MCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMGZmMDAwMDAwVUxMKSA8PCAgOCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAgOCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwZmYwMDAwMDAwMDAwVUxMKSA+PiAyNCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMGZmMDAwMDAwMDAwMDAwVUxMKSA+PiA0MCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSA+PiA1NikgKSkKKworLyoKKyAqIHByb3ZpZGUgZGVmYXVsdHMgd2hlbiBubyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgb3B0aW1pemF0aW9uIGlzIGRldGVjdGVkCisgKi8KKyNpZm5kZWYgX19hcmNoX19zd2FiMTYKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIxNih4KSBfX19zd2FiMTYoeCkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWIzMgorIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjMyKHgpIF9fX3N3YWIzMih4KQorI2VuZGlmCisjaWZuZGVmIF9fYXJjaF9fc3dhYjY0CisjICBkZWZpbmUgX19hcmNoX19zd2FiNjQoeCkgX19fc3dhYjY0KHgpCisjZW5kaWYKKworI2lmbmRlZiBfX2FyY2hfX3N3YWIxNnAKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIxNnAoeCkgX19zd2FiMTYoKih4KSkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWIzMnAKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIzMnAoeCkgX19zd2FiMzIoKih4KSkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWI2NHAKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWI2NHAoeCkgX19zd2FiNjQoKih4KSkKKyNlbmRpZgorCisjaWZuZGVmIF9fYXJjaF9fc3dhYjE2cworIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjE2cyh4KSBkbyB7ICooeCkgPSBfX3N3YWIxNnAoKHgpKTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWIzMnMKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIzMnMoeCkgZG8geyAqKHgpID0gX19zd2FiMzJwKCh4KSk7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiNjRzCisjICBkZWZpbmUgX19hcmNoX19zd2FiNjRzKHgpIGRvIHsgKih4KSA9IF9fc3dhYjY0cCgoeCkpOyB9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyoKKyAqIEFsbG93IGNvbnN0YW50IGZvbGRpbmcKKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+PSAyKSAmJiBkZWZpbmVkKF9fT1BUSU1JWkVfXykKKyMgIGRlZmluZSBfX3N3YWIxNih4KSBcCisoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTE2KSh4KSkgPyBcCisgX19fc3dhYjE2KCh4KSkgOiBcCisgX19mc3dhYjE2KCh4KSkpCisjICBkZWZpbmUgX19zd2FiMzIoeCkgXAorKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UzMikoeCkpID8gXAorIF9fX3N3YWIzMigoeCkpIDogXAorIF9fZnN3YWIzMigoeCkpKQorIyAgZGVmaW5lIF9fc3dhYjY0KHgpIFwKKyhfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191NjQpKHgpKSA/IFwKKyBfX19zd2FiNjQoKHgpKSA6IFwKKyBfX2Zzd2FiNjQoKHgpKSkKKyNlbHNlCisjICBkZWZpbmUgX19zd2FiMTYoeCkgX19mc3dhYjE2KHgpCisjICBkZWZpbmUgX19zd2FiMzIoeCkgX19mc3dhYjMyKHgpCisjICBkZWZpbmUgX19zd2FiNjQoeCkgX19mc3dhYjY0KHgpCisjZW5kaWYgLyogT1BUSU1JWkUgKi8KKworCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChjb25zdCkpIF9fdTE2IF9fZnN3YWIxNihfX3UxNiB4KQoreworCXJldHVybiBfX2FyY2hfX3N3YWIxNih4KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IF9fc3dhYjE2cChfX3UxNiAqeCkKK3sKKwlyZXR1cm4gX19hcmNoX19zd2FiMTZwKHgpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWIxNnMoX191MTYgKmFkZHIpCit7CisJX19hcmNoX19zd2FiMTZzKGFkZHIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChjb25zdCkpIF9fdTMyIF9fZnN3YWIzMihfX3UzMiB4KQoreworCXJldHVybiBfX2FyY2hfX3N3YWIzMih4KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIF9fc3dhYjMycChfX3UzMiAqeCkKK3sKKwlyZXR1cm4gX19hcmNoX19zd2FiMzJwKHgpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWIzMnMoX191MzIgKmFkZHIpCit7CisJX19hcmNoX19zd2FiMzJzKGFkZHIpOworfQorCisjaWZkZWYgX19CWVRFT1JERVJfSEFTX1U2NF9fCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChjb25zdCkpIF9fdTY0IF9fZnN3YWI2NChfX3U2NCB4KQoreworIyAgaWZkZWYgX19TV0FCXzY0X1RIUlVfMzJfXworCV9fdTMyIGggPSB4ID4+IDMyOworCV9fdTMyIGwgPSB4ICYgKCgxVUxMPDwzMiktMSk7CisJcmV0dXJuICgoKF9fdTY0KV9fc3dhYjMyKGwpKSA8PCAzMikgfCAoKF9fdTY0KShfX3N3YWIzMihoKSkpOworIyAgZWxzZQorCXJldHVybiBfX2FyY2hfX3N3YWI2NCh4KTsKKyMgIGVuZGlmCit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3U2NCBfX3N3YWI2NHAoX191NjQgKngpCit7CisJcmV0dXJuIF9fYXJjaF9fc3dhYjY0cCh4KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiNjRzKF9fdTY0ICphZGRyKQoreworCV9fYXJjaF9fc3dhYjY0cyhhZGRyKTsKK30KKyNlbmRpZiAvKiBfX0JZVEVPUkRFUl9IQVNfVTY0X18gKi8KKworI2lmIGRlZmluZWQoX19LRVJORUxfXykKKyNkZWZpbmUgc3dhYjE2IF9fc3dhYjE2CisjZGVmaW5lIHN3YWIzMiBfX3N3YWIzMgorI2RlZmluZSBzd2FiNjQgX19zd2FiNjQKKyNkZWZpbmUgc3dhYjE2cCBfX3N3YWIxNnAKKyNkZWZpbmUgc3dhYjMycCBfX3N3YWIzMnAKKyNkZWZpbmUgc3dhYjY0cCBfX3N3YWI2NHAKKyNkZWZpbmUgc3dhYjE2cyBfX3N3YWIxNnMKKyNkZWZpbmUgc3dhYjMycyBfX3N3YWIzMnMKKyNkZWZpbmUgc3dhYjY0cyBfX3N3YWI2NHMKKyNlbmRpZgorCisjZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvY29uZmlnLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTk0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2NvbmZpZy5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfTElOVVhfQ09ORklHX0gKKyNkZWZpbmUgX0xJTlVYX0NPTkZJR19ICisKKy8qICNpbmNsdWRlIDxsaW51eC9hdXRvY29uZi5oPiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvY3R5cGUuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvY3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmEzNjM5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9jdHlwZS5oCkBAIC0wLDAgKzEsNTQgQEAKKyNpZm5kZWYgX0xJTlVYX0NUWVBFX0gKKyNkZWZpbmUgX0xJTlVYX0NUWVBFX0gKKworLyoKKyAqIE5PVEUhIFRoaXMgY3R5cGUgZG9lcyBub3QgaGFuZGxlIEVPRiBsaWtlIHRoZSBzdGFuZGFyZCBDCisgKiBsaWJyYXJ5IGlzIHJlcXVpcmVkIHRvLgorICovCisKKyNkZWZpbmUgX1UJMHgwMQkvKiB1cHBlciAqLworI2RlZmluZSBfTAkweDAyCS8qIGxvd2VyICovCisjZGVmaW5lIF9ECTB4MDQJLyogZGlnaXQgKi8KKyNkZWZpbmUgX0MJMHgwOAkvKiBjbnRybCAqLworI2RlZmluZSBfUAkweDEwCS8qIHB1bmN0ICovCisjZGVmaW5lIF9TCTB4MjAJLyogd2hpdGUgc3BhY2UgKHNwYWNlL2xmL3RhYikgKi8KKyNkZWZpbmUgX1gJMHg0MAkvKiBoZXggZGlnaXQgKi8KKyNkZWZpbmUgX1NQCTB4ODAJLyogaGFyZCBzcGFjZSAoMHgyMCkgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgX2N0eXBlW107CisKKyNkZWZpbmUgX19pc21hc2soeCkgKF9jdHlwZVsoaW50KSh1bnNpZ25lZCBjaGFyKSh4KV0pCisKKyNkZWZpbmUgaXNhbG51bShjKQkoKF9faXNtYXNrKGMpJihfVXxfTHxfRCkpICE9IDApCisjZGVmaW5lIGlzYWxwaGEoYykJKChfX2lzbWFzayhjKSYoX1V8X0wpKSAhPSAwKQorI2RlZmluZSBpc2NudHJsKGMpCSgoX19pc21hc2soYykmKF9DKSkgIT0gMCkKKyNkZWZpbmUgaXNkaWdpdChjKQkoKF9faXNtYXNrKGMpJihfRCkpICE9IDApCisjZGVmaW5lIGlzZ3JhcGgoYykJKChfX2lzbWFzayhjKSYoX1B8X1V8X0x8X0QpKSAhPSAwKQorI2RlZmluZSBpc2xvd2VyKGMpCSgoX19pc21hc2soYykmKF9MKSkgIT0gMCkKKyNkZWZpbmUgaXNwcmludChjKQkoKF9faXNtYXNrKGMpJihfUHxfVXxfTHxfRHxfU1ApKSAhPSAwKQorI2RlZmluZSBpc3B1bmN0KGMpCSgoX19pc21hc2soYykmKF9QKSkgIT0gMCkKKyNkZWZpbmUgaXNzcGFjZShjKQkoKF9faXNtYXNrKGMpJihfUykpICE9IDApCisjZGVmaW5lIGlzdXBwZXIoYykJKChfX2lzbWFzayhjKSYoX1UpKSAhPSAwKQorI2RlZmluZSBpc3hkaWdpdChjKQkoKF9faXNtYXNrKGMpJihfRHxfWCkpICE9IDApCisKKyNkZWZpbmUgaXNhc2NpaShjKSAoKCh1bnNpZ25lZCBjaGFyKShjKSk8PTB4N2YpCisjZGVmaW5lIHRvYXNjaWkoYykgKCgodW5zaWduZWQgY2hhcikoYykpJjB4N2YpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3RvbG93ZXIodW5zaWduZWQgY2hhciBjKQoreworCWlmIChpc3VwcGVyKGMpKQorCQljIC09ICdBJy0nYSc7CisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3RvdXBwZXIodW5zaWduZWQgY2hhciBjKQoreworCWlmIChpc2xvd2VyKGMpKQorCQljIC09ICdhJy0nQSc7CisJcmV0dXJuIGM7Cit9CisKKyNkZWZpbmUgdG9sb3dlcihjKSBfX3RvbG93ZXIoYykKKyNkZWZpbmUgdG91cHBlcihjKSBfX3RvdXBwZXIoYykKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3Bvc2l4X3R5cGVzLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3Bvc2l4X3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzN2UxZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvcG9zaXhfdHlwZXMuaApAQCAtMCwwICsxLDQ4IEBACisjaWZuZGVmIF9MSU5VWF9QT1NJWF9UWVBFU19ICisjZGVmaW5lIF9MSU5VWF9QT1NJWF9UWVBFU19ICisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKworLyoKKyAqIFRoaXMgYWxsb3dzIGZvciAxMDI0IGZpbGUgZGVzY3JpcHRvcnM6IGlmIE5SX09QRU4gaXMgZXZlciBncm93bgorICogYmV5b25kIHRoYXQgeW91J2xsIGhhdmUgdG8gY2hhbmdlIHRoaXMgdG9vLiBCdXQgMTAyNCBmZCdzIHNlZW0gdG8gYmUKKyAqIGVub3VnaCBldmVuIGZvciBzdWNoICJyZWFsIiB1bmljZXMgbGlrZSBPU0YvMSwgc28gaG9wZWZ1bGx5IHRoaXMgaXMKKyAqIG9uZSBsaW1pdCB0aGF0IGRvZXNuJ3QgaGF2ZSB0byBiZSBjaGFuZ2VkIFthZ2Fpbl0uCisgKgorICogTm90ZSB0aGF0IFBPU0lYIHdhbnRzIHRoZSBGRF9DTEVBUihmZCxmZHNldHApIGRlZmluZXMgdG8gYmUgaW4KKyAqIDxzeXMvdGltZS5oPiAoYW5kIHRodXMgPGxpbnV4L3RpbWUuaD4pIC0gYnV0IHRoaXMgaXMgYSBtb3JlIGxvZ2ljYWwKKyAqIHBsYWNlIGZvciB0aGVtLiBTb2x2ZWQgYnkgaGF2aW5nIGR1bW15IGRlZmluZXMgaW4gPHN5cy90aW1lLmg+LgorICovCisKKy8qCisgKiBUaG9zZSBtYWNyb3MgbWF5IGhhdmUgYmVlbiBkZWZpbmVkIGluIDxnbnUvdHlwZXMuaD4uIEJ1dCB3ZSBhbHdheXMKKyAqIHVzZSB0aGUgb25lcyBoZXJlLgorICovCisjdW5kZWYgX19ORkRCSVRTCisjZGVmaW5lIF9fTkZEQklUUwkoOCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKworI3VuZGVmIF9fRkRfU0VUU0laRQorI2RlZmluZSBfX0ZEX1NFVFNJWkUJMTAyNAorCisjdW5kZWYgX19GRFNFVF9MT05HUworI2RlZmluZSBfX0ZEU0VUX0xPTkdTCShfX0ZEX1NFVFNJWkUvX19ORkRCSVRTKQorCisjdW5kZWYgX19GREVMVAorI2RlZmluZQlfX0ZERUxUKGQpCSgoZCkgLyBfX05GREJJVFMpCisKKyN1bmRlZiBfX0ZETUFTSworI2RlZmluZQlfX0ZETUFTSyhkKQkoMVVMIDw8ICgoZCkgJSBfX05GREJJVFMpKQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBmZHNfYml0cyBbX19GRFNFVF9MT05HU107Cit9IF9fa2VybmVsX2ZkX3NldDsKKworLyogVHlwZSBvZiBhIHNpZ25hbCBoYW5kbGVyLiAgKi8KK3R5cGVkZWYgdm9pZCAoKl9fa2VybmVsX3NpZ2hhbmRsZXJfdCkoaW50KTsKKworLyogVHlwZSBvZiBhIFNZU1YgSVBDIGtleS4gICovCit0eXBlZGVmIGludCBfX2tlcm5lbF9rZXlfdDsKKworI2luY2x1ZGUgPGFzbS9wb3NpeF90eXBlcy5oPgorCisjZW5kaWYgLyogX0xJTlVYX1BPU0lYX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RhdC5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9zdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjk0MjJjYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RhdC5oCkBAIC0wLDAgKzEsMTMyIEBACisjaWZuZGVmIF9MSU5VWF9TVEFUX0gKKyNkZWZpbmUgX0xJTlVYX1NUQVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFNfSUZNVCAgMDAxNzAwMDAJLyogdHlwZSBvZiBmaWxlICovCisjZGVmaW5lIFNfSUZTT0NLIDAxNDAwMDAJLyogbmFtZWQgc29ja2V0ICovCisjZGVmaW5lIFNfSUZMTksJIDAxMjAwMDAJLyogc3ltYm9saWMgbGluayAqLworI2RlZmluZSBTX0lGUkVHICAwMTAwMDAwCS8qIHJlZ3VsYXIgKi8KKyNkZWZpbmUgU19JRkJMSyAgMDA2MDAwMAkvKiBibG9jayBzcGVjaWFsICovCisjZGVmaW5lIFNfSUZESVIgIDAwNDAwMDAJLyogZGlyZWN0b3J5ICovCisjZGVmaW5lIFNfSUZDSFIgIDAwMjAwMDAJLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KKyNkZWZpbmUgU19JRklGTyAgMDAxMDAwMAkvKiBmaWZvICovCisjZGVmaW5lIFNfSVNVSUQgIDAwMDQwMDAJLyogc2V0IHVzZXIgaWQgb24gZXhlY3V0aW9uICovCisjZGVmaW5lIFNfSVNHSUQgIDAwMDIwMDAJLyogc2V0IGdyb3VwIGlkIG9uIGV4ZWN1dGlvbiAqLworI2RlZmluZSBTX0lTVlRYICAwMDAxMDAwCS8qIHNhdmUgc3dhcHBlZCB0ZXh0IGV2ZW4gYWZ0ZXIgdXNlICovCisKKyNkZWZpbmUgU19JU0xOSyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkxOSykKKyNkZWZpbmUgU19JU1JFRyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRlJFRykKKyNkZWZpbmUgU19JU0RJUihtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkRJUikKKyNkZWZpbmUgU19JU0NIUihtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkNIUikKKyNkZWZpbmUgU19JU0JMSyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkJMSykKKyNkZWZpbmUgU19JU0ZJRk8obSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZJRk8pCisjZGVmaW5lIFNfSVNTT0NLKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGU09DSykKKworI2RlZmluZSBTX0lSV1hVIDAwNzAwCQkvKiByd3ggZm9yIG93bmVyICovCisjZGVmaW5lIFNfSVJVU1IgMDA0MDAJCS8qIHJlYWQgcGVybWlzc2lvbiBmb3Igb3duZXIgKi8KKyNkZWZpbmUgU19JV1VTUiAwMDIwMAkJLyogd3JpdGUgcGVybWlzc2lvbiBmb3Igb3duZXIgKi8KKyNkZWZpbmUgU19JWFVTUiAwMDEwMAkJLyogZXhlY3V0ZS9zZWFyY2ggcGVybWlzc2lvbiBmb3Igb3duZXIgKi8KKworI2RlZmluZSBTX0lSV1hHIDAwMDcwCQkvKiByd3ggZm9yIGdyb3VwICovCisjZGVmaW5lIFNfSVJHUlAgMDAwNDAJCS8qIHJlYWQgcGVybWlzc2lvbiBmb3IgZ3JvdXAgKi8KKyNkZWZpbmUgU19JV0dSUCAwMDAyMAkJLyogd3JpdGUgcGVybWlzc2lvbiBmb3IgZ3JvdXAgKi8KKyNkZWZpbmUgU19JWEdSUCAwMDAxMAkJLyogZXhlY3V0ZS9zZWFyY2ggcGVybWlzc2lvbiBmb3IgZ3JvdXAgKi8KKworI2RlZmluZSBTX0lSV1hPIDAwMDA3CQkvKiByd3ggZm9yIG90aGVyICovCisjZGVmaW5lIFNfSVJPVEggMDAwMDQJCS8qIHJlYWQgcGVybWlzc2lvbiBmb3Igb3RoZXIgKi8KKyNkZWZpbmUgU19JV09USCAwMDAwMgkJLyogcmVhZCBwZXJtaXNzaW9uIGZvciBvdGhlciAqLworI2RlZmluZSBTX0lYT1RIIDAwMDAxCQkvKiBleGVjdXRlL3NlYXJjaCBwZXJtaXNzaW9uIGZvciBvdGhlciAqLworCisjaWZkZWYJX19QUENfXworCitzdHJ1Y3Qgc3RhdCB7CisJZGV2X3QJCXN0X2RldjsJCS8qIGZpbGUgc3lzdGVtIGlkICovCisJaW5vX3QJCXN0X2lubzsJCS8qIGZpbGUgaWQgKi8KKwltb2RlX3QJCXN0X21vZGU7CS8qIG93bmVyc2hpcC9wcm90ZWN0aW9uICovCisJbmxpbmtfdAkJc3Rfbmxpbms7CS8qIG51bWJlciBvZiBsaW5rcyAqLworCXVpZF90IAkJc3RfdWlkOwkJLyogdXNlciBpZCAqLworCWdpZF90IAkJc3RfZ2lkOwkJLyogZ3JvdXAgaWQgKi8KKwlkZXZfdAkJc3RfcmRldjsKKwlvZmZfdAkJc3Rfc2l6ZTsJLyogZmlsZSBzaXplIGluICMgb2YgYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nICAJc3RfYmxrc2l6ZTsJLyogYmxvY2sgc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcgIAlzdF9ibG9ja3M7CS8qIGZpbGUgc2l6ZSBpbiAjIG9mIGJsb2NrcyAqLworCXVuc2lnbmVkIGxvbmcgIAlzdF9hdGltZTsJLyogdGltZSBmaWxlIHdhcyBsYXN0IGFjY2Vzc2VkICovCisJdW5zaWduZWQgbG9uZyAgCV9fdW51c2VkMTsKKwl1bnNpZ25lZCBsb25nICAJc3RfbXRpbWU7CS8qIHRpbWUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCAqLworCXVuc2lnbmVkIGxvbmcgIAlfX3VudXNlZDI7CisJdW5zaWduZWQgbG9uZyAgCXN0X2N0aW1lOwkvKiB0aW1lIGZpbGUgc3RhdHVzIHdhcyBsYXN0IGNoYW5nZWQgKi8KKwl1bnNpZ25lZCBsb25nICAJX191bnVzZWQzOworCXVuc2lnbmVkIGxvbmcgIAlfX3VudXNlZDQ7CisJdW5zaWduZWQgbG9uZyAgCV9fdW51c2VkNTsKK307CisKKyNlbmRpZgkvKiBfX1BQQ19fICovCisKKyNpZiBkZWZpbmVkIChfX0FSTV9fKSB8fCBkZWZpbmVkIChfX0kzODZfXykgfHwgZGVmaW5lZCAoX19NNjhLX18pIHx8IGRlZmluZWQgKF9fYmxhY2tmaW5fXykKKworc3RydWN0IHN0YXQgeworCXVuc2lnbmVkIHNob3J0IHN0X2RldjsKKwl1bnNpZ25lZCBzaG9ydCBfX3BhZDE7CisJdW5zaWduZWQgbG9uZyBzdF9pbm87CisJdW5zaWduZWQgc2hvcnQgc3RfbW9kZTsKKwl1bnNpZ25lZCBzaG9ydCBzdF9ubGluazsKKwl1bnNpZ25lZCBzaG9ydCBzdF91aWQ7CisJdW5zaWduZWQgc2hvcnQgc3RfZ2lkOworCXVuc2lnbmVkIHNob3J0IHN0X3JkZXY7CisJdW5zaWduZWQgc2hvcnQgX19wYWQyOworCXVuc2lnbmVkIGxvbmcgIHN0X3NpemU7CisJdW5zaWduZWQgbG9uZyAgc3RfYmxrc2l6ZTsKKwl1bnNpZ25lZCBsb25nICBzdF9ibG9ja3M7CisJdW5zaWduZWQgbG9uZyAgc3RfYXRpbWU7CisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQxOworCXVuc2lnbmVkIGxvbmcgIHN0X210aW1lOworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkMjsKKwl1bnNpZ25lZCBsb25nICBzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDM7CisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQ0OworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNTsKK307CisKKyNlbmRpZgkvKiBfX0FSTV9fICovCisKKyNpZiBkZWZpbmVkIChfX01JUFNfXykKKworc3RydWN0IHN0YXQgeworCWRldl90ICAgICAgICAgICBzdF9kZXY7CisJbG9uZyAgICAgICAgICAgIHN0X3BhZDFbM107CisJaW5vX3QgICAgICAgICAgIHN0X2lubzsKKwltb2RlX3QgICAgICAgICAgc3RfbW9kZTsKKwlubGlua190ICAgICAgICAgc3Rfbmxpbms7CisJdWlkX3QgICAgICAgICAgIHN0X3VpZDsKKwlnaWRfdCAgICAgICAgICAgc3RfZ2lkOworCWRldl90ICAgICAgICAgICBzdF9yZGV2OworCWxvbmcgICAgICAgICAgICBzdF9wYWQyWzJdOworCW9mZl90ICAgICAgICAgICBzdF9zaXplOworCWxvbmcgICAgICAgICAgICBzdF9wYWQzOworCS8qCisJICogQWN0dWFsbHkgdGhpcyBzaG91bGQgYmUgdGltZXN0cnVjX3Qgc3RfYXRpbWUsIHN0X210aW1lIGFuZCBzdF9jdGltZQorCSAqIGJ1dCB3ZSBkb24ndCBoYXZlIGl0IHVuZGVyIExpbnV4LgorCSAqLworCXRpbWVfdCAgICAgICAgICBzdF9hdGltZTsKKwlsb25nICAgICAgICAgICAgcmVzZXJ2ZWQwOworCXRpbWVfdCAgICAgICAgICBzdF9tdGltZTsKKwlsb25nICAgICAgICAgICAgcmVzZXJ2ZWQxOworCXRpbWVfdCAgICAgICAgICBzdF9jdGltZTsKKwlsb25nICAgICAgICAgICAgcmVzZXJ2ZWQyOworCWxvbmcgICAgICAgICAgICBzdF9ibGtzaXplOworCWxvbmcgICAgICAgICAgICBzdF9ibG9ja3M7CisJbG9uZyAgICAgICAgICAgIHN0X3BhZDRbMTRdOworfTsKKworI2VuZGlmCS8qIF9fTUlQU19fICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9zdGRkZWYuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RkZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlMzRjMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RkZGVmLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfTElOVVhfU1REREVGX0gKKyNkZWZpbmUgX0xJTlVYX1NURERFRl9ICisKKyN1bmRlZiBOVUxMCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgTlVMTCAwCisjZWxzZQorI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisjZW5kaWYKKworI2lmbmRlZiBfU0laRV9UCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNlbmRpZgorCisjdW5kZWYgb2Zmc2V0b2YKKyNkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHNpemVfdCkgJigoVFlQRSAqKTApLT5NRU1CRVIpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9zdHJpbmcuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzOTAzOQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKQEAgLTAsMCArMSw4OSBAQAorI2lmbmRlZiBfTElOVVhfU1RSSU5HX0hfCisjZGVmaW5lIF9MSU5VWF9TVFJJTkdfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIGZvciBzaXplX3QgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogZm9yIE5VTEwgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gY2hhciAqIF9fX3N0cnRvazsKK2V4dGVybiBjaGFyICogc3RycGJyayhjb25zdCBjaGFyICosY29uc3QgY2hhciAqKTsKK2V4dGVybiBjaGFyICogc3RydG9rKGNoYXIgKixjb25zdCBjaGFyICopOworZXh0ZXJuIGNoYXIgKiBzdHJzZXAoY2hhciAqKixjb25zdCBjaGFyICopOworZXh0ZXJuIF9fa2VybmVsX3NpemVfdCBzdHJzcG4oY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CisKKworLyoKKyAqIEluY2x1ZGUgbWFjaGluZSBzcGVjaWZpYyBpbmxpbmUgcm91dGluZXMKKyAqLworI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDUFkKK2V4dGVybiBjaGFyICogc3RyY3B5KGNoYXIgKixjb25zdCBjaGFyICopOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5DUFkKK2V4dGVybiBjaGFyICogc3RybmNweShjaGFyICosY29uc3QgY2hhciAqLCBfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkNBVAorZXh0ZXJuIGNoYXIgKiBzdHJjYXQoY2hhciAqLCBjb25zdCBjaGFyICopOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5DQVQKK2V4dGVybiBjaGFyICogc3RybmNhdChjaGFyICosIGNvbnN0IGNoYXIgKiwgX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDTVAKK2V4dGVybiBpbnQgc3RyY21wKGNvbnN0IGNoYXIgKixjb25zdCBjaGFyICopOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5DTVAKK2V4dGVybiBpbnQgc3RybmNtcChjb25zdCBjaGFyICosY29uc3QgY2hhciAqLF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZiAwIC8qIG5vdCB1c2VkIC0gd2FzOiAjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5JQ01QICovCitleHRlcm4gaW50IHN0cm5pY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkNIUgorZXh0ZXJuIGNoYXIgKiBzdHJjaHIoY29uc3QgY2hhciAqLGludCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSUkNIUgorZXh0ZXJuIGNoYXIgKiBzdHJyY2hyKGNvbnN0IGNoYXIgKixpbnQpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlNUUgorZXh0ZXJuIGNoYXIgKiBzdHJzdHIoY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTEVOCitleHRlcm4gX19rZXJuZWxfc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICopOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5MRU4KK2V4dGVybiBfX2tlcm5lbF9zaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICosX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJEVVAKK2V4dGVybiBjaGFyICogc3RyZHVwKGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSU1dBQgorZXh0ZXJuIGNoYXIgKiBzdHJzd2FiKGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1TRVQKK2V4dGVybiB2b2lkICogbWVtc2V0KHZvaWQgKixpbnQsX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DUFkKK2V4dGVybiB2b2lkICogbWVtY3B5KHZvaWQgKixjb25zdCB2b2lkICosX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1NT1ZFCitleHRlcm4gdm9pZCAqIG1lbW1vdmUodm9pZCAqLGNvbnN0IHZvaWQgKixfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTVNDQU4KK2V4dGVybiB2b2lkICogbWVtc2Nhbih2b2lkICosaW50LF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNQ01QCitleHRlcm4gaW50IG1lbWNtcChjb25zdCB2b2lkICosY29uc3Qgdm9pZCAqLF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNQ0hSCitleHRlcm4gdm9pZCAqIG1lbWNocihjb25zdCB2b2lkICosaW50LF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9TVFJJTkdfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvdGltZS5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmYxMmI5OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvdGltZS5oCkBAIC0wLDAgKzEsMTU4IEBACisjaWZuZGVmIF9MSU5VWF9USU1FX0gKKyNkZWZpbmUgX0xJTlVYX1RJTUVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBfREVGVU4oYSxiLGMpIGEoYykKKyNkZWZpbmUgX0NPTlNUIGNvbnN0CisjZGVmaW5lIF9BTkQgLAorCisjZGVmaW5lIF9SRUVOVF9PTkxZCisKKyNkZWZpbmUgU0VDU1BFUk1JTgk2MEwKKyNkZWZpbmUgTUlOU1BFUkhPVVIJNjBMCisjZGVmaW5lIEhPVVJTUEVSREFZCTI0TAorI2RlZmluZSBTRUNTUEVSSE9VUgkoU0VDU1BFUk1JTiAqIE1JTlNQRVJIT1VSKQorI2RlZmluZSBTRUNTUEVSREFZCShTRUNTUEVSSE9VUiAqIEhPVVJTUEVSREFZKQorI2RlZmluZSBEQVlTUEVSV0VFSwk3CisjZGVmaW5lIE1PTlNQRVJZRUFSCTEyCisKKyNkZWZpbmUgWUVBUl9CQVNFCTE5MDAKKyNkZWZpbmUgRVBPQ0hfWUVBUiAgICAgIDE5NzAKKyNkZWZpbmUgRVBPQ0hfV0RBWSAgICAgIDQKKworI2RlZmluZSBpc2xlYXAoeSkgKCgoKHkpICUgNCkgPT0gMCAmJiAoKHkpICUgMTAwKSAhPSAwKSB8fCAoKHkpICUgNDAwKSA9PSAwKQorCisKKy8qIFVzZWQgYnkgb3RoZXIgdGltZSBmdW5jdGlvbnMuICAqLworc3RydWN0IHRtIHsKKyAgICBpbnQgdG1fc2VjOyAgICAgICAgICAgICAgICAgICAvKiBTZWNvbmRzLiAgICAgWzAtNjBdICgxIGxlYXAgc2Vjb25kKSAqLworICAgIGludCB0bV9taW47ICAgICAgICAgICAgICAgICAgIC8qIE1pbnV0ZXMuICAgICBbMC01OV0gKi8KKyAgICBpbnQgdG1faG91cjsgICAgICAgICAgICAgICAgICAvKiBIb3Vycy4gICAgICAgWzAtMjNdICovCisgICAgaW50IHRtX21kYXk7ICAgICAgICAgICAgICAgICAgLyogRGF5LiAgICAgICAgIFsxLTMxXSAqLworICAgIGludCB0bV9tb247ICAgICAgICAgICAgICAgICAgIC8qIE1vbnRoLiAgICAgICBbMC0xMV0gKi8KKyAgICBpbnQgdG1feWVhcjsgICAgICAgICAgICAgICAgICAvKiBZZWFyIC0gMTkwMC4gICovCisgICAgaW50IHRtX3dkYXk7ICAgICAgICAgICAgICAgICAgLyogRGF5IG9mIHdlZWsuIFswLTZdICovCisgICAgaW50IHRtX3lkYXk7ICAgICAgICAgICAgICAgICAgLyogRGF5cyBpbiB5ZWFyLlswLTM2NV0gKi8KKyAgICBpbnQgdG1faXNkc3Q7ICAgICAgICAgICAgICAgICAvKiBEU1QuICAgICAgICAgWy0xLzAvMV0qLworCisjIGlmZGVmIF9fVVNFX0JTRAorICAgIGxvbmcgaW50IHRtX2dtdG9mZjsgICAgICAgICAgIC8qIFNlY29uZHMgZWFzdCBvZiBVVEMuICAqLworICAgIF9fY29uc3QgY2hhciAqdG1fem9uZTsgICAgICAgIC8qIFRpbWV6b25lIGFiYnJldmlhdGlvbi4gICovCisjIGVsc2UKKyAgICBsb25nIGludCBfX3RtX2dtdG9mZjsgICAgICAgICAvKiBTZWNvbmRzIGVhc3Qgb2YgVVRDLiAgKi8KKyAgICBfX2NvbnN0IGNoYXIgKl9fdG1fem9uZTsgICAgICAvKiBUaW1lem9uZSBhYmJyZXZpYXRpb24uICAqLworIyBlbmRpZgorfTsKKworc3RhdGljIGlubGluZSBjaGFyICoKK19ERUZVTiAoYXNjdGltZV9yLCAodGltX3AsIHJlc3VsdCksCisJX0NPTlNUIHN0cnVjdCB0bSAqdGltX3AgX0FORAorCWNoYXIgKnJlc3VsdCkKK3sKKyAgICBzdGF0aWMgX0NPTlNUIGNoYXIgZGF5X25hbWVbN11bM10gPSB7CisJIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIKKyAgICB9OworICAgIHN0YXRpYyBfQ09OU1QgY2hhciBtb25fbmFtZVsxMl1bM10gPSB7CisJIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKKwkiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCisgICAgfTsKKworICAgIHNwcmludGYgKHJlc3VsdCwgIiUuM3MgJS4zcyAlLjJkICUuMmQ6JS4yZDolLjJkICVkXG4iLAorCSAgICBkYXlfbmFtZVt0aW1fcC0+dG1fd2RheV0sCisJICAgIG1vbl9uYW1lW3RpbV9wLT50bV9tb25dLAorCSAgICB0aW1fcC0+dG1fbWRheSwgdGltX3AtPnRtX2hvdXIsIHRpbV9wLT50bV9taW4sCisJICAgIHRpbV9wLT50bV9zZWMsIDE5MDAgKyB0aW1fcC0+dG1feWVhcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdG0gKgorX0RFRlVOIChsb2NhbHRpbWVfciwgKHRpbV9wLCByZXMpLAorCV9DT05TVCB0aW1lX3QgKiB0aW1fcCBfQU5ECisJc3RydWN0IHRtICpyZXMpCit7CisgICAgc3RhdGljIF9DT05TVCBpbnQgbW9uX2xlbmd0aHNbMl1bTU9OU1BFUllFQVJdID0geworICAgICAgezMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9LAorICAgICAgezMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9CisgICAgfSA7CisKKyAgICBzdGF0aWMgX0NPTlNUIGludCB5ZWFyX2xlbmd0aHNbMl0gPSB7CisgICAgICAzNjUsCisgICAgICAzNjYKKyAgICB9IDsKKworICAgIGxvbmcgZGF5cywgcmVtOworICAgIGludCB5OworICAgIGludCB5bGVhcDsKKyAgICBfQ09OU1QgaW50ICppcDsKKworICAgIGRheXMgPSAoKGxvbmcpICp0aW1fcCkgLyBTRUNTUEVSREFZOworICAgIHJlbSA9ICgobG9uZykgKnRpbV9wKSAlIFNFQ1NQRVJEQVk7CisgICAgd2hpbGUgKHJlbSA8IDApCisgICAgeworCXJlbSArPSBTRUNTUEVSREFZOworCS0tZGF5czsKKyAgICB9CisgICAgd2hpbGUgKHJlbSA+PSBTRUNTUEVSREFZKQorICAgIHsKKwlyZW0gLT0gU0VDU1BFUkRBWTsKKwkrK2RheXM7CisgICAgfQorCisgICAgLyogY29tcHV0ZSBob3VyLCBtaW4sIGFuZCBzZWMgKi8KKyAgICByZXMtPnRtX2hvdXIgPSAoaW50KSAocmVtIC8gU0VDU1BFUkhPVVIpOworICAgIHJlbSAlPSBTRUNTUEVSSE9VUjsKKyAgICByZXMtPnRtX21pbiA9IChpbnQpIChyZW0gLyBTRUNTUEVSTUlOKTsKKyAgICByZXMtPnRtX3NlYyA9IChpbnQpIChyZW0gJSBTRUNTUEVSTUlOKTsKKworICAgIC8qIGNvbXB1dGUgZGF5IG9mIHdlZWsgKi8KKyAgICBpZiAoKHJlcy0+dG1fd2RheSA9ICgoRVBPQ0hfV0RBWSArIGRheXMpICUgREFZU1BFUldFRUspKSA8IDApCisJcmVzLT50bV93ZGF5ICs9IERBWVNQRVJXRUVLOworCisgICAgLyogY29tcHV0ZSB5ZWFyICYgZGF5IG9mIHllYXIgKi8KKyAgICB5ID0gRVBPQ0hfWUVBUjsKKyAgICBpZiAoZGF5cyA+PSAwKQorICAgIHsKKwlmb3IgKDs7KQorCXsKKwkgICAgeWxlYXAgPSBpc2xlYXAoeSk7CisJICAgIGlmIChkYXlzIDwgeWVhcl9sZW5ndGhzW3lsZWFwXSkKKwkJYnJlYWs7CisJICAgIHkrKzsKKwkgICAgZGF5cyAtPSB5ZWFyX2xlbmd0aHNbeWxlYXBdOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlkbworCXsKKwkgICAgLS15OworCSAgICB5bGVhcCA9IGlzbGVhcCh5KTsKKwkgICAgZGF5cyArPSB5ZWFyX2xlbmd0aHNbeWxlYXBdOworCX0gd2hpbGUgKGRheXMgPCAwKTsKKyAgICB9CisKKyAgICByZXMtPnRtX3llYXIgPSB5IC0gWUVBUl9CQVNFOworICAgIHJlcy0+dG1feWRheSA9IGRheXM7CisgICAgaXAgPSBtb25fbGVuZ3Roc1t5bGVhcF07CisgICAgZm9yIChyZXMtPnRtX21vbiA9IDA7IGRheXMgPj0gaXBbcmVzLT50bV9tb25dOyArK3Jlcy0+dG1fbW9uKQorCWRheXMgLT0gaXBbcmVzLT50bV9tb25dOworICAgIHJlcy0+dG1fbWRheSA9IGRheXMgKyAxOworCisgICAgLyogc2V0IGRheWxpZ2h0IHNhdmluZyB0aW1lIGZsYWcgKi8KKyAgICByZXMtPnRtX2lzZHN0ID0gLTE7CisKKyAgICByZXR1cm4gKHJlcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCitfREVGVU4gKGN0aW1lX3IsICh0aW1fcCwgcmVzdWx0KSwKKwlfQ09OU1QgdGltZV90ICogdGltX3AgX0FORAorCWNoYXIgKiByZXN1bHQpCisKK3sKKyAgICBzdHJ1Y3QgdG0gdG07CisgICAgcmV0dXJuIGFzY3RpbWVfciAobG9jYWx0aW1lX3IgKHRpbV9wLCAmdG0pLCByZXN1bHQpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvdHlwZXMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ4MDhmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC90eXBlcy5oCkBAIC0wLDAgKzEsMTMwIEBACisjaWZuZGVmIF9MSU5VWF9UWVBFU19ICisjZGVmaW5lIF9MSU5VWF9UWVBFU19ICisKKyNpZmRlZglfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZm5kZWYgX19LRVJORUxfU1RSSUNUX05BTUVTCisKK3R5cGVkZWYgX19rZXJuZWxfZmRfc2V0CQlmZF9zZXQ7Cit0eXBlZGVmIF9fa2VybmVsX2Rldl90CQlkZXZfdDsKK3R5cGVkZWYgX19rZXJuZWxfaW5vX3QJCWlub190OwordHlwZWRlZiBfX2tlcm5lbF9tb2RlX3QJCW1vZGVfdDsKK3R5cGVkZWYgX19rZXJuZWxfbmxpbmtfdAlubGlua190OwordHlwZWRlZiBfX2tlcm5lbF9vZmZfdAkJb2ZmX3Q7Cit0eXBlZGVmIF9fa2VybmVsX3BpZF90CQlwaWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfZGFkZHJfdAlkYWRkcl90OwordHlwZWRlZiBfX2tlcm5lbF9rZXlfdAkJa2V5X3Q7Cit0eXBlZGVmIF9fa2VybmVsX3N1c2Vjb25kc190CXN1c2Vjb25kc190OworCisjaWZkZWYgX19LRVJORUxfXwordHlwZWRlZiBfX2tlcm5lbF91aWQzMl90CXVpZF90OwordHlwZWRlZiBfX2tlcm5lbF9naWQzMl90CWdpZF90OwordHlwZWRlZiBfX2tlcm5lbF91aWQxNl90ICAgICAgICB1aWQxNl90OwordHlwZWRlZiBfX2tlcm5lbF9naWQxNl90ICAgICAgICBnaWQxNl90OworCisjaWZkZWYgQ09ORklHX1VJRDE2CisvKiBUaGlzIGlzIGRlZmluZWQgYnkgaW5jbHVkZS9hc20te2FyY2h9L3Bvc2l4X3R5cGVzLmggKi8KK3R5cGVkZWYgX19rZXJuZWxfb2xkX3VpZF90CW9sZF91aWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfb2xkX2dpZF90CW9sZF9naWRfdDsKKyNlbmRpZiAvKiBDT05GSUdfVUlEMTYgKi8KKworLyogbGliYzUgaW5jbHVkZXMgdGhpcyBmaWxlIHRvIGRlZmluZSB1aWRfdCwgdGh1cyB1aWRfdCBjYW4gbmV2ZXIgY2hhbmdlCisgKiB3aGVuIGl0IGlzIGluY2x1ZGVkIGJ5IG5vbi1rZXJuZWwgY29kZQorICovCisjZWxzZQordHlwZWRlZiBfX2tlcm5lbF91aWRfdAkJdWlkX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2dpZF90CQlnaWRfdDsKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCit0eXBlZGVmIF9fa2VybmVsX2xvZmZfdAkJbG9mZl90OworI2VuZGlmCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSBhbHNvIHByb3RlY3RlZCBieSBpbmRpdmlkdWFsIGlmZGVmcyBmb3IKKyAqIGhpc3RvcmljYWwgcmVhc29uczoKKyAqLworI2lmbmRlZiBfU0laRV9UCisjZGVmaW5lIF9TSVpFX1QKK3R5cGVkZWYgX19rZXJuZWxfc2l6ZV90CQlzaXplX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfU1NJWkVfVAorI2RlZmluZSBfU1NJWkVfVAordHlwZWRlZiBfX2tlcm5lbF9zc2l6ZV90CXNzaXplX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfUFRSRElGRl9UCisjZGVmaW5lIF9QVFJESUZGX1QKK3R5cGVkZWYgX19rZXJuZWxfcHRyZGlmZl90CXB0cmRpZmZfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9USU1FX1QKKyNkZWZpbmUgX1RJTUVfVAordHlwZWRlZiBfX2tlcm5lbF90aW1lX3QJCXRpbWVfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9DTE9DS19UCisjZGVmaW5lIF9DTE9DS19UCit0eXBlZGVmIF9fa2VybmVsX2Nsb2NrX3QJY2xvY2tfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9DQUREUl9UCisjZGVmaW5lIF9DQUREUl9UCit0eXBlZGVmIF9fa2VybmVsX2NhZGRyX3QJY2FkZHJfdDsKKyNlbmRpZgorCisvKiBic2QgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdV9jaGFyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJdV9zaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1X2ludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJdV9sb25nOworCisvKiBzeXN2ICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCXVuY2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCXVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1aW50OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCQl1bG9uZzsKKworI2lmbmRlZiBfX0JJVF9UWVBFU19ERUZJTkVEX18KKyNkZWZpbmUgX19CSVRfVFlQRVNfREVGSU5FRF9fCisKK3R5cGVkZWYJCV9fdTgJCXVfaW50OF90OwordHlwZWRlZgkJX19zOAkJaW50OF90OwordHlwZWRlZgkJX191MTYJCXVfaW50MTZfdDsKK3R5cGVkZWYJCV9fczE2CQlpbnQxNl90OwordHlwZWRlZgkJX191MzIJCXVfaW50MzJfdDsKK3R5cGVkZWYJCV9fczMyCQlpbnQzMl90OworCisjZW5kaWYgLyogIShfX0JJVF9UWVBFU19ERUZJTkVEX18pICovCisKK3R5cGVkZWYJCV9fdTgJCXVpbnQ4X3Q7Cit0eXBlZGVmCQlfX3UxNgkJdWludDE2X3Q7Cit0eXBlZGVmCQlfX3UzMgkJdWludDMyX3Q7CisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCit0eXBlZGVmCQlfX3U2NAkJdWludDY0X3Q7Cit0eXBlZGVmCQlfX3U2NAkJdV9pbnQ2NF90OwordHlwZWRlZgkJX19zNjQJCWludDY0X3Q7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fS0VSTkVMX1NUUklDVF9OQU1FUyAqLworCisvKgorICogQmVsb3cgYXJlIHRydWx5IExpbnV4LXNwZWNpZmljIHR5cGVzIHRoYXQgc2hvdWxkIG5ldmVyIGNvbGxpZGUgd2l0aAorICogYW55IGFwcGxpY2F0aW9uL2xpYnJhcnkgdGhhdCB3YW50cyBsaW51eC90eXBlcy5oLgorICovCisKK3N0cnVjdCB1c3RhdCB7CisJX19rZXJuZWxfZGFkZHJfdAlmX3RmcmVlOworCV9fa2VybmVsX2lub190CQlmX3Rpbm9kZTsKKwljaGFyCQkJZl9mbmFtZVs2XTsKKwljaGFyCQkJZl9mcGFja1s2XTsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9tYWxsb2MuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxNTRiMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbWFsbG9jLmgKQEAgLTAsMCArMSw5NDIgQEAKKy8qCisgIEEgdmVyc2lvbiBvZiBtYWxsb2MvZnJlZS9yZWFsbG9jIHdyaXR0ZW4gYnkgRG91ZyBMZWEgYW5kIHJlbGVhc2VkIHRvIHRoZQorICBwdWJsaWMgZG9tYWluLiAgU2VuZCBxdWVzdGlvbnMvY29tbWVudHMvY29tcGxhaW50cy9wZXJmb3JtYW5jZSBkYXRhCisgIHRvIGRsQGNzLm9zd2Vnby5lZHUKKworKiBWRVJTSU9OIDIuNi42ICBTdW4gTWFyICA1IDE5OjEwOjAzIDIwMDAgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQorCisgICBOb3RlOiBUaGVyZSBtYXkgYmUgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIHRoaXMgbWFsbG9jIG9idGFpbmFibGUgYXQKKwkgICBmdHA6Ly9nLm9zd2Vnby5lZHUvcHViL21pc2MvbWFsbG9jLmMKKwkgQ2hlY2sgYmVmb3JlIGluc3RhbGxpbmchCisKKyogV2h5IHVzZSB0aGlzIG1hbGxvYz8KKworICBUaGlzIGlzIG5vdCB0aGUgZmFzdGVzdCwgbW9zdCBzcGFjZS1jb25zZXJ2aW5nLCBtb3N0IHBvcnRhYmxlLCBvcgorICBtb3N0IHR1bmFibGUgbWFsbG9jIGV2ZXIgd3JpdHRlbi4gSG93ZXZlciBpdCBpcyBhbW9uZyB0aGUgZmFzdGVzdAorICB3aGlsZSBhbHNvIGJlaW5nIGFtb25nIHRoZSBtb3N0IHNwYWNlLWNvbnNlcnZpbmcsIHBvcnRhYmxlIGFuZCB0dW5hYmxlLgorICBDb25zaXN0ZW50IGJhbGFuY2UgYWNyb3NzIHRoZXNlIGZhY3RvcnMgcmVzdWx0cyBpbiBhIGdvb2QgZ2VuZXJhbC1wdXJwb3NlCisgIGFsbG9jYXRvci4gRm9yIGEgaGlnaC1sZXZlbCBkZXNjcmlwdGlvbiwgc2VlCisgICAgIGh0dHA6Ly9nLm9zd2Vnby5lZHUvZGwvaHRtbC9tYWxsb2MuaHRtbAorCisqIFN5bm9wc2lzIG9mIHB1YmxpYyByb3V0aW5lcworCisgIChNdWNoIGZ1bGxlciBkZXNjcmlwdGlvbnMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgcHJvZ3JhbSBkb2N1bWVudGF0aW9uIGJlbG93LikKKworICBtYWxsb2Moc2l6ZV90IG4pOworICAgICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGNodW5rIG9mIGF0IGxlYXN0IG4gYnl0ZXMsIG9yIG51bGwKKyAgICAgaWYgbm8gc3BhY2UgaXMgYXZhaWxhYmxlLgorICBmcmVlKFZvaWRfdCogcCk7CisgICAgIFJlbGVhc2UgdGhlIGNodW5rIG9mIG1lbW9yeSBwb2ludGVkIHRvIGJ5IHAsIG9yIG5vIGVmZmVjdCBpZiBwIGlzIG51bGwuCisgIHJlYWxsb2MoVm9pZF90KiBwLCBzaXplX3Qgbik7CisgICAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBjaHVuayBvZiBzaXplIG4gdGhhdCBjb250YWlucyB0aGUgc2FtZSBkYXRhCisgICAgIGFzIGRvZXMgY2h1bmsgcCB1cCB0byB0aGUgbWluaW11bSBvZiAobiwgcCdzIHNpemUpIGJ5dGVzLCBvciBudWxsCisgICAgIGlmIG5vIHNwYWNlIGlzIGF2YWlsYWJsZS4gVGhlIHJldHVybmVkIHBvaW50ZXIgbWF5IG9yIG1heSBub3QgYmUKKyAgICAgdGhlIHNhbWUgYXMgcC4gSWYgcCBpcyBudWxsLCBlcXVpdmFsZW50IHRvIG1hbGxvYy4gIFVubGVzcyB0aGUKKyAgICAgI2RlZmluZSBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgYmVsb3cgaXMgc2V0LCByZWFsbG9jIHdpdGggYQorICAgICBzaXplIGFyZ3VtZW50IG9mIHplcm8gKHJlKWFsbG9jYXRlcyBhIG1pbmltdW0tc2l6ZWQgY2h1bmsuCisgIG1lbWFsaWduKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBuKTsKKyAgICAgUmV0dXJuIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBjaHVuayBvZiBuIGJ5dGVzLCBhbGlnbmVkCisgICAgIGluIGFjY29yZCB3aXRoIHRoZSBhbGlnbm1lbnQgYXJndW1lbnQsIHdoaWNoIG11c3QgYmUgYSBwb3dlciBvZgorICAgICB0d28uCisgIHZhbGxvYyhzaXplX3Qgbik7CisgICAgIEVxdWl2YWxlbnQgdG8gbWVtYWxpZ24ocGFnZXNpemUsIG4pLCB3aGVyZSBwYWdlc2l6ZSBpcyB0aGUgcGFnZQorICAgICBzaXplIG9mIHRoZSBzeXN0ZW0gKG9yIGFzIG5lYXIgdG8gdGhpcyBhcyBjYW4gYmUgZmlndXJlZCBvdXQgZnJvbQorICAgICBhbGwgdGhlIGluY2x1ZGVzL2RlZmluZXMgYmVsb3cuKQorICBwdmFsbG9jKHNpemVfdCBuKTsKKyAgICAgRXF1aXZhbGVudCB0byB2YWxsb2MobWluaW11bS1wYWdlLXRoYXQtaG9sZHMobikpLCB0aGF0IGlzLAorICAgICByb3VuZCB1cCBuIHRvIG5lYXJlc3QgcGFnZXNpemUuCisgIGNhbGxvYyhzaXplX3QgdW5pdCwgc2l6ZV90IHF1YW50aXR5KTsKKyAgICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gcXVhbnRpdHkgKiB1bml0IGJ5dGVzLCB3aXRoIGFsbCBsb2NhdGlvbnMKKyAgICAgc2V0IHRvIHplcm8uCisgIGNmcmVlKFZvaWRfdCogcCk7CisgICAgIEVxdWl2YWxlbnQgdG8gZnJlZShwKS4KKyAgbWFsbG9jX3RyaW0oc2l6ZV90IHBhZCk7CisgICAgIFJlbGVhc2UgYWxsIGJ1dCBwYWQgYnl0ZXMgb2YgZnJlZWQgdG9wLW1vc3QgbWVtb3J5IGJhY2sKKyAgICAgdG8gdGhlIHN5c3RlbS4gUmV0dXJuIDEgaWYgc3VjY2Vzc2Z1bCwgZWxzZSAwLgorICBtYWxsb2NfdXNhYmxlX3NpemUoVm9pZF90KiBwKTsKKyAgICAgUmVwb3J0IHRoZSBudW1iZXIgdXNhYmxlIGFsbG9jYXRlZCBieXRlcyBhc3NvY2lhdGVkIHdpdGggYWxsb2NhdGVkCisgICAgIGNodW5rIHAuIFRoaXMgbWF5IG9yIG1heSBub3QgcmVwb3J0IG1vcmUgYnl0ZXMgdGhhbiB3ZXJlIHJlcXVlc3RlZCwKKyAgICAgZHVlIHRvIGFsaWdubWVudCBhbmQgbWluaW11bSBzaXplIGNvbnN0cmFpbnRzLgorICBtYWxsb2Nfc3RhdHMoKTsKKyAgICAgUHJpbnRzIGJyaWVmIHN1bW1hcnkgc3RhdGlzdGljcyBvbiBzdGRlcnIuCisgIG1hbGxpbmZvKCkKKyAgICAgUmV0dXJucyAoYnkgY29weSkgYSBzdHJ1Y3QgY29udGFpbmluZyB2YXJpb3VzIHN1bW1hcnkgc3RhdGlzdGljcy4KKyAgbWFsbG9wdChpbnQgcGFyYW1ldGVyX251bWJlciwgaW50IHBhcmFtZXRlcl92YWx1ZSkKKyAgICAgQ2hhbmdlcyBvbmUgb2YgdGhlIHR1bmFibGUgcGFyYW1ldGVycyBkZXNjcmliZWQgYmVsb3cuIFJldHVybnMKKyAgICAgMSBpZiBzdWNjZXNzZnVsIGluIGNoYW5naW5nIHRoZSBwYXJhbWV0ZXIsIGVsc2UgMC4KKworKiBWaXRhbCBzdGF0aXN0aWNzOgorCisgIEFsaWdubWVudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgOC1ieXRlCisgICAgICAgOCBieXRlIGFsaWdubWVudCBpcyBjdXJyZW50bHkgaGFyZHdpcmVkIGludG8gdGhlIGRlc2lnbi4gIFRoaXMKKyAgICAgICBzZWVtcyB0byBzdWZmaWNlIGZvciBhbGwgY3VycmVudCBtYWNoaW5lcyBhbmQgQyBjb21waWxlcnMuCisKKyAgQXNzdW1lZCBwb2ludGVyIHJlcHJlc2VudGF0aW9uOiAgICAgICA0IG9yIDggYnl0ZXMKKyAgICAgICBDb2RlIGZvciA4LWJ5dGUgcG9pbnRlcnMgaXMgdW50ZXN0ZWQgYnkgbWUgYnV0IGhhcyB3b3JrZWQKKyAgICAgICByZWxpYWJseSBieSBXb2xmcmFtIEdsb2dlciwgd2hvIGNvbnRyaWJ1dGVkIG1vc3Qgb2YgdGhlCisgICAgICAgY2hhbmdlcyBzdXBwb3J0aW5nIHRoaXMuCisKKyAgQXNzdW1lZCBzaXplX3QgIHJlcHJlc2VudGF0aW9uOiAgICAgICA0IG9yIDggYnl0ZXMKKyAgICAgICBOb3RlIHRoYXQgc2l6ZV90IGlzIGFsbG93ZWQgdG8gYmUgNCBieXRlcyBldmVuIGlmIHBvaW50ZXJzIGFyZSA4LgorCisgIE1pbmltdW0gb3ZlcmhlYWQgcGVyIGFsbG9jYXRlZCBjaHVuazogNCBvciA4IGJ5dGVzCisgICAgICAgRWFjaCBtYWxsb2NlZCBjaHVuayBoYXMgYSBoaWRkZW4gb3ZlcmhlYWQgb2YgNCBieXRlcyBob2xkaW5nIHNpemUKKyAgICAgICBhbmQgc3RhdHVzIGluZm9ybWF0aW9uLgorCisgIE1pbmltdW0gYWxsb2NhdGVkIHNpemU6IDQtYnl0ZSBwdHJzOiAgMTYgYnl0ZXMgICAgKGluY2x1ZGluZyA0IG92ZXJoZWFkKQorCQkJICA4LWJ5dGUgcHRyczogIDI0LzMyIGJ5dGVzIChpbmNsdWRpbmcsIDQvOCBvdmVyaGVhZCkKKworICAgICAgIFdoZW4gYSBjaHVuayBpcyBmcmVlZCwgMTIgKGZvciA0Ynl0ZSBwdHJzKSBvciAyMCAoZm9yIDggYnl0ZQorICAgICAgIHB0cnMgYnV0IDQgYnl0ZSBzaXplKSBvciAyNCAoZm9yIDgvOCkgYWRkaXRpb25hbCBieXRlcyBhcmUKKyAgICAgICBuZWVkZWQ7IDQgKDgpIGZvciBhIHRyYWlsaW5nIHNpemUgZmllbGQKKyAgICAgICBhbmQgOCAoMTYpIGJ5dGVzIGZvciBmcmVlIGxpc3QgcG9pbnRlcnMuIFRodXMsIHRoZSBtaW5pbXVtCisgICAgICAgYWxsb2NhdGFibGUgc2l6ZSBpcyAxNi8yNC8zMiBieXRlcy4KKworICAgICAgIEV2ZW4gYSByZXF1ZXN0IGZvciB6ZXJvIGJ5dGVzIChpLmUuLCBtYWxsb2MoMCkpIHJldHVybnMgYQorICAgICAgIHBvaW50ZXIgdG8gc29tZXRoaW5nIG9mIHRoZSBtaW5pbXVtIGFsbG9jYXRhYmxlIHNpemUuCisKKyAgTWF4aW11bSBhbGxvY2F0ZWQgc2l6ZTogNC1ieXRlIHNpemVfdDogMl4zMSAtICA4IGJ5dGVzCisJCQkgIDgtYnl0ZSBzaXplX3Q6IDJeNjMgLSAxNiBieXRlcworCisgICAgICAgSXQgaXMgYXNzdW1lZCB0aGF0IChwb3NzaWJseSBzaWduZWQpIHNpemVfdCBiaXQgdmFsdWVzIHN1ZmZpY2UgdG8KKyAgICAgICByZXByZXNlbnQgY2h1bmsgc2l6ZXMuIGBQb3NzaWJseSBzaWduZWQnIGlzIGR1ZSB0byB0aGUgZmFjdAorICAgICAgIHRoYXQgYHNpemVfdCcgbWF5IGJlIGRlZmluZWQgb24gYSBzeXN0ZW0gYXMgZWl0aGVyIGEgc2lnbmVkIG9yCisgICAgICAgYW4gdW5zaWduZWQgdHlwZS4gVG8gYmUgY29uc2VydmF0aXZlLCB2YWx1ZXMgdGhhdCB3b3VsZCBhcHBlYXIKKyAgICAgICBhcyBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhdm9pZGVkLgorICAgICAgIFJlcXVlc3RzIGZvciBzaXplcyB3aXRoIGEgbmVnYXRpdmUgc2lnbiBiaXQgd2hlbiB0aGUgcmVxdWVzdAorICAgICAgIHNpemUgaXMgdHJlYWRlZCBhcyBhIGxvbmcgd2lsbCByZXR1cm4gbnVsbC4KKworICBNYXhpbXVtIG92ZXJoZWFkIHdhc3RhZ2UgcGVyIGFsbG9jYXRlZCBjaHVuazogbm9ybWFsbHkgMTUgYnl0ZXMKKworICAgICAgIEFsaWdubm1lbnQgZGVtYW5kcywgcGx1cyB0aGUgbWluaW11bSBhbGxvY2F0YWJsZSBzaXplIHJlc3RyaWN0aW9uCisgICAgICAgbWFrZSB0aGUgbm9ybWFsIHdvcnN0LWNhc2Ugd2FzdGFnZSAxNSBieXRlcyAoaS5lLiwgdXAgdG8gMTUKKyAgICAgICBtb3JlIGJ5dGVzIHdpbGwgYmUgYWxsb2NhdGVkIHRoYW4gd2VyZSByZXF1ZXN0ZWQgaW4gbWFsbG9jKSwgd2l0aAorICAgICAgIHR3byBleGNlcHRpb25zOgorCSAxLiBCZWNhdXNlIHJlcXVlc3RzIGZvciB6ZXJvIGJ5dGVzIGFsbG9jYXRlIG5vbi16ZXJvIHNwYWNlLAorCSAgICB0aGUgd29yc3QgY2FzZSB3YXN0YWdlIGZvciBhIHJlcXVlc3Qgb2YgemVybyBieXRlcyBpcyAyNCBieXRlcy4KKwkgMi4gRm9yIHJlcXVlc3RzID49IG1tYXBfdGhyZXNob2xkIHRoYXQgYXJlIHNlcnZpY2VkIHZpYQorCSAgICBtbWFwKCksIHRoZSB3b3JzdCBjYXNlIHdhc3RhZ2UgaXMgOCBieXRlcyBwbHVzIHRoZSByZW1haW5kZXIKKwkgICAgZnJvbSBhIHN5c3RlbSBwYWdlICh0aGUgbWluaW1hbCBtbWFwIHVuaXQpOyB0eXBpY2FsbHkgNDA5NiBieXRlcy4KKworKiBMaW1pdGF0aW9ucworCisgICAgSGVyZSBhcmUgc29tZSBmZWF0dXJlcyB0aGF0IGFyZSBOT1QgY3VycmVudGx5IHN1cHBvcnRlZAorCisgICAgKiBObyB1c2VyLWRlZmluYWJsZSBob29rcyBmb3IgY2FsbGJhY2tzIGFuZCB0aGUgbGlrZS4KKyAgICAqIE5vIGF1dG9tYXRlZCBtZWNoYW5pc20gZm9yIGZ1bGx5IGNoZWNraW5nIHRoYXQgYWxsIGFjY2Vzc2VzCisgICAgICB0byBtYWxsb2NlZCBtZW1vcnkgc3RheSB3aXRoaW4gdGhlaXIgYm91bmRzLgorICAgICogTm8gc3VwcG9ydCBmb3IgY29tcGFjdGlvbi4KKworKiBTeW5vcHNpcyBvZiBjb21waWxlLXRpbWUgb3B0aW9uczoKKworICAgIFBlb3BsZSBoYXZlIHJlcG9ydGVkIHVzaW5nIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgbWFsbG9jIG9uIGFsbAorICAgIHZlcnNpb25zIG9mIFVuaXgsIHNvbWV0aW1lcyBieSB0d2Vha2luZyBzb21lIG9mIHRoZSBkZWZpbmVzCisgICAgYmVsb3cuIEl0IGhhcyBiZWVuIHRlc3RlZCBtb3N0IGV4dGVuc2l2ZWx5IG9uIFNvbGFyaXMgYW5kCisgICAgTGludXguIEl0IGlzIGFsc28gcmVwb3J0ZWQgdG8gd29yayBvbiBXSU4zMiBwbGF0Zm9ybXMuCisgICAgUGVvcGxlIGhhdmUgYWxzbyByZXBvcnRlZCBhZGFwdGluZyB0aGlzIG1hbGxvYyBmb3IgdXNlIGluCisgICAgc3RhbmQtYWxvbmUgZW1iZWRkZWQgc3lzdGVtcy4KKworICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBzdHJhaWdodCwgaGFuZC10dW5lZCBBTlNJIEMuICBBbW9uZyBvdGhlcgorICAgIGNvbnNlcXVlbmNlcywgaXQgdXNlcyBhIGxvdCBvZiBtYWNyb3MuICBCZWNhdXNlIG9mIHRoaXMsIHRvIGJlIGF0CisgICAgYWxsIHVzYWJsZSwgdGhpcyBjb2RlIHNob3VsZCBiZSBjb21waWxlZCB1c2luZyBhbiBvcHRpbWl6aW5nIGNvbXBpbGVyCisgICAgKGZvciBleGFtcGxlIGdjYyAtTzIpIHRoYXQgY2FuIHNpbXBsaWZ5IGV4cHJlc3Npb25zIGFuZCBjb250cm9sCisgICAgcGF0aHMuCisKKyAgX19TVERfQyAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBkZXJpdmVkIGZyb20gQyBjb21waWxlciBkZWZpbmVzKQorICAgICBOb256ZXJvIGlmIHVzaW5nIEFOU0ktc3RhbmRhcmQgQyBjb21waWxlciwgYSBDKysgY29tcGlsZXIsIG9yCisgICAgIGEgQyBjb21waWxlciBzdWZmaWNpZW50bHkgY2xvc2UgdG8gQU5TSSB0byBnZXQgYXdheSB3aXRoIGl0LgorICBERUJVRyAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IE5PVCBkZWZpbmVkKQorICAgICBEZWZpbmUgdG8gZW5hYmxlIGRlYnVnZ2luZy4gQWRkcyBmYWlybHkgZXh0ZW5zaXZlIGFzc2VydGlvbi1iYXNlZAorICAgICBjaGVja2luZyB0byBoZWxwIHRyYWNrIGRvd24gbWVtb3J5IGVycm9ycywgYnV0IG5vdGljZWFibHkgc2xvd3MgZG93bgorICAgICBleGVjdXRpb24uCisgIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUyAoZGVmYXVsdDogTk9UIGRlZmluZWQpCisgICAgIERlZmluZSB0aGlzIGlmIHlvdSB0aGluayB0aGF0IHJlYWxsb2MocCwgMCkgc2hvdWxkIGJlIGVxdWl2YWxlbnQKKyAgICAgdG8gZnJlZShwKS4gT3RoZXJ3aXNlLCBzaW5jZSBtYWxsb2MgcmV0dXJucyBhIHVuaXF1ZSBwb2ludGVyIGZvcgorICAgICBtYWxsb2MoMCksIHNvIGRvZXMgcmVhbGxvYyhwLCAwKS4KKyAgSEFWRV9NRU1DUFkgICAgICAgICAgICAgICAoZGVmYXVsdDogZGVmaW5lZCkKKyAgICAgRGVmaW5lIGlmIHlvdSBhcmUgbm90IG90aGVyd2lzZSB1c2luZyBBTlNJIFNURCBDLCBidXQgc3RpbGwKKyAgICAgaGF2ZSBtZW1jcHkgYW5kIG1lbXNldCBpbiB5b3VyIEMgbGlicmFyeSBhbmQgd2FudCB0byB1c2UgdGhlbS4KKyAgICAgT3RoZXJ3aXNlLCBzaW1wbGUgaW50ZXJuYWwgdmVyc2lvbnMgYXJlIHN1cHBsaWVkLgorICBVU0VfTUVNQ1BZICAgICAgICAgICAgICAgKGRlZmF1bHQ6IDEgaWYgSEFWRV9NRU1DUFkgaXMgZGVmaW5lZCwgMCBvdGhlcndpc2UpCisgICAgIERlZmluZSBhcyAxIGlmIHlvdSB3YW50IHRoZSBDIGxpYnJhcnkgdmVyc2lvbnMgb2YgbWVtc2V0IGFuZAorICAgICBtZW1jcHkgY2FsbGVkIGluIHJlYWxsb2MgYW5kIGNhbGxvYyAob3RoZXJ3aXNlIG1hY3JvIHZlcnNpb25zIGFyZSB1c2VkKS4KKyAgICAgQXQgbGVhc3Qgb24gc29tZSBwbGF0Zm9ybXMsIHRoZSBzaW1wbGUgbWFjcm8gdmVyc2lvbnMgdXN1YWxseQorICAgICBvdXRwZXJmb3JtIGxpYmMgdmVyc2lvbnMuCisgIEhBVkVfTU1BUCAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGRlZmluZWQgYXMgMSkKKyAgICAgRGVmaW5lIHRvIG5vbi16ZXJvIHRvIG9wdGlvbmFsbHkgbWFrZSBtYWxsb2MoKSB1c2UgbW1hcCgpIHRvCisgICAgIGFsbG9jYXRlIHZlcnkgbGFyZ2UgYmxvY2tzLgorICBIQVZFX01SRU1BUCAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGRlZmluZWQgYXMgMCB1bmxlc3MgTGludXggbGliYyBzZXQpCisgICAgIERlZmluZSB0byBub24temVybyB0byBvcHRpb25hbGx5IG1ha2UgcmVhbGxvYygpIHVzZSBtcmVtYXAoKSB0bworICAgICByZWFsbG9jYXRlIHZlcnkgbGFyZ2UgYmxvY2tzLgorICBtYWxsb2NfZ2V0cGFnZXNpemUgICAgICAgIChkZWZhdWx0OiBkZXJpdmVkIGZyb20gc3lzdGVtICNpbmNsdWRlcykKKyAgICAgRWl0aGVyIGEgY29uc3RhbnQgb3Igcm91dGluZSBjYWxsIHJldHVybmluZyB0aGUgc3lzdGVtIHBhZ2Ugc2l6ZS4KKyAgSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSCAoZGVmYXVsdDogTk9UIGRlZmluZWQpCisgICAgIE9wdGlvbmFsbHkgZGVmaW5lIGlmIHlvdSBhcmUgb24gYSBzeXN0ZW0gd2l0aCBhIC91c3IvaW5jbHVkZS9tYWxsb2MuaAorICAgICB0aGF0IGRlY2xhcmVzIHN0cnVjdCBtYWxsaW5mby4gSXQgaXMgbm90IGF0IGFsbCBuZWNlc3NhcnkgdG8KKyAgICAgZGVmaW5lIHRoaXMgZXZlbiBpZiB5b3UgZG8sIGJ1dCB3aWxsIGVuc3VyZSBjb25zaXN0ZW5jeS4KKyAgSU5URVJOQUxfU0laRV9UICAgICAgICAgICAoZGVmYXVsdDogc2l6ZV90KQorICAgICBEZWZpbmUgdG8gYSAzMi1iaXQgdHlwZSAocHJvYmFibHkgYHVuc2lnbmVkIGludCcpIGlmIHlvdSBhcmUgb24gYQorICAgICA2NC1iaXQgbWFjaGluZSwgeWV0IGRvIG5vdCB3YW50IG9yIG5lZWQgdG8gYWxsb3cgbWFsbG9jIHJlcXVlc3RzIG9mCisgICAgIGdyZWF0ZXIgdGhhbiAyXjMxIHRvIGJlIGhhbmRsZWQuIFRoaXMgc2F2ZXMgc3BhY2UsIGVzcGVjaWFsbHkgZm9yCisgICAgIHZlcnkgc21hbGwgY2h1bmtzLgorICBJTlRFUk5BTF9MSU5VWF9DX0xJQiAgICAgIChkZWZhdWx0OiBOT1QgZGVmaW5lZCkKKyAgICAgRGVmaW5lZCBvbmx5IHdoZW4gY29tcGlsZWQgYXMgcGFydCBvZiBMaW51eCBsaWJjLgorICAgICBBbHNvIG5vdGUgdGhhdCB0aGVyZSBpcyBzb21lIG9kZCBpbnRlcm5hbCBuYW1lLW1hbmdsaW5nIHZpYSBkZWZpbmVzCisgICAgIChmb3IgZXhhbXBsZSwgaW50ZXJuYWxseSwgYG1hbGxvYycgaXMgbmFtZWQgYG1BTExPYycpIG5lZWRlZAorICAgICB3aGVuIGNvbXBpbGluZyBpbiB0aGlzIGNhc2UuIFRoZXNlIGxvb2sgZnVubnkgYnV0IGRvbid0IG90aGVyd2lzZQorICAgICBhZmZlY3QgYW55dGhpbmcuCisgIFdJTjMyICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IHVuZGVmaW5lZCkKKyAgICAgRGVmaW5lIHRoaXMgb24gTVMgd2luICg5NSwgbnQpIHBsYXRmb3JtcyB0byBjb21waWxlIGluIHNicmsgZW11bGF0aW9uLgorICBMQUNLU19VTklTVERfSCAgICAgICAgICAgIChkZWZhdWx0OiB1bmRlZmluZWQgaWYgbm90IFdJTjMyKQorICAgICBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGEgPHVuaXN0ZC5oPi4KKyAgTEFDS1NfU1lTX1BBUkFNX0ggICAgICAgICAoZGVmYXVsdDogdW5kZWZpbmVkIGlmIG5vdCBXSU4zMikKKyAgICAgRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgaGF2ZSBhIDxzeXMvcGFyYW0uaD4uCisgIE1PUkVDT1JFICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IHNicmspCisgICAgIFRoZSBuYW1lIG9mIHRoZSByb3V0aW5lIHRvIGNhbGwgdG8gb2J0YWluIG1vcmUgbWVtb3J5IGZyb20gdGhlIHN5c3RlbS4KKyAgTU9SRUNPUkVfRkFJTFVSRSAgICAgICAgICAoZGVmYXVsdDogLTEpCisgICAgIFRoZSB2YWx1ZSByZXR1cm5lZCB1cG9uIGZhaWx1cmUgb2YgTU9SRUNPUkUuCisgIE1PUkVDT1JFX0NMRUFSUyAgICAgICAgICAgKGRlZmF1bHQgMSkKKyAgICAgVHJ1ZSAoMSkgaWYgdGhlIHJvdXRpbmUgbWFwcGVkIHRvIE1PUkVDT1JFIHplcm9lcyBvdXQgbWVtb3J5ICh3aGljaAorICAgICBob2xkcyBmb3Igc2JyaykuCisgIERFRkFVTFRfVFJJTV9USFJFU0hPTEQKKyAgREVGQVVMVF9UT1BfUEFECisgIERFRkFVTFRfTU1BUF9USFJFU0hPTEQKKyAgREVGQVVMVF9NTUFQX01BWAorICAgICBEZWZhdWx0IHZhbHVlcyBvZiB0dW5hYmxlIHBhcmFtZXRlcnMgKGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cpCisgICAgIGNvbnRyb2xsaW5nIGludGVyYWN0aW9uIHdpdGggaG9zdCBzeXN0ZW0gcm91dGluZXMgKHNicmssIG1tYXAsIGV0YykuCisgICAgIFRoZXNlIHZhbHVlcyBtYXkgYWxzbyBiZSBjaGFuZ2VkIGR5bmFtaWNhbGx5IHZpYSBtYWxsb3B0KCkuIFRoZQorICAgICBwcmVzZXQgZGVmYXVsdHMgYXJlIHRob3NlIHRoYXQgZ2l2ZSBiZXN0IHBlcmZvcm1hbmNlIGZvciB0eXBpY2FsCisgICAgIHByb2dyYW1zL3N5c3RlbXMuCisgIFVTRV9ETF9QUkVGSVggICAgICAgICAgICAgKGRlZmF1bHQ6IHVuZGVmaW5lZCkKKyAgICAgUHJlZml4IGFsbCBwdWJsaWMgcm91dGluZXMgd2l0aCB0aGUgc3RyaW5nICdkbCcuICBVc2VmdWwgdG8KKyAgICAgcXVpY2tseSBhdm9pZCBwcm9jZWR1cmUgZGVjbGFyYXRpb24gY29uZmxpY3RzIGFuZCBsaW5rZXIgc3ltYm9sCisgICAgIGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLgorCisKKyovCisKKwwKKworCisvKiBQcmVsaW1pbmFyaWVzICovCisKKyNpZm5kZWYgX19TVERfQworI2lmZGVmIF9fU1REQ19fCisjZGVmaW5lIF9fU1REX0MgICAgIDEKKyNlbHNlCisjaWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgX19TVERfQyAgICAgMQorI2Vsc2UKKyNkZWZpbmUgX19TVERfQyAgICAgMAorI2VuZGlmIC8qX19jcGx1c3BsdXMqLworI2VuZGlmIC8qX19TVERDX18qLworI2VuZGlmIC8qX19TVERfQyovCisKKyNpZm5kZWYgVm9pZF90CisjaWYgKF9fU1REX0MgfHwgZGVmaW5lZChXSU4zMikpCisjZGVmaW5lIFZvaWRfdCAgICAgIHZvaWQKKyNlbHNlCisjZGVmaW5lIFZvaWRfdCAgICAgIGNoYXIKKyNlbmRpZgorI2VuZGlmIC8qVm9pZF90Ki8KKworI2lmIF9fU1REX0MKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogZm9yIHNpemVfdCAqLworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgkvKiBfX1NURF9DICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIDAJLyogbm90IGZvciBVLUJvb3QgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgkvKiBuZWVkZWQgZm9yIG1hbGxvY19zdGF0cyAqLworI2VuZGlmCisKKworLyoKKyAgQ29tcGlsZS10aW1lIG9wdGlvbnMKKyovCisKKworLyoKKyAgICBEZWJ1Z2dpbmc6CisKKyAgICBCZWNhdXNlIGZyZWVkIGNodW5rcyBtYXkgYmUgb3ZlcndyaXR0ZW4gd2l0aCBsaW5rIGZpZWxkcywgdGhpcworICAgIG1hbGxvYyB3aWxsIG9mdGVuIGRpZSB3aGVuIGZyZWVkIG1lbW9yeSBpcyBvdmVyd3JpdHRlbiBieSB1c2VyCisgICAgcHJvZ3JhbXMuICBUaGlzIGNhbiBiZSB2ZXJ5IGVmZmVjdGl2ZSAoYWxiZWl0IGluIGFuIGFubm95aW5nIHdheSkKKyAgICBpbiBoZWxwaW5nIHRyYWNrIGRvd24gZGFuZ2xpbmcgcG9pbnRlcnMuCisKKyAgICBJZiB5b3UgY29tcGlsZSB3aXRoIC1EREVCVUcsIGEgbnVtYmVyIG9mIGFzc2VydGlvbiBjaGVja3MgYXJlCisgICAgZW5hYmxlZCB0aGF0IHdpbGwgY2F0Y2ggbW9yZSBtZW1vcnkgZXJyb3JzLiBZb3UgcHJvYmFibHkgd29uJ3QgYmUKKyAgICBhYmxlIHRvIG1ha2UgbXVjaCBzZW5zZSBvZiB0aGUgYWN0dWFsIGFzc2VydGlvbiBlcnJvcnMsIGJ1dCB0aGV5CisgICAgc2hvdWxkIGhlbHAgeW91IGxvY2F0ZSBpbmNvcnJlY3RseSBvdmVyd3JpdHRlbiBtZW1vcnkuICBUaGUKKyAgICBjaGVja2luZyBpcyBmYWlybHkgZXh0ZW5zaXZlLCBhbmQgd2lsbCBzbG93IGRvd24gZXhlY3V0aW9uCisgICAgbm90aWNlYWJseS4gQ2FsbGluZyBtYWxsb2Nfc3RhdHMgb3IgbWFsbGluZm8gd2l0aCBERUJVRyBzZXQgd2lsbAorICAgIGF0dGVtcHQgdG8gY2hlY2sgZXZlcnkgbm9uLW1tYXBwZWQgYWxsb2NhdGVkIGFuZCBmcmVlIGNodW5rIGluIHRoZQorICAgIGNvdXJzZSBvZiBjb21wdXRpbmcgdGhlIHN1bW1tYXJpZXMuIChCeSBuYXR1cmUsIG1tYXBwZWQgcmVnaW9ucworICAgIGNhbm5vdCBiZSBjaGVja2VkIHZlcnkgbXVjaCBhdXRvbWF0aWNhbGx5LikKKworICAgIFNldHRpbmcgREVCVUcgbWF5IGFsc28gYmUgaGVscGZ1bCBpZiB5b3UgYXJlIHRyeWluZyB0byBtb2RpZnkKKyAgICB0aGlzIGNvZGUuIFRoZSBhc3NlcnRpb25zIGluIHRoZSBjaGVjayByb3V0aW5lcyBzcGVsbCBvdXQgaW4gbW9yZQorICAgIGRldGFpbCB0aGUgYXNzdW1wdGlvbnMgYW5kIGludmFyaWFudHMgdW5kZXJseWluZyB0aGUgYWxnb3JpdGhtcy4KKworKi8KKworI2lmZGVmIERFQlVHCisvKiAjaW5jbHVkZSA8YXNzZXJ0Lmg+ICovCisjZGVmaW5lIGFzc2VydCh4KSAoKHZvaWQpMCkKKyNlbHNlCisjZGVmaW5lIGFzc2VydCh4KSAoKHZvaWQpMCkKKyNlbmRpZgorCisKKy8qCisgIElOVEVSTkFMX1NJWkVfVCBpcyB0aGUgd29yZC1zaXplIHVzZWQgZm9yIGludGVybmFsIGJvb2trZWVwaW5nCisgIG9mIGNodW5rIHNpemVzLiBPbiBhIDY0LWJpdCBtYWNoaW5lLCB5b3UgY2FuIHJlZHVjZSBtYWxsb2MKKyAgb3ZlcmhlYWQgYnkgZGVmaW5pbmcgSU5URVJOQUxfU0laRV9UIHRvIGJlIGEgMzIgYml0IGB1bnNpZ25lZCBpbnQnCisgIGF0IHRoZSBleHBlbnNlIG9mIG5vdCBiZWluZyBhYmxlIHRvIGhhbmRsZSByZXF1ZXN0cyBncmVhdGVyIHRoYW4KKyAgMl4zMS4gVGhpcyBsaW1pdGF0aW9uIGlzIGhhcmRseSBldmVyIGEgY29uY2VybjsgeW91IGFyZSBlbmNvdXJhZ2VkCisgIHRvIHNldCB0aGlzLiBIb3dldmVyLCB0aGUgZGVmYXVsdCB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHNpemVfdC4KKyovCisKKyNpZm5kZWYgSU5URVJOQUxfU0laRV9UCisjZGVmaW5lIElOVEVSTkFMX1NJWkVfVCBzaXplX3QKKyNlbmRpZgorCisvKgorICBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgc2hvdWxkIGJlIHNldCBpZiBhIGNhbGwgdG8KKyAgcmVhbGxvYyB3aXRoIHplcm8gYnl0ZXMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGEgY2FsbCB0byBmcmVlLgorICBTb21lIHBlb3BsZSB0aGluayBpdCBzaG91bGQuIE90aGVyd2lzZSwgc2luY2UgdGhpcyBtYWxsb2MKKyAgcmV0dXJucyBhIHVuaXF1ZSBwb2ludGVyIGZvciBtYWxsb2MoMCksIHNvIGRvZXMgcmVhbGxvYyhwLCAwKS4KKyovCisKKworLyogICAjZGVmaW5lIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUyAqLworCisKKy8qCisgIFdJTjMyIGNhdXNlcyBhbiBlbXVsYXRpb24gb2Ygc2JyayB0byBiZSBjb21waWxlZCBpbgorICBtbWFwLWJhc2VkIG9wdGlvbnMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIFdJTjMyLgorKi8KKworLyogI2RlZmluZSBXSU4zMiAqLworI2lmZGVmIFdJTjMyCisjZGVmaW5lIE1PUkVDT1JFIHdzYnJrCisjZGVmaW5lIEhBVkVfTU1BUCAwCisKKyNkZWZpbmUgTEFDS1NfVU5JU1REX0gKKyNkZWZpbmUgTEFDS1NfU1lTX1BBUkFNX0gKKworLyoKKyAgSW5jbHVkZSAnd2luZG93cy5oJyB0byBnZXQgdGhlIG5lY2Vzc2FyeSBkZWNsYXJhdGlvbnMgZm9yIHRoZQorICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBkYXRhIHN0cnVjdHVyZXMgYW5kIHJvdXRpbmVzIHVzZWQgaW4gdGhlICdzYnJrJworICBlbXVsYXRpb24uCisKKyAgRGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gc28gdGhhdCBvbmx5IHRoZSBlc3NlbnRpYWwgTWljcm9zb2Z0CisgIFZpc3VhbCBDKysgaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4KKyovCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworCisvKgorICBIQVZFX01FTUNQWSBzaG91bGQgYmUgZGVmaW5lZCBpZiB5b3UgYXJlIG5vdCBvdGhlcndpc2UgdXNpbmcKKyAgQU5TSSBTVEQgQywgYnV0IHN0aWxsIGhhdmUgbWVtY3B5IGFuZCBtZW1zZXQgaW4geW91ciBDIGxpYnJhcnkKKyAgYW5kIHdhbnQgdG8gdXNlIHRoZW0gaW4gY2FsbG9jIGFuZCByZWFsbG9jLiBPdGhlcndpc2Ugc2ltcGxlCisgIG1hY3JvIHZlcnNpb25zIGFyZSBkZWZpbmVkIGhlcmUuCisKKyAgVVNFX01FTUNQWSBzaG91bGQgYmUgZGVmaW5lZCBhcyAxIGlmIHlvdSBhY3R1YWxseSB3YW50IHRvCisgIGhhdmUgbWVtc2V0IGFuZCBtZW1jcHkgY2FsbGVkLiBQZW9wbGUgcmVwb3J0IHRoYXQgdGhlIG1hY3JvCisgIHZlcnNpb25zIGFyZSBvZnRlbiBlbm91Z2ggZmFzdGVyIHRoYW4gbGliYyB2ZXJzaW9ucyBvbiBtYW55CisgIHN5c3RlbXMgdGhhdCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZW0uCisKKyovCisKKyNkZWZpbmUgSEFWRV9NRU1DUFkKKworI2lmbmRlZiBVU0VfTUVNQ1BZCisjaWZkZWYgSEFWRV9NRU1DUFkKKyNkZWZpbmUgVVNFX01FTUNQWSAxCisjZWxzZQorI2RlZmluZSBVU0VfTUVNQ1BZIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAoX19TVERfQyB8fCBkZWZpbmVkKEhBVkVfTUVNQ1BZKSkKKworI2lmIF9fU1REX0MKK3ZvaWQqIG1lbXNldCh2b2lkKiwgaW50LCBzaXplX3QpOwordm9pZCogbWVtY3B5KHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKyNlbHNlCisjaWZkZWYgV0lOMzIKKy8qIE9uIFdpbjMyIHBsYXRmb3JtcywgJ21lbXNldCgpJyBhbmQgJ21lbWNweSgpJyBhcmUgYWxyZWFkeSBkZWNsYXJlZCBpbiAqLworLyogJ3dpbmRvd3MuaCcgKi8KKyNlbHNlCitWb2lkX3QqIG1lbXNldCgpOworVm9pZF90KiBtZW1jcHkoKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIFVTRV9NRU1DUFkKKworLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIG9ubHkgaW52b2tlZCB3aXRoICgybisxKS1tdWx0aXBsZXMgb2YKKyAgIElOVEVSTkFMX1NJWkVfVCB1bml0cywgd2l0aCBhIHBvc2l0aXZlIGludGVnZXIgbi4gVGhpcyBpcyBleHBsb2l0ZWQKKyAgIGZvciBmYXN0IGlubGluZSBleGVjdXRpb24gd2hlbiBuIGlzIHNtYWxsLiAqLworCisjZGVmaW5lIE1BTExPQ19aRVJPKGNoYXJwLCBuYnl0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1NJWkVfVCBtenN6ID0gKG5ieXRlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmKG16c3ogPD0gOSpzaXplb2YobXpzeikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSU5URVJOQUxfU0laRV9UKiBteiA9IChJTlRFUk5BTF9TSVpFX1QqKSAoY2hhcnApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYobXpzeiA+PSA1KnNpemVvZihtenN6KSkgeyAgICAgKm16KysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbXorKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmKG16c3ogPj0gNypzaXplb2YobXpzeikpIHsgICAqbXorKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICpteisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmKG16c3ogPj0gOSpzaXplb2YobXpzeikpIHsgKm16KysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbXorKyA9IDA7IH19fSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICpteisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm16KysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbXogICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIG1lbXNldCgoY2hhcnApLCAwLCBtenN6KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBNQUxMT0NfQ09QWShkZXN0LHNyYyxuYnl0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9TSVpFX1QgbWNzeiA9IChuYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZihtY3N6IDw9IDkqc2l6ZW9mKG1jc3opKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOVEVSTkFMX1NJWkVfVCogbWNzcmMgPSAoSU5URVJOQUxfU0laRV9UKikgKHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOVEVSTkFMX1NJWkVfVCogbWNkc3QgPSAoSU5URVJOQUxfU0laRV9UKikgKGRlc3QpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKG1jc3ogPj0gNSpzaXplb2YobWNzeikpIHsgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZihtY3N6ID49IDcqc2l6ZW9mKG1jc3opKSB7ICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgIFwKKwlpZihtY3N6ID49IDkqc2l6ZW9mKG1jc3opKSB7ICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgfX19ICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm1jZHN0ICAgPSAqbWNzcmMgIDsgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSBtZW1jcHkoZGVzdCwgc3JjLCBtY3N6KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKyNlbHNlIC8qICFVU0VfTUVNQ1BZICovCisKKy8qIFVzZSBEdWZmJ3MgZGV2aWNlIGZvciBnb29kIHplcm9pbmcvY29weWluZyBwZXJmb3JtYW5jZS4gKi8KKworI2RlZmluZSBNQUxMT0NfWkVSTyhjaGFycCwgbmJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9TSVpFX1QqIG16cCA9IChJTlRFUk5BTF9TSVpFX1QqKShjaGFycCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsb25nIG1jdG1wID0gKG5ieXRlcykvc2l6ZW9mKElOVEVSTkFMX1NJWkVfVCksIG1jbjsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobWN0bXAgPCA4KSBtY24gPSAwOyBlbHNlIHsgbWNuID0gKG1jdG1wLTEpLzg7IG1jdG1wICU9IDg7IH0gICAgICAgICAgICAgXAorICBzd2l0Y2ggKG1jdG1wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMDogZm9yKDs7KSB7ICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNzogICAgICAgICAgICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNjogICAgICAgICAgICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNTogICAgICAgICAgICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNDogICAgICAgICAgICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMzogICAgICAgICAgICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMjogICAgICAgICAgICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMTogICAgICAgICAgICptenArKyA9IDA7IGlmKG1jbiA8PSAwKSBicmVhazsgbWNuLS07IH0gICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIE1BTExPQ19DT1BZKGRlc3Qsc3JjLG5ieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1NJWkVfVCogbWNzcmMgPSAoSU5URVJOQUxfU0laRV9UKikgc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1NJWkVfVCogbWNkc3QgPSAoSU5URVJOQUxfU0laRV9UKikgZGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGxvbmcgbWN0bXAgPSAobmJ5dGVzKS9zaXplb2YoSU5URVJOQUxfU0laRV9UKSwgbWNuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChtY3RtcCA8IDgpIG1jbiA9IDA7IGVsc2UgeyBtY24gPSAobWN0bXAtMSkvODsgbWN0bXAgJT0gODsgfSAgICAgICAgICAgICBcCisgIHN3aXRjaCAobWN0bXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAwOiBmb3IoOzspIHsgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSA3OiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSA2OiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSA1OiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSA0OiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAzOiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAyOiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAxOiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgaWYobWNuIDw9IDApIGJyZWFrOyBtY24tLTsgfSAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKyNlbmRpZgorCisKKy8qCisgIERlZmluZSBIQVZFX01NQVAgdG8gb3B0aW9uYWxseSBtYWtlIG1hbGxvYygpIHVzZSBtbWFwKCkgdG8KKyAgYWxsb2NhdGUgdmVyeSBsYXJnZSBibG9ja3MuICBUaGVzZSB3aWxsIGJlIHJldHVybmVkIHRvIHRoZQorICBvcGVyYXRpbmcgc3lzdGVtIGltbWVkaWF0ZWx5IGFmdGVyIGEgZnJlZSgpLgorKi8KKworLyoqKgorI2lmbmRlZiBIQVZFX01NQVAKKyNkZWZpbmUgSEFWRV9NTUFQIDEKKyNlbmRpZgorKioqLworI3VuZGVmCUhBVkVfTU1BUAkvKiBOb3QgYXZhaWxhYmxlIGZvciBVLUJvb3QgKi8KKworLyoKKyAgRGVmaW5lIEhBVkVfTVJFTUFQIHRvIG1ha2UgcmVhbGxvYygpIHVzZSBtcmVtYXAoKSB0byByZS1hbGxvY2F0ZQorICBsYXJnZSBibG9ja3MuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHBvc3NpYmxlIG9uIExpbnV4IHdpdGgKKyAga2VybmVsIHZlcnNpb25zIG5ld2VyIHRoYW4gMS4zLjc3LgorKi8KKworLyoqKgorI2lmbmRlZiBIQVZFX01SRU1BUAorI2lmZGVmIElOVEVSTkFMX0xJTlVYX0NfTElCCisjZGVmaW5lIEhBVkVfTVJFTUFQIDEKKyNlbHNlCisjZGVmaW5lIEhBVkVfTVJFTUFQIDAKKyNlbmRpZgorI2VuZGlmCisqKiovCisjdW5kZWYJSEFWRV9NUkVNQVAJLyogTm90IGF2YWlsYWJsZSBmb3IgVS1Cb290ICovCisKKyNpZiBIQVZFX01NQVAKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2lmICFkZWZpbmVkKE1BUF9BTk9OWU1PVVMpICYmIGRlZmluZWQoTUFQX0FOT04pCisjZGVmaW5lIE1BUF9BTk9OWU1PVVMgTUFQX0FOT04KKyNlbmRpZgorCisjZW5kaWYgLyogSEFWRV9NTUFQICovCisKKy8qCisgIEFjY2VzcyB0byBzeXN0ZW0gcGFnZSBzaXplLiBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlLCB0aGlzIG1hbGxvYworICBtYW5hZ2VzIG1lbW9yeSBmcm9tIHRoZSBzeXN0ZW0gaW4gcGFnZS1zaXplIHVuaXRzLgorCisgIFRoZSBmb2xsb3dpbmcgbWVjaGFuaWNzIGZvciBnZXRwYWdlc2l6ZSB3ZXJlIGFkYXB0ZWQgZnJvbQorICBic2QvZ251IGdldHBhZ2VzaXplLmgKKyovCisKKyNkZWZpbmUJTEFDS1NfVU5JU1REX0gJLyogU2hvcnRjdXQgZm9yIFUtQm9vdCAqLworI2RlZmluZQltYWxsb2NfZ2V0cGFnZXNpemUJNDA5NgorCisjaWZuZGVmIExBQ0tTX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZuZGVmIG1hbGxvY19nZXRwYWdlc2l6ZQorIyAgaWZkZWYgX1NDX1BBR0VTSVpFICAgICAgICAgLyogc29tZSBTVlI0IHN5c3RlbXMgb21pdCBhbiB1bmRlcnNjb3JlICovCisjICAgIGlmbmRlZiBfU0NfUEFHRV9TSVpFCisjICAgICAgZGVmaW5lIF9TQ19QQUdFX1NJWkUgX1NDX1BBR0VTSVpFCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZkZWYgX1NDX1BBR0VfU0laRQorIyAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIHN5c2NvbmYoX1NDX1BBR0VfU0laRSkKKyMgIGVsc2UKKyMgICAgaWYgZGVmaW5lZChCU0QpIHx8IGRlZmluZWQoREdVWCkgfHwgZGVmaW5lZChIQVZFX0dFVFBBR0VTSVpFKQorICAgICAgIGV4dGVybiBzaXplX3QgZ2V0cGFnZXNpemUoKTsKKyMgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIGdldHBhZ2VzaXplKCkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFdJTjMyCisjICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplICg0MDk2KSAvKiBUQkQ6IFVzZSAnR2V0U3lzdGVtSW5mbycgaW5zdGVhZCAqLworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmbmRlZiBMQUNLU19TWVNfUEFSQU1fSAorIyAgICAgICAgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICAgICAgIGVuZGlmCisjICAgICAgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgRVhFQ19QQUdFU0laRQorIyAgICAgICAgZWxzZQorIyAgICAgICAgICBpZmRlZiBOQlBHCisjICAgICAgICAgICAgaWZuZGVmIENMU0laRQorIyAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBOQlBHCisjICAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSAoTkJQRyAqIENMU0laRSkKKyMgICAgICAgICAgICBlbmRpZgorIyAgICAgICAgICBlbHNlCisjICAgICAgICAgICAgaWZkZWYgTkJQQworIyAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBOQlBDCisjICAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBQQUdFU0laRQorIyAgICAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplICg0MDk2KSAvKiBqdXN0IGd1ZXNzICovCisjICAgICAgICAgICAgICBlbmRpZgorIyAgICAgICAgICAgIGVuZGlmCisjICAgICAgICAgIGVuZGlmCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKworLyoKKworICBUaGlzIHZlcnNpb24gb2YgbWFsbG9jIHN1cHBvcnRzIHRoZSBzdGFuZGFyZCBTVklEL1hQRyBtYWxsaW5mbworICByb3V0aW5lIHRoYXQgcmV0dXJucyBhIHN0cnVjdCBjb250YWluaW5nIHRoZSBzYW1lIGtpbmQgb2YKKyAgaW5mb3JtYXRpb24geW91IGNhbiBnZXQgZnJvbSBtYWxsb2Nfc3RhdHMuIEl0IHNob3VsZCB3b3JrIG9uCisgIGFueSBTVklEL1hQRyBjb21wbGlhbnQgc3lzdGVtIHRoYXQgaGFzIGEgL3Vzci9pbmNsdWRlL21hbGxvYy5oCisgIGRlZmluaW5nIHN0cnVjdCBtYWxsaW5mby4gKElmIHlvdSdkIGxpa2UgdG8gaW5zdGFsbCBzdWNoIGEgdGhpbmcKKyAgeW91cnNlbGYsIGN1dCBvdXQgdGhlIHByZWxpbWluYXJ5IGRlY2xhcmF0aW9ucyBhcyBkZXNjcmliZWQgYWJvdmUKKyAgYW5kIGJlbG93IGFuZCBzYXZlIHRoZW0gaW4gYSBtYWxsb2MuaCBmaWxlLiBCdXQgdGhlcmUncyBubworICBjb21wZWxsaW5nIHJlYXNvbiB0byBib3RoZXIgdG8gZG8gdGhpcy4pCisKKyAgVGhlIG1haW4gZGVjbGFyYXRpb24gbmVlZGVkIGlzIHRoZSBtYWxsaW5mbyBzdHJ1Y3QgdGhhdCBpcyByZXR1cm5lZAorICAoYnktY29weSkgYnkgbWFsbGluZm8oKS4gIFRoZSBTVklEL1hQRyBtYWxsb2luZm8gc3RydWN0IGNvbnRhaW5zIGEKKyAgYnVuY2ggb2YgZmllbGRzLCBtb3N0IG9mIHdoaWNoIGFyZSBub3QgZXZlbiBtZWFuaW5nZnVsIGluIHRoaXMKKyAgdmVyc2lvbiBvZiBtYWxsb2MuIFNvbWUgb2YgdGhlc2UgZmllbGRzIGFyZSBhcmUgaW5zdGVhZCBmaWxsZWQgYnkKKyAgbWFsbGluZm8oKSB3aXRoIG90aGVyIG51bWJlcnMgdGhhdCBtaWdodCBwb3NzaWJseSBiZSBvZiBpbnRlcmVzdC4KKworICBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19IIHNob3VsZCBiZSBzZXQgaWYgeW91IGhhdmUgYQorICAvdXNyL2luY2x1ZGUvbWFsbG9jLmggZmlsZSB0aGF0IGluY2x1ZGVzIGEgZGVjbGFyYXRpb24gb2Ygc3RydWN0CisgIG1hbGxpbmZvLiAgSWYgc28sIGl0IGlzIGluY2x1ZGVkOyBlbHNlIGFuIFNWSUQyL1hQRzIgY29tcGxpYW50CisgIHZlcnNpb24gaXMgZGVjbGFyZWQgYmVsb3cuICBUaGVzZSBtdXN0IGJlIHByZWNpc2VseSB0aGUgc2FtZSBmb3IKKyAgbWFsbGluZm8oKSB0byB3b3JrLgorCisqLworCisvKiAjZGVmaW5lIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggKi8KKworI2lmIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0gKKyNpbmNsdWRlICIvdXNyL2luY2x1ZGUvbWFsbG9jLmgiCisjZWxzZQorCisvKiBTVklEMi9YUEcgbWFsbGluZm8gc3RydWN0dXJlICovCisKK3N0cnVjdCBtYWxsaW5mbyB7CisgIGludCBhcmVuYTsgICAgLyogdG90YWwgc3BhY2UgYWxsb2NhdGVkIGZyb20gc3lzdGVtICovCisgIGludCBvcmRibGtzOyAgLyogbnVtYmVyIG9mIG5vbi1pbnVzZSBjaHVua3MgKi8KKyAgaW50IHNtYmxrczsgICAvKiB1bnVzZWQgLS0gYWx3YXlzIHplcm8gKi8KKyAgaW50IGhibGtzOyAgICAvKiBudW1iZXIgb2YgbW1hcHBlZCByZWdpb25zICovCisgIGludCBoYmxraGQ7ICAgLyogdG90YWwgc3BhY2UgaW4gbW1hcHBlZCByZWdpb25zICovCisgIGludCB1c21ibGtzOyAgLyogdW51c2VkIC0tIGFsd2F5cyB6ZXJvICovCisgIGludCBmc21ibGtzOyAgLyogdW51c2VkIC0tIGFsd2F5cyB6ZXJvICovCisgIGludCB1b3JkYmxrczsgLyogdG90YWwgYWxsb2NhdGVkIHNwYWNlICovCisgIGludCBmb3JkYmxrczsgLyogdG90YWwgbm9uLWludXNlIHNwYWNlICovCisgIGludCBrZWVwY29zdDsgLyogdG9wLW1vc3QsIHJlbGVhc2FibGUgKHZpYSBtYWxsb2NfdHJpbSkgc3BhY2UgKi8KK307CisKKy8qIFNWSUQyL1hQRyBtYWxsb3B0IG9wdGlvbnMgKi8KKworI2RlZmluZSBNX01YRkFTVCAgMSAgICAvKiBVTlVTRUQgaW4gdGhpcyBtYWxsb2MgKi8KKyNkZWZpbmUgTV9OTEJMS1MgIDIgICAgLyogVU5VU0VEIGluIHRoaXMgbWFsbG9jICovCisjZGVmaW5lIE1fR1JBSU4gICAzICAgIC8qIFVOVVNFRCBpbiB0aGlzIG1hbGxvYyAqLworI2RlZmluZSBNX0tFRVAgICAgNCAgICAvKiBVTlVTRUQgaW4gdGhpcyBtYWxsb2MgKi8KKworI2VuZGlmCisKKy8qIG1hbGxvcHQgb3B0aW9ucyB0aGF0IGFjdHVhbGx5IGRvIHNvbWV0aGluZyAqLworCisjZGVmaW5lIE1fVFJJTV9USFJFU0hPTEQgICAgLTEKKyNkZWZpbmUgTV9UT1BfUEFEICAgICAgICAgICAtMgorI2RlZmluZSBNX01NQVBfVEhSRVNIT0xEICAgIC0zCisjZGVmaW5lIE1fTU1BUF9NQVggICAgICAgICAgLTQKKworCisjaWZuZGVmIERFRkFVTFRfVFJJTV9USFJFU0hPTEQKKyNkZWZpbmUgREVGQVVMVF9UUklNX1RIUkVTSE9MRCAoMTI4ICogMTAyNCkKKyNlbmRpZgorCisvKgorICAgIE1fVFJJTV9USFJFU0hPTEQgaXMgdGhlIG1heGltdW0gYW1vdW50IG9mIHVudXNlZCB0b3AtbW9zdCBtZW1vcnkKKyAgICAgIHRvIGtlZXAgYmVmb3JlIHJlbGVhc2luZyB2aWEgbWFsbG9jX3RyaW0gaW4gZnJlZSgpLgorCisgICAgICBBdXRvbWF0aWMgdHJpbW1pbmcgaXMgbWFpbmx5IHVzZWZ1bCBpbiBsb25nLWxpdmVkIHByb2dyYW1zLgorICAgICAgQmVjYXVzZSB0cmltbWluZyB2aWEgc2JyayBjYW4gYmUgc2xvdyBvbiBzb21lIHN5c3RlbXMsIGFuZCBjYW4KKyAgICAgIHNvbWV0aW1lcyBiZSB3YXN0ZWZ1bCAoaW4gY2FzZXMgd2hlcmUgcHJvZ3JhbXMgaW1tZWRpYXRlbHkKKyAgICAgIGFmdGVyd2FyZCBhbGxvY2F0ZSBtb3JlIGxhcmdlIGNodW5rcykgdGhlIHZhbHVlIHNob3VsZCBiZSBoaWdoCisgICAgICBlbm91Z2ggc28gdGhhdCB5b3VyIG92ZXJhbGwgc3lzdGVtIHBlcmZvcm1hbmNlIHdvdWxkIGltcHJvdmUgYnkKKyAgICAgIHJlbGVhc2luZy4KKworICAgICAgVGhlIHRyaW0gdGhyZXNob2xkIGFuZCB0aGUgbW1hcCBjb250cm9sIHBhcmFtZXRlcnMgKHNlZSBiZWxvdykKKyAgICAgIGNhbiBiZSB0cmFkZWQgb2ZmIHdpdGggb25lIGFub3RoZXIuIFRyaW1taW5nIGFuZCBtbWFwcGluZyBhcmUKKyAgICAgIHR3byBkaWZmZXJlbnQgd2F5cyBvZiByZWxlYXNpbmcgdW51c2VkIG1lbW9yeSBiYWNrIHRvIHRoZQorICAgICAgc3lzdGVtLiBCZXR3ZWVuIHRoZXNlIHR3bywgaXQgaXMgb2Z0ZW4gcG9zc2libGUgdG8ga2VlcAorICAgICAgc3lzdGVtLWxldmVsIGRlbWFuZHMgb2YgYSBsb25nLWxpdmVkIHByb2dyYW0gZG93biB0byBhIGJhcmUKKyAgICAgIG1pbmltdW0uIEZvciBleGFtcGxlLCBpbiBvbmUgdGVzdCBzdWl0ZSBvZiBzZXNzaW9ucyBtZWFzdXJpbmcKKyAgICAgIHRoZSBYRjg2IFggc2VydmVyIG9uIExpbnV4LCB1c2luZyBhIHRyaW0gdGhyZXNob2xkIG9mIDEyOEsgYW5kIGEKKyAgICAgIG1tYXAgdGhyZXNob2xkIG9mIDE5MksgbGVkIHRvIG5lYXItbWluaW1hbCBsb25nIHRlcm0gcmVzb3VyY2UKKyAgICAgIGNvbnN1bXB0aW9uLgorCisgICAgICBJZiB5b3UgYXJlIHVzaW5nIHRoaXMgbWFsbG9jIGluIGEgbG9uZy1saXZlZCBwcm9ncmFtLCBpdCBzaG91bGQKKyAgICAgIHBheSB0byBleHBlcmltZW50IHdpdGggdGhlc2UgdmFsdWVzLiAgQXMgYSByb3VnaCBndWlkZSwgeW91CisgICAgICBtaWdodCBzZXQgdG8gYSB2YWx1ZSBjbG9zZSB0byB0aGUgYXZlcmFnZSBzaXplIG9mIGEgcHJvY2VzcworICAgICAgKHByb2dyYW0pIHJ1bm5pbmcgb24geW91ciBzeXN0ZW0uICBSZWxlYXNpbmcgdGhpcyBtdWNoIG1lbW9yeQorICAgICAgd291bGQgYWxsb3cgc3VjaCBhIHByb2Nlc3MgdG8gcnVuIGluIG1lbW9yeS4gIEdlbmVyYWxseSwgaXQncworICAgICAgd29ydGggaXQgdG8gdHVuZSBmb3IgdHJpbW1pbmcgcmF0aGVyIHRoYW0gbWVtb3J5IG1hcHBpbmcgd2hlbiBhCisgICAgICBwcm9ncmFtIHVuZGVyZ29lcyBwaGFzZXMgd2hlcmUgc2V2ZXJhbCBsYXJnZSBjaHVua3MgYXJlCisgICAgICBhbGxvY2F0ZWQgYW5kIHJlbGVhc2VkIGluIHdheXMgdGhhdCBjYW4gcmV1c2UgZWFjaCBvdGhlcidzCisgICAgICBzdG9yYWdlLCBwZXJoYXBzIG1peGVkIHdpdGggcGhhc2VzIHdoZXJlIHRoZXJlIGFyZSBubyBzdWNoCisgICAgICBjaHVua3MgYXQgYWxsLiAgQW5kIGluIHdlbGwtYmVoYXZlZCBsb25nLWxpdmVkIHByb2dyYW1zLAorICAgICAgY29udHJvbGxpbmcgcmVsZWFzZSBvZiBsYXJnZSBibG9ja3MgdmlhIHRyaW1taW5nIHZlcnN1cyBtYXBwaW5nCisgICAgICBpcyB1c3VhbGx5IGZhc3Rlci4KKworICAgICAgSG93ZXZlciwgaW4gbW9zdCBwcm9ncmFtcywgdGhlc2UgcGFyYW1ldGVycyBzZXJ2ZSBtYWlubHkgYXMKKyAgICAgIHByb3RlY3Rpb24gYWdhaW5zdCB0aGUgc3lzdGVtLWxldmVsIGVmZmVjdHMgb2YgY2FycnlpbmcgYXJvdW5kCisgICAgICBtYXNzaXZlIGFtb3VudHMgb2YgdW5uZWVkZWQgbWVtb3J5LiBTaW5jZSBmcmVxdWVudCBjYWxscyB0bworICAgICAgc2JyaywgbW1hcCwgYW5kIG11bm1hcCBvdGhlcndpc2UgZGVncmFkZSBwZXJmb3JtYW5jZSwgdGhlIGRlZmF1bHQKKyAgICAgIHBhcmFtZXRlcnMgYXJlIHNldCB0byByZWxhdGl2ZWx5IGhpZ2ggdmFsdWVzIHRoYXQgc2VydmUgb25seSBhcworICAgICAgc2FmZWd1YXJkcy4KKworICAgICAgVGhlIGRlZmF1bHQgdHJpbSB2YWx1ZSBpcyBoaWdoIGVub3VnaCB0byBjYXVzZSB0cmltbWluZyBvbmx5IGluCisgICAgICBmYWlybHkgZXh0cmVtZSAoYnkgY3VycmVudCBtZW1vcnkgY29uc3VtcHRpb24gc3RhbmRhcmRzKSBjYXNlcy4KKyAgICAgIEl0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHBhZ2Ugc2l6ZSB0byBoYXZlIGFueSB1c2VmdWwgZWZmZWN0LiAgVG8KKyAgICAgIGRpc2FibGUgdHJpbW1pbmcgY29tcGxldGVseSwgeW91IGNhbiBzZXQgdG8gKHVuc2lnbmVkIGxvbmcpKC0xKTsKKworCisqLworCisKKyNpZm5kZWYgREVGQVVMVF9UT1BfUEFECisjZGVmaW5lIERFRkFVTFRfVE9QX1BBRCAgICAgICAgKDApCisjZW5kaWYKKworLyoKKyAgICBNX1RPUF9QQUQgaXMgdGhlIGFtb3VudCBvZiBleHRyYSBgcGFkZGluZycgc3BhY2UgdG8gYWxsb2NhdGUgb3IKKyAgICAgIHJldGFpbiB3aGVuZXZlciBzYnJrIGlzIGNhbGxlZC4gSXQgaXMgdXNlZCBpbiB0d28gd2F5cyBpbnRlcm5hbGx5OgorCisgICAgICAqIFdoZW4gc2JyayBpcyBjYWxsZWQgdG8gZXh0ZW5kIHRoZSB0b3Agb2YgdGhlIGFyZW5hIHRvIHNhdGlzZnkKKwlhIG5ldyBtYWxsb2MgcmVxdWVzdCwgdGhpcyBtdWNoIHBhZGRpbmcgaXMgYWRkZWQgdG8gdGhlIHNicmsKKwlyZXF1ZXN0LgorCisgICAgICAqIFdoZW4gbWFsbG9jX3RyaW0gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBmcmVlKCksCisJaXQgaXMgdXNlZCBhcyB0aGUgYHBhZCcgYXJndW1lbnQuCisKKyAgICAgIEluIGJvdGggY2FzZXMsIHRoZSBhY3R1YWwgYW1vdW50IG9mIHBhZGRpbmcgaXMgcm91bmRlZAorICAgICAgc28gdGhhdCB0aGUgZW5kIG9mIHRoZSBhcmVuYSBpcyBhbHdheXMgYSBzeXN0ZW0gcGFnZSBib3VuZGFyeS4KKworICAgICAgVGhlIG1haW4gcmVhc29uIGZvciB1c2luZyBwYWRkaW5nIGlzIHRvIGF2b2lkIGNhbGxpbmcgc2JyayBzbworICAgICAgb2Z0ZW4uIEhhdmluZyBldmVuIGEgc21hbGwgcGFkIGdyZWF0bHkgcmVkdWNlcyB0aGUgbGlrZWxpaG9vZAorICAgICAgdGhhdCBuZWFybHkgZXZlcnkgbWFsbG9jIHJlcXVlc3QgZHVyaW5nIHByb2dyYW0gc3RhcnQtdXAgKG9yCisgICAgICBhZnRlciB0cmltbWluZykgd2lsbCBpbnZva2Ugc2Jyaywgd2hpY2ggbmVlZGxlc3NseSB3YXN0ZXMKKyAgICAgIHRpbWUuCisKKyAgICAgIEF1dG9tYXRpYyByb3VuZGluZy11cCB0byBwYWdlLXNpemUgdW5pdHMgaXMgbm9ybWFsbHkgc3VmZmljaWVudAorICAgICAgdG8gYXZvaWQgbWVhc3VyYWJsZSBvdmVyaGVhZCwgc28gdGhlIGRlZmF1bHQgaXMgMC4gIEhvd2V2ZXIsIGluCisgICAgICBzeXN0ZW1zIHdoZXJlIHNicmsgaXMgcmVsYXRpdmVseSBzbG93LCBpdCBjYW4gcGF5IHRvIGluY3JlYXNlCisgICAgICB0aGlzIHZhbHVlLCBhdCB0aGUgZXhwZW5zZSBvZiBjYXJyeWluZyBhcm91bmQgbW9yZSBtZW1vcnkgdGhhbgorICAgICAgdGhlIHByb2dyYW0gbmVlZHMuCisKKyovCisKKworI2lmbmRlZiBERUZBVUxUX01NQVBfVEhSRVNIT0xECisjZGVmaW5lIERFRkFVTFRfTU1BUF9USFJFU0hPTEQgKDEyOCAqIDEwMjQpCisjZW5kaWYKKworLyoKKworICAgIE1fTU1BUF9USFJFU0hPTEQgaXMgdGhlIHJlcXVlc3Qgc2l6ZSB0aHJlc2hvbGQgZm9yIHVzaW5nIG1tYXAoKQorICAgICAgdG8gc2VydmljZSBhIHJlcXVlc3QuIFJlcXVlc3RzIG9mIGF0IGxlYXN0IHRoaXMgc2l6ZSB0aGF0IGNhbm5vdAorICAgICAgYmUgYWxsb2NhdGVkIHVzaW5nIGFscmVhZHktZXhpc3Rpbmcgc3BhY2Ugd2lsbCBiZSBzZXJ2aWNlZCB2aWEgbW1hcC4KKyAgICAgIChJZiBlbm91Z2ggbm9ybWFsIGZyZWVkIHNwYWNlIGFscmVhZHkgZXhpc3RzIGl0IGlzIHVzZWQgaW5zdGVhZC4pCisKKyAgICAgIFVzaW5nIG1tYXAgc2VncmVnYXRlcyByZWxhdGl2ZWx5IGxhcmdlIGNodW5rcyBvZiBtZW1vcnkgc28gdGhhdAorICAgICAgdGhleSBjYW4gYmUgaW5kaXZpZHVhbGx5IG9idGFpbmVkIGFuZCByZWxlYXNlZCBmcm9tIHRoZSBob3N0CisgICAgICBzeXN0ZW0uIEEgcmVxdWVzdCBzZXJ2aWNlZCB0aHJvdWdoIG1tYXAgaXMgbmV2ZXIgcmV1c2VkIGJ5IGFueQorICAgICAgb3RoZXIgcmVxdWVzdCAoYXQgbGVhc3Qgbm90IGRpcmVjdGx5OyB0aGUgc3lzdGVtIG1heSBqdXN0IHNvCisgICAgICBoYXBwZW4gdG8gcmVtYXAgc3VjY2Vzc2l2ZSByZXF1ZXN0cyB0byB0aGUgc2FtZSBsb2NhdGlvbnMpLgorCisgICAgICBTZWdyZWdhdGluZyBzcGFjZSBpbiB0aGlzIHdheSBoYXMgdGhlIGJlbmVmaXQgdGhhdCBtbWFwcGVkIHNwYWNlCisgICAgICBjYW4gQUxXQVlTIGJlIGluZGl2aWR1YWxseSByZWxlYXNlZCBiYWNrIHRvIHRoZSBzeXN0ZW0sIHdoaWNoCisgICAgICBoZWxwcyBrZWVwIHRoZSBzeXN0ZW0gbGV2ZWwgbWVtb3J5IGRlbWFuZHMgb2YgYSBsb25nLWxpdmVkCisgICAgICBwcm9ncmFtIGxvdy4gTWFwcGVkIG1lbW9yeSBjYW4gbmV2ZXIgYmVjb21lIGBsb2NrZWQnIGJldHdlZW4KKyAgICAgIG90aGVyIGNodW5rcywgYXMgY2FuIGhhcHBlbiB3aXRoIG5vcm1hbGx5IGFsbG9jYXRlZCBjaHVua3MsIHdoaWNoCisgICAgICBtZW5hcyB0aGF0IGV2ZW4gdHJpbW1pbmcgdmlhIG1hbGxvY190cmltIHdvdWxkIG5vdCByZWxlYXNlIHRoZW0uCisKKyAgICAgIEhvd2V2ZXIsIGl0IGhhcyB0aGUgZGlzYWR2YW50YWdlcyB0aGF0OgorCisJIDEuIFRoZSBzcGFjZSBjYW5ub3QgYmUgcmVjbGFpbWVkLCBjb25zb2xpZGF0ZWQsIGFuZCB0aGVuCisJICAgIHVzZWQgdG8gc2VydmljZSBsYXRlciByZXF1ZXN0cywgYXMgaGFwcGVucyB3aXRoIG5vcm1hbCBjaHVua3MuCisJIDIuIEl0IGNhbiBsZWFkIHRvIG1vcmUgd2FzdGFnZSBiZWNhdXNlIG9mIG1tYXAgcGFnZSBhbGlnbm1lbnQKKwkgICAgcmVxdWlyZW1lbnRzCisJIDMuIEl0IGNhdXNlcyBtYWxsb2MgcGVyZm9ybWFuY2UgdG8gYmUgbW9yZSBkZXBlbmRlbnQgb24gaG9zdAorCSAgICBzeXN0ZW0gbWVtb3J5IG1hbmFnZW1lbnQgc3VwcG9ydCByb3V0aW5lcyB3aGljaCBtYXkgdmFyeSBpbgorCSAgICBpbXBsZW1lbnRhdGlvbiBxdWFsaXR5IGFuZCBtYXkgaW1wb3NlIGFyYml0cmFyeQorCSAgICBsaW1pdGF0aW9ucy4gR2VuZXJhbGx5LCBzZXJ2aWNpbmcgYSByZXF1ZXN0IHZpYSBub3JtYWwKKwkgICAgbWFsbG9jIHN0ZXBzIGlzIGZhc3RlciB0aGFuIGdvaW5nIHRocm91Z2ggYSBzeXN0ZW0ncyBtbWFwLgorCisgICAgICBBbGwgdG9nZXRoZXIsIHRoZXNlIGNvbnNpZGVyYXRpb25zIHNob3VsZCBsZWFkIHlvdSB0byB1c2UgbW1hcAorICAgICAgb25seSBmb3IgcmVsYXRpdmVseSBsYXJnZSByZXF1ZXN0cy4KKworCisqLworCisKKyNpZm5kZWYgREVGQVVMVF9NTUFQX01BWAorI2lmIEhBVkVfTU1BUAorI2RlZmluZSBERUZBVUxUX01NQVBfTUFYICAgICAgICg2NCkKKyNlbHNlCisjZGVmaW5lIERFRkFVTFRfTU1BUF9NQVggICAgICAgKDApCisjZW5kaWYKKyNlbmRpZgorCisvKgorICAgIE1fTU1BUF9NQVggaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIHRvIHNpbXVsdGFuZW91c2x5CisgICAgICBzZXJ2aWNlIHVzaW5nIG1tYXAuIFRoaXMgcGFyYW1ldGVyIGV4aXN0cyBiZWNhdXNlOgorCisJIDEuIFNvbWUgc3lzdGVtcyBoYXZlIGEgbGltaXRlZCBudW1iZXIgb2YgaW50ZXJuYWwgdGFibGVzIGZvcgorCSAgICB1c2UgYnkgbW1hcC4KKwkgMi4gSW4gbW9zdCBzeXN0ZW1zLCBvdmVycmVsaWFuY2Ugb24gbW1hcCBjYW4gZGVncmFkZSBvdmVyYWxsCisJICAgIHBlcmZvcm1hbmNlLgorCSAzLiBJZiBhIHByb2dyYW0gYWxsb2NhdGVzIG1hbnkgbGFyZ2UgcmVnaW9ucywgaXQgaXMgcHJvYmFibHkKKwkgICAgYmV0dGVyIG9mZiB1c2luZyBub3JtYWwgc2Jyay1iYXNlZCBhbGxvY2F0aW9uIHJvdXRpbmVzIHRoYXQKKwkgICAgY2FuIHJlY2xhaW0gYW5kIHJlYWxsb2NhdGUgbm9ybWFsIGhlYXAgbWVtb3J5LiBVc2luZyBhCisJICAgIHNtYWxsIHZhbHVlIGFsbG93cyB0cmFuc2l0aW9uIGludG8gdGhpcyBtb2RlIGFmdGVyIHRoZQorCSAgICBmaXJzdCBmZXcgYWxsb2NhdGlvbnMuCisKKyAgICAgIFNldHRpbmcgdG8gMCBkaXNhYmxlcyBhbGwgdXNlIG9mIG1tYXAuICBJZiBIQVZFX01NQVAgaXMgbm90IHNldCwKKyAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDAsIGFuZCBhdHRlbXB0cyB0byBzZXQgaXQgdG8gbm9uLXplcm8gdmFsdWVzCisgICAgICBpbiBtYWxsb3B0IHdpbGwgZmFpbC4KKyovCisKKworLyoKKyAgICBVU0VfRExfUFJFRklYIHdpbGwgcHJlZml4IGFsbCBwdWJsaWMgcm91dGluZXMgd2l0aCB0aGUgc3RyaW5nICdkbCcuCisgICAgICBVc2VmdWwgdG8gcXVpY2tseSBhdm9pZCBwcm9jZWR1cmUgZGVjbGFyYXRpb24gY29uZmxpY3RzIGFuZCBsaW5rZXIKKyAgICAgIHN5bWJvbCBjb25mbGljdHMgd2l0aCBleGlzdGluZyBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4KKworKi8KKworLyogI2RlZmluZSBVU0VfRExfUFJFRklYICovCisKKworLyoKKworICBTcGVjaWFsIGRlZmluZXMgZm9yIGxpbnV4IGxpYmMKKworICBFeGNlcHQgd2hlbiBjb21waWxlZCB1c2luZyB0aGVzZSBzcGVjaWFsIGRlZmluZXMgZm9yIExpbnV4IGxpYmMKKyAgdXNpbmcgd2VhayBhbGlhc2VzLCB0aGlzIG1hbGxvYyBpcyBOT1QgZGVzaWduZWQgdG8gd29yayBpbgorICBtdWx0aXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gIE5vIHNlbWFwaG9yZXMgb3Igb3RoZXIgY29uY3VycmVuY3kKKyAgY29udHJvbCBhcmUgcHJvdmlkZWQgdG8gZW5zdXJlIHRoYXQgbXVsdGlwbGUgbWFsbG9jIG9yIGZyZWUgY2FsbHMKKyAgZG9uJ3QgcnVuIGF0IHRoZSBzYW1lIHRpbWUsIHdoaWNoIGNvdWxkIGJlIGRpc2FzdGVyb3VzLiBBIHNpbmdsZQorICBzZW1hcGhvcmUgY291bGQgYmUgdXNlZCBhY3Jvc3MgbWFsbG9jLCByZWFsbG9jLCBhbmQgZnJlZSAod2hpY2ggaXMKKyAgZXNzZW50aWFsbHkgdGhlIGVmZmVjdCBvZiB0aGUgbGludXggd2VhayBhbGlhcyBhcHByb2FjaCkuIEl0IHdvdWxkCisgIGJlIGhhcmQgdG8gb2J0YWluIGZpbmVyIGdyYW51bGFyaXR5LgorCisqLworCisKKyNpZmRlZiBJTlRFUk5BTF9MSU5VWF9DX0xJQgorCisjaWYgX19TVERfQworCitWb2lkX3QgKiBfX2RlZmF1bHRfbW9yZWNvcmVfaW5pdCAocHRyZGlmZl90KTsKK1ZvaWRfdCAqKCpfX21vcmVjb3JlKShwdHJkaWZmX3QpID0gX19kZWZhdWx0X21vcmVjb3JlX2luaXQ7CisKKyNlbHNlCisKK1ZvaWRfdCAqIF9fZGVmYXVsdF9tb3JlY29yZV9pbml0ICgpOworVm9pZF90ICooKl9fbW9yZWNvcmUpKCkgPSBfX2RlZmF1bHRfbW9yZWNvcmVfaW5pdDsKKworI2VuZGlmCisKKyNkZWZpbmUgTU9SRUNPUkUgKCpfX21vcmVjb3JlKQorI2RlZmluZSBNT1JFQ09SRV9GQUlMVVJFIDAKKyNkZWZpbmUgTU9SRUNPUkVfQ0xFQVJTIDEKKworI2Vsc2UgLyogSU5URVJOQUxfTElOVVhfQ19MSUIgKi8KKworI2lmIF9fU1REX0MKK2V4dGVybiBWb2lkX3QqICAgICBzYnJrKHB0cmRpZmZfdCk7CisjZWxzZQorZXh0ZXJuIFZvaWRfdCogICAgIHNicmsoKTsKKyNlbmRpZgorCisjaWZuZGVmIE1PUkVDT1JFCisjZGVmaW5lIE1PUkVDT1JFIHNicmsKKyNlbmRpZgorCisjaWZuZGVmIE1PUkVDT1JFX0ZBSUxVUkUKKyNkZWZpbmUgTU9SRUNPUkVfRkFJTFVSRSAtMQorI2VuZGlmCisKKyNpZm5kZWYgTU9SRUNPUkVfQ0xFQVJTCisjZGVmaW5lIE1PUkVDT1JFX0NMRUFSUyAxCisjZW5kaWYKKworI2VuZGlmIC8qIElOVEVSTkFMX0xJTlVYX0NfTElCICovCisKKyNpZiBkZWZpbmVkKElOVEVSTkFMX0xJTlVYX0NfTElCKSAmJiBkZWZpbmVkKF9fRUxGX18pCisKKyNkZWZpbmUgY0FMTE9jCQlfX2xpYmNfY2FsbG9jCisjZGVmaW5lIGZSRWUJCV9fbGliY19mcmVlCisjZGVmaW5lIG1BTExPYwkJX19saWJjX21hbGxvYworI2RlZmluZSBtRU1BTElHbglfX2xpYmNfbWVtYWxpZ24KKyNkZWZpbmUgckVBTExPYwkJX19saWJjX3JlYWxsb2MKKyNkZWZpbmUgdkFMTE9jCQlfX2xpYmNfdmFsbG9jCisjZGVmaW5lIHB2QUxMT2MJCV9fbGliY19wdmFsbG9jCisjZGVmaW5lIG1BTExJTkZvCV9fbGliY19tYWxsaW5mbworI2RlZmluZSBtQUxMT1B0CQlfX2xpYmNfbWFsbG9wdAorCisjcHJhZ21hIHdlYWsgY2FsbG9jID0gX19saWJjX2NhbGxvYworI3ByYWdtYSB3ZWFrIGZyZWUgPSBfX2xpYmNfZnJlZQorI3ByYWdtYSB3ZWFrIGNmcmVlID0gX19saWJjX2ZyZWUKKyNwcmFnbWEgd2VhayBtYWxsb2MgPSBfX2xpYmNfbWFsbG9jCisjcHJhZ21hIHdlYWsgbWVtYWxpZ24gPSBfX2xpYmNfbWVtYWxpZ24KKyNwcmFnbWEgd2VhayByZWFsbG9jID0gX19saWJjX3JlYWxsb2MKKyNwcmFnbWEgd2VhayB2YWxsb2MgPSBfX2xpYmNfdmFsbG9jCisjcHJhZ21hIHdlYWsgcHZhbGxvYyA9IF9fbGliY19wdmFsbG9jCisjcHJhZ21hIHdlYWsgbWFsbGluZm8gPSBfX2xpYmNfbWFsbGluZm8KKyNwcmFnbWEgd2VhayBtYWxsb3B0ID0gX19saWJjX21hbGxvcHQKKworI2Vsc2UKKworI2lmZGVmIFVTRV9ETF9QUkVGSVgKKyNkZWZpbmUgY0FMTE9jCQlkbGNhbGxvYworI2RlZmluZSBmUkVlCQlkbGZyZWUKKyNkZWZpbmUgbUFMTE9jCQlkbG1hbGxvYworI2RlZmluZSBtRU1BTElHbglkbG1lbWFsaWduCisjZGVmaW5lIHJFQUxMT2MJCWRscmVhbGxvYworI2RlZmluZSB2QUxMT2MJCWRsdmFsbG9jCisjZGVmaW5lIHB2QUxMT2MJCWRscHZhbGxvYworI2RlZmluZSBtQUxMSU5GbwlkbG1hbGxpbmZvCisjZGVmaW5lIG1BTExPUHQJCWRsbWFsbG9wdAorI2Vsc2UgLyogVVNFX0RMX1BSRUZJWCAqLworI2RlZmluZSBjQUxMT2MJCWNhbGxvYworI2RlZmluZSBmUkVlCQlmcmVlCisjZGVmaW5lIG1BTExPYwkJbWFsbG9jCisjZGVmaW5lIG1FTUFMSUduCW1lbWFsaWduCisjZGVmaW5lIHJFQUxMT2MJCXJlYWxsb2MKKyNkZWZpbmUgdkFMTE9jCQl2YWxsb2MKKyNkZWZpbmUgcHZBTExPYwkJcHZhbGxvYworI2RlZmluZSBtQUxMSU5GbwltYWxsaW5mbworI2RlZmluZSBtQUxMT1B0CQltYWxsb3B0CisjZW5kaWYgLyogVVNFX0RMX1BSRUZJWCAqLworCisjZW5kaWYKKworLyogUHVibGljIHJvdXRpbmVzICovCisKKyNpZiBfX1NURF9DCisKK1ZvaWRfdCogbUFMTE9jKHNpemVfdCk7Cit2b2lkICAgIGZSRWUoVm9pZF90Kik7CitWb2lkX3QqIHJFQUxMT2MoVm9pZF90Kiwgc2l6ZV90KTsKK1ZvaWRfdCogbUVNQUxJR24oc2l6ZV90LCBzaXplX3QpOworVm9pZF90KiB2QUxMT2Moc2l6ZV90KTsKK1ZvaWRfdCogcHZBTExPYyhzaXplX3QpOworVm9pZF90KiBjQUxMT2Moc2l6ZV90LCBzaXplX3QpOwordm9pZCAgICBjZnJlZShWb2lkX3QqKTsKK2ludCAgICAgbWFsbG9jX3RyaW0oc2l6ZV90KTsKK3NpemVfdCAgbWFsbG9jX3VzYWJsZV9zaXplKFZvaWRfdCopOwordm9pZCAgICBtYWxsb2Nfc3RhdHModm9pZCk7CitpbnQgICAgIG1BTExPUHQoaW50LCBpbnQpOworc3RydWN0IG1hbGxpbmZvIG1BTExJTkZvKHZvaWQpOworI2Vsc2UKK1ZvaWRfdCogbUFMTE9jKCk7Cit2b2lkICAgIGZSRWUoKTsKK1ZvaWRfdCogckVBTExPYygpOworVm9pZF90KiBtRU1BTElHbigpOworVm9pZF90KiB2QUxMT2MoKTsKK1ZvaWRfdCogcHZBTExPYygpOworVm9pZF90KiBjQUxMT2MoKTsKK3ZvaWQgICAgY2ZyZWUoKTsKK2ludCAgICAgbWFsbG9jX3RyaW0oKTsKK3NpemVfdCAgbWFsbG9jX3VzYWJsZV9zaXplKCk7Cit2b2lkICAgIG1hbGxvY19zdGF0cygpOworaW50ICAgICBtQUxMT1B0KCk7CitzdHJ1Y3QgbWFsbGluZm8gbUFMTElORm8oKTsKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgIC8qIGVuZCBvZiBleHRlcm4gIkMiICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbW1jLmggYi94LWxvYWRlci9pbmNsdWRlL21tYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MmE5MDcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL21tYy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9NTUNfSF8KKyNkZWZpbmUgX01NQ19IXworCisjaW5jbHVkZSA8cGFydC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvbW1jLmg+CisKK2ludCBtbWNfaW5pdChpbnQgdmVyYm9zZSk7CitpbnQgbW1jX3JlYWQodW5zaWduZWQgaW50IHNyYywgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc2l6ZSk7CitpbnQgbW1jX3dyaXRlKHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgbG9uZyBkc3QsIGludCBzaXplKTsKK2ludCBtbWMyaW5mbyh1bnNpZ25lZCBpbnQgYWRkcik7CisKK2Jsb2NrX2Rldl9kZXNjX3QgKm1tY19nZXRfZGV2KGludCBkZXYpOworCisjZW5kaWYgLyogX01NQ19IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9uczE2NTUwLmggYi94LWxvYWRlci9pbmNsdWRlL25zMTY1NTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQyZDQwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9uczE2NTUwLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKlRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqICAKKyAqIE5TMTY1NTAgU2VyaWFsIFBvcnQKKyAqIG9yaWdpbmFsbHkgZnJvbSBsaW51eCBzb3VyY2UgKGFyY2gvcHBjL2Jvb3QvbnMxNjU1MC5oKQorICogbW9kaWZpZWQgc2xpZ2h0bHkgdG8KKyAqIGhhdmUgYWRkcmVzc2VzIGFzIG9mZnNldHMgZnJvbSBDRkdfSVNBX0JBU0UKKyAqIGFkZGVkIGEgZmV3IG1vcmUgZGVmaW5pdGlvbnMKKyAqIGFkZGVkIHByb3RvdHlwZXMgZm9yIG5zMTY1NTAuYworICogcmVkdWNlZCBubyBvZiBjb20gcG9ydHMgdG8gMgorICogbW9kaWZpY2F0aW9ucyAoYykgUm9iIFRheWxvciwgRmx5aW5nIFBpZyBTeXN0ZW1zLiAyMDAwLgorICovCisKKyNpZiAoQ0ZHX05TMTY1NTBfUkVHX1NJWkUgPT0gMSkKK3N0cnVjdCBOUzE2NTUwIHsKKwl1bnNpZ25lZCBjaGFyIHJicjsJCS8qIDAgKi8KKwl1bnNpZ25lZCBjaGFyIGllcjsJCS8qIDEgKi8KKwl1bnNpZ25lZCBjaGFyIGZjcjsJCS8qIDIgKi8KKwl1bnNpZ25lZCBjaGFyIGxjcjsJCS8qIDMgKi8KKwl1bnNpZ25lZCBjaGFyIG1jcjsJCS8qIDQgKi8KKwl1bnNpZ25lZCBjaGFyIGxzcjsJCS8qIDUgKi8KKwl1bnNpZ25lZCBjaGFyIG1zcjsJCS8qIDYgKi8KKwl1bnNpZ25lZCBjaGFyIHNjcjsJCS8qIDcgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworI2VsaWYgKENGR19OUzE2NTUwX1JFR19TSVpFID09IDIpCitzdHJ1Y3QgTlMxNjU1MCB7CisJdW5zaWduZWQgc2hvcnQgcmJyOwkJLyogMCAqLworCXVuc2lnbmVkIHNob3J0IGllcjsJCS8qIDEgKi8KKwl1bnNpZ25lZCBzaG9ydCBmY3I7CQkvKiAyICovCisJdW5zaWduZWQgc2hvcnQgbGNyOwkJLyogMyAqLworCXVuc2lnbmVkIHNob3J0IG1jcjsJCS8qIDQgKi8KKwl1bnNpZ25lZCBzaG9ydCBsc3I7CQkvKiA1ICovCisJdW5zaWduZWQgc2hvcnQgbXNyOwkJLyogNiAqLworCXVuc2lnbmVkIHNob3J0IHNjcjsJCS8qIDcgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworI2VsaWYgKENGR19OUzE2NTUwX1JFR19TSVpFID09IDQpCitzdHJ1Y3QgTlMxNjU1MCB7CisJdW5zaWduZWQgbG9uZyByYnI7CQkvKiAwICovCisJdW5zaWduZWQgbG9uZyBpZXI7CQkvKiAxICovCisJdW5zaWduZWQgbG9uZyBmY3I7CQkvKiAyICovCisJdW5zaWduZWQgbG9uZyBsY3I7CQkvKiAzICovCisJdW5zaWduZWQgbG9uZyBtY3I7CQkvKiA0ICovCisJdW5zaWduZWQgbG9uZyBsc3I7CQkvKiA1ICovCisJdW5zaWduZWQgbG9uZyBtc3I7CQkvKiA2ICovCisJdW5zaWduZWQgbG9uZyBzY3I7CQkvKiA3ICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyNlbGlmIChDRkdfTlMxNjU1MF9SRUdfU0laRSA9PSAtNCkKK3N0cnVjdCBOUzE2NTUwIHsKKwl1bnNpZ25lZCBjaGFyIHJicjsJCS8qIDAgKi8KKwlpbnQgcGFkMToyNDsKKwl1bnNpZ25lZCBjaGFyIGllcjsJCS8qIDEgKi8KKwlpbnQgcGFkMjoyNDsKKwl1bnNpZ25lZCBjaGFyIGZjcjsJCS8qIDIgKi8KKwlpbnQgcGFkMzoyNDsKKwl1bnNpZ25lZCBjaGFyIGxjcjsJCS8qIDMgKi8KKwlpbnQgcGFkNDoyNDsKKwl1bnNpZ25lZCBjaGFyIG1jcjsJCS8qIDQgKi8KKwlpbnQgcGFkNToyNDsKKwl1bnNpZ25lZCBjaGFyIGxzcjsJCS8qIDUgKi8KKwlpbnQgcGFkNjoyNDsKKwl1bnNpZ25lZCBjaGFyIG1zcjsJCS8qIDYgKi8KKwlpbnQgcGFkNzoyNDsKKwl1bnNpZ25lZCBjaGFyIHNjcjsJCS8qIDcgKi8KKwlpbnQgcGFkODoyNDsKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQKQorCXVuc2lnbmVkIGNoYXIgbWRyMTsJCS8qIG1vZGUgc2VsZWN0IHJlc2V0IFRMMTZDNzUwKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19PTUFQMTUxMAorCWludCBwYWQ5OjI0OworCXVuc2lnbmVkIGxvbmcgcGFkWzEwXTsKKwl1bnNpZ25lZCBjaGFyIG9zY18xMm1fc2VsOworCWludCBwYWQxMDoyNDsKKyNlbmRpZgorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZGVmaW5lIE5TMTY1NTAgcmVnaXN0ZXJzIHNpemUuIgorI2VuZGlmCisKKyNkZWZpbmUgdGhyIHJicgorI2RlZmluZSBpaXIgZmNyCisjZGVmaW5lIGRsbCByYnIKKyNkZWZpbmUgZGxtIGllcgorCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBOUzE2NTUwICpOUzE2NTUwX3Q7CisKKyNkZWZpbmUgRkNSX0ZJRk9fRU4gICAgIDB4MDEJCS8qIEZpZm8gZW5hYmxlICovCisjZGVmaW5lIEZDUl9SWFNSICAgICAgICAweDAyCQkvKiBSZWNlaXZlciBzb2Z0IHJlc2V0ICovCisjZGVmaW5lIEZDUl9UWFNSICAgICAgICAweDA0CQkvKiBUcmFuc21pdHRlciBzb2Z0IHJlc2V0ICovCisKKyNkZWZpbmUgTUNSX0RUUiAgICAgICAgIDB4MDEKKyNkZWZpbmUgTUNSX1JUUyAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUNSX0RNQV9FTiAgICAgIDB4MDQKKyNkZWZpbmUgTUNSX1RYX0RGUiAgICAgIDB4MDgKKworI2RlZmluZSBMQ1JfV0xTX01TSwkweDAzCQkvKiBjaGFyYWN0ZXIgbGVuZ3RoIHNsZWN0IG1hc2sgKi8KKyNkZWZpbmUgTENSX1dMU181CTB4MDAJCS8qIDUgYml0IGNoYXJhY3RlciBsZW5ndGggKi8KKyNkZWZpbmUgTENSX1dMU182CTB4MDEJCS8qIDYgYml0IGNoYXJhY3RlciBsZW5ndGggKi8KKyNkZWZpbmUgTENSX1dMU183CTB4MDIJCS8qIDcgYml0IGNoYXJhY3RlciBsZW5ndGggKi8KKyNkZWZpbmUgTENSX1dMU184CTB4MDMJCS8qIDggYml0IGNoYXJhY3RlciBsZW5ndGggKi8KKyNkZWZpbmUgTENSX1NUQgkJMHgwNAkJLyogTnVtYmVyIG9mIHN0b3AgQml0cywgb2ZmID0gMSwgb24gPSAxLjUgb3IgMikgKi8KKyNkZWZpbmUgTENSX1BFTgkJMHgwOAkJLyogUGFyaXR5IGVuZWJsZSAqLworI2RlZmluZSBMQ1JfRVBTCQkweDEwCQkvKiBFdmVuIFBhcml0eSBTZWxlY3QgKi8KKyNkZWZpbmUgTENSX1NUS1AJMHgyMAkJLyogU3RpY2sgUGFyaXR5ICovCisjZGVmaW5lIExDUl9TQlJLCTB4NDAJCS8qIFNldCBCcmVhayAqLworI2RlZmluZSBMQ1JfQktTRQkweDgwCQkvKiBCYW5rIHNlbGVjdCBlbmFibGUgKi8KKworI2RlZmluZSBMU1JfRFIJCTB4MDEJCS8qIERhdGEgcmVhZHkgKi8KKyNkZWZpbmUgTFNSX09FCQkweDAyCQkvKiBPdmVycnVuICovCisjZGVmaW5lIExTUl9QRQkJMHgwNAkJLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lIExTUl9GRQkJMHgwOAkJLyogRnJhbWluZyBlcnJvciAqLworI2RlZmluZSBMU1JfQkkJCTB4MTAJCS8qIEJyZWFrICovCisjZGVmaW5lIExTUl9USFJFCTB4MjAJCS8qIFhtaXQgaG9sZGluZyByZWdpc3RlciBlbXB0eSAqLworI2RlZmluZSBMU1JfVEVNVAkweDQwCQkvKiBYbWl0dGVyIGVtcHR5ICovCisjZGVmaW5lIExTUl9FUlIJCTB4ODAJCS8qIEVycm9yICovCisKKyNpZmRlZiBDT05GSUdfT01BUDE1MTAKKyNkZWZpbmUgT1NDXzEyTV9TRUwJMHgwMQkJLyogc2VsZWN0cyA2LjUgKiBjdXJyZW50IGNsayBkaXYgKi8KKyNlbmRpZgorCisvKiB1c2VmdWwgZGVmYXVsdHMgZm9yIExDUiAqLworI2RlZmluZSBMQ1JfOE4xCQkweDAzCisKK3ZvaWQJTlMxNjU1MF9pbml0ICAgKE5TMTY1NTBfdCBjb21fcG9ydCwgaW50IGJhdWRfZGl2aXNvcik7Cit2b2lkCU5TMTY1NTBfcHV0YyAgIChOUzE2NTUwX3QgY29tX3BvcnQsIGNoYXIgYyk7CitjaGFyCU5TMTY1NTBfZ2V0YyAgIChOUzE2NTUwX3QgY29tX3BvcnQpOworaW50CU5TMTY1NTBfdHN0YyAgIChOUzE2NTUwX3QgY29tX3BvcnQpOwordm9pZAlOUzE2NTUwX3JlaW5pdCAoTlMxNjU1MF90IGNvbV9wb3J0LCBpbnQgYmF1ZF9kaXZpc29yKTsKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvcGFydC5oIGIveC1sb2FkZXIvaW5jbHVkZS9wYXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4YWEzYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvcGFydC5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDQKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX1BBUlRfSAorI2RlZmluZSBfUEFSVF9ICisjaW5jbHVkZSA8aWRlLmg+CisKK3R5cGVkZWYgc3RydWN0IGJsb2NrX2Rldl9kZXNjIHsKKwlpbnQJCWlmX3R5cGU7CS8qIHR5cGUgb2YgdGhlIGludGVyZmFjZSAqLworCWludAkgICAgICAgIGRldjsJICAJLyogZGV2aWNlIG51bWJlciAqLworCXVuc2lnbmVkIGNoYXIJcGFydF90eXBlOyAgCS8qIHBhcnRpdGlvbiB0eXBlICovCisJdW5zaWduZWQgY2hhcgl0YXJnZXQ7CQkvKiB0YXJnZXQgU0NTSSBJRCAqLworCXVuc2lnbmVkIGNoYXIJbHVuOwkJLyogdGFyZ2V0IExVTiAqLworCXVuc2lnbmVkIGNoYXIJdHlwZTsJCS8qIGRldmljZSB0eXBlICovCisJdW5zaWduZWQgY2hhcglyZW1vdmFibGU7CS8qIHJlbW92YWJsZSBkZXZpY2UgKi8KKyNpZmRlZiBDT05GSUdfTEJBNDgKKwl1bnNpZ25lZCBjaGFyCWxiYTQ4OwkJLyogZGV2aWNlIGNhbiB1c2UgNDhiaXQgYWRkciAoQVRBL0FUQVBJIHY3KSAqLworI2VuZGlmCisJbGJhaW50X3QJCWxiYTsJICAJLyogbnVtYmVyIG9mIGJsb2NrcyAqLworCXVuc2lnbmVkIGxvbmcJYmxrc3o7CQkvKiBibG9jayBzaXplICovCisJdW5zaWduZWQgY2hhcgl2ZW5kb3IgWzQwKzFdOyAJLyogSURFIG1vZGVsLCBTQ1NJIFZlbmRvciAqLworCXVuc2lnbmVkIGNoYXIJcHJvZHVjdFsyMCsxXTsJLyogSURFIFNlcmlhbCBubywgU0NTSSBwcm9kdWN0ICovCisJdW5zaWduZWQgY2hhcglyZXZpc2lvbls4KzFdOwkvKiBmaXJtd2FyZSByZXZpc2lvbiAqLworCXVuc2lnbmVkIGxvbmcJKCpibG9ja19yZWFkKShpbnQgZGV2LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJICAgICAgbGJhaW50X3QgYmxrY250LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmJ1ZmZlcik7Cit9YmxvY2tfZGV2X2Rlc2NfdDsKKworLyogSW50ZXJmYWNlIHR5cGVzOiAqLworI2RlZmluZSBJRl9UWVBFX1VOS05PV04JCTAKKyNkZWZpbmUgSUZfVFlQRV9JREUJCTEKKyNkZWZpbmUgSUZfVFlQRV9TQ1NJCQkyCisjZGVmaW5lIElGX1RZUEVfQVRBUEkJCTMKKyNkZWZpbmUgSUZfVFlQRV9VU0IJCTQKKyNkZWZpbmUgSUZfVFlQRV9ET0MJCTUKKyNkZWZpbmUgSUZfVFlQRV9NTUMJCTYKKworLyogUGFydCB0eXBlcyAqLworI2RlZmluZSBQQVJUX1RZUEVfVU5LTk9XTgkweDAwCisjZGVmaW5lIFBBUlRfVFlQRV9NQUMJCTB4MDEKKyNkZWZpbmUgUEFSVF9UWVBFX0RPUwkJMHgwMgorI2RlZmluZSBQQVJUX1RZUEVfSVNPCQkweDAzCisjZGVmaW5lIFBBUlRfVFlQRV9BTUlHQQkJMHgwNAorCisvKgorICogVHlwZSBzdHJpbmcgZm9yIFUtQm9vdCBib290YWJsZSBwYXJ0aXRpb25zCisgKi8KKyNkZWZpbmUgQk9PVF9QQVJUX1RZUEUJIlUtQm9vdCIJLyogcHJpbWFyeSBib290IHBhcnRpdGlvbiB0eXBlCSovCisjZGVmaW5lIEJPT1RfUEFSVF9DT01QCSJQUENCb290IgkvKiBQUENCb290IGNvbXBhdGliaWxpdHkgdHlwZQkqLworCisvKiBkZXZpY2UgdHlwZXMgKi8KKyNkZWZpbmUgREVWX1RZUEVfVU5LTk9XTgkweGZmCS8qIG5vdCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgREVWX1RZUEVfSEFSRERJU0sJMHgwMAkvKiBoYXJkZGlzayAqLworI2RlZmluZSBERVZfVFlQRV9UQVBFCQkweDAxCS8qIFRhcGUgKi8KKyNkZWZpbmUgREVWX1RZUEVfQ0RST00JCTB4MDUJLyogQ0QtUk9NICovCisjZGVmaW5lIERFVl9UWVBFX09QRElTSwkJMHgwNwkvKiBvcHRpY2FsIGRpc2sgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZGlza19wYXJ0aXRpb24geworCXVsb25nCXN0YXJ0OwkJLyogIyBvZiBmaXJzdCBibG9jayBpbiBwYXJ0aXRpb24JKi8KKwl1bG9uZwlzaXplOwkJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiBwYXJ0aXRpb24JKi8KKwl1bG9uZwlibGtzejsJCS8qIGJsb2NrIHNpemUgaW4gYnl0ZXMJCQkqLworCXVjaGFyCW5hbWVbMzJdOwkvKiBwYXJ0aXRpb24gbmFtZQkJCSovCisJdWNoYXIJdHlwZVszMl07CS8qIHN0cmluZyB0eXBlIGRlc2NyaXB0aW9uCQkqLworfSBkaXNrX3BhcnRpdGlvbl90OworCisvKiBkaXNrL3BhcnQuYyAqLworaW50IGdldF9wYXJ0aXRpb25faW5mbyAoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjLCBpbnQgcGFydCwgZGlza19wYXJ0aXRpb25fdCAqaW5mbyk7Cit2b2lkIHByaW50X3BhcnQgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKK3ZvaWQgIGluaXRfcGFydCAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOwordm9pZCBkZXZfcHJpbnQoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworCisKKyNpZmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgorLyogZGlzay9wYXJ0X21hYy5jICovCitpbnQgZ2V0X3BhcnRpdGlvbl9pbmZvX21hYyAoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjLCBpbnQgcGFydCwgZGlza19wYXJ0aXRpb25fdCAqaW5mbyk7Cit2b2lkIHByaW50X3BhcnRfbWFjIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CitpbnQgICB0ZXN0X3BhcnRfbWFjIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCisvKiBkaXNrL3BhcnRfZG9zLmMgKi8KK2ludCBnZXRfcGFydGl0aW9uX2luZm9fZG9zIChibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKTsKK3ZvaWQgcHJpbnRfcGFydF9kb3MgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKK2ludCAgIHRlc3RfcGFydF9kb3MgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lTT19QQVJUSVRJT04KKy8qIGRpc2svcGFydF9pc28uYyAqLworaW50IGdldF9wYXJ0aXRpb25faW5mb19pc28gKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYywgaW50IHBhcnQsIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pOwordm9pZCBwcmludF9wYXJ0X2lzbyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworaW50ICAgdGVzdF9wYXJ0X2lzbyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQU1JR0FfUEFSVElUSU9OCisvKiBkaXNrL3BhcnRfYW1pZ2EuYyAqLworaW50IGdldF9wYXJ0aXRpb25faW5mb19hbWlnYSAoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjLCBpbnQgcGFydCwgZGlza19wYXJ0aXRpb25fdCAqaW5mbyk7Cit2b2lkIHByaW50X3BhcnRfYW1pZ2EgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKK2ludCAgIHRlc3RfcGFydF9hbWlnYSAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworI2VuZGlmCisKKyNlbmRpZiAvKiBfUEFSVF9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL3J0Yy5oIGIveC1sb2FkZXIvaW5jbHVkZS9ydGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDA2YmE1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9ydGMuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBHZW5lcmljIFJUQyBpbnRlcmZhY2UuCisgKi8KKyNpZm5kZWYgX1JUQ19IXworI2RlZmluZSBfUlRDX0hfCisKKy8qIGJjZDwtPmJpbiBmdW5jdGlvbnMgYXJlIG5lZWRlZCBieSBhbG1vc3QgYWxsIHRoZSBSVEMgZHJpdmVycywgbGV0J3MgaW5jbHVkZQorICogaXQgdGhlcmUgaW5zdGVhZCBvZiBpbiBldmV5IHNpbmdsZSBkcml2ZXIgKi8KKworI2luY2x1ZGUgPGJjZC5oPgorCisvKgorICogVGhlIHN0cnVjdCB1c2VkIHRvIHBhc3MgZGF0YSBmcm9tIHRoZSBnZW5lcmljIGludGVyZmFjZSBjb2RlIHRvCisgKiB0aGUgaGFyZHdhcmUgZGVwZW5kZW5kIGxvdy1sZXZlbCBjb2RlIGFuZGUgdmljZSB2ZXJzYS4gSWRlbnRpY2FsCisgKiB0byBzdHJ1Y3QgcnRjX3RpbWUgdXNlZCBieSB0aGUgTGludXgga2VybmVsLgorICoKKyAqIE5vdGUgdGhhdCB0aGVyZSBhcmUgc21hbGwgYnV0IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIHRvIHRoZQorICogY29tbW9uICJzdHJ1Y3QgdGltZSI6CisgKgorICoJCXN0cnVjdCB0aW1lOgkJc3RydWN0IHJ0Y190aW1lOgorICogdG1fbW9uCTAgLi4uIDExCQkxIC4uLiAxMgorICogdG1feWVhcgl5ZWFycyBzaW5jZSAxOTAwCXllYXJzIHNpbmNlIDAKKyAqLworCitzdHJ1Y3QgcnRjX3RpbWUgeworCWludCB0bV9zZWM7CisJaW50IHRtX21pbjsKKwlpbnQgdG1faG91cjsKKwlpbnQgdG1fbWRheTsKKwlpbnQgdG1fbW9uOworCWludCB0bV95ZWFyOworCWludCB0bV93ZGF5OworCWludCB0bV95ZGF5OworCWludCB0bV9pc2RzdDsKK307CisKK3ZvaWQgR3JlZ29yaWFuRGF5IChzdHJ1Y3QgcnRjX3RpbWUgKik7Cit2b2lkIHRvX3RtIChpbnQsIHN0cnVjdCBydGNfdGltZSAqKTsKK3Vuc2lnbmVkIGxvbmcgbWt0aW1lICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAorCQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKKworI2VuZGlmCS8qIF9SVENfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvdGltZXN0YW1wLmggYi94LWxvYWRlci9pbmNsdWRlL3RpbWVzdGFtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZjRjZjQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL3RpbWVzdGFtcC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBFeHRyZW1lIEVuZ2luZWVyaW5nIFNvbHV0aW9ucywgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYJX19USU1FU1RBTVBfSF9fCisjZGVmaW5lCV9fVElNRVNUQU1QX0hfXworCisjaWZuZGVmIERPX0RFUFNfT05MWQorI2luY2x1ZGUgInRpbWVzdGFtcF9hdXRvZ2VuZXJhdGVkLmgiCisjZW5kaWYKKworI2VuZGlmCS8qIF9fVElNRVNUQU1QX0hfXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS92ZXJzaW9uLmggYi94LWxvYWRlci9pbmNsdWRlL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQyOTFhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS92ZXJzaW9uLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA2CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYJX19WRVJTSU9OX0hfXworI2RlZmluZQlfX1ZFUlNJT05fSF9fCisKKyNpZm5kZWYgRE9fREVQU19PTkxZCisjaW5jbHVkZSAidmVyc2lvbl9hdXRvZ2VuZXJhdGVkLmgiCisjZW5kaWYKKworI2VuZGlmCS8qIF9fVkVSU0lPTl9IX18gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvd2F0Y2hkb2cuaCBiL3gtbG9hZGVyL2luY2x1ZGUvd2F0Y2hkb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjU0MTZkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS93YXRjaGRvZy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEVyaWsgVGhlaXNlbiwgIFdhdmUgNyBPcHRpY3MsIGV0aGVpc2VuQG1pbmRzcHJpbmcuY29tLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBXYXRjaGRvZyBmdW5jdGlvbnMgYW5kIG1hY3Jvcy4KKyAqLworI2lmbmRlZiBfV0FUQ0hET0dfSF8KKyNkZWZpbmUgX1dBVENIRE9HX0hfCisKKyNpZiBkZWZpbmVkKENPTkZJR19IV19XQVRDSERPRykgJiYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCisjICBlcnJvciAiQ29uZmlndXJhdGlvbiBlcnJvcjogQ09ORklHX0hXX1dBVENIRE9HIGFuZCBDT05GSUdfV0FUQ0hET0cgY2FuJ3QgYmUgdXNlZCB0b2dldGhlci4iCisjZW5kaWYKKworLyoKKyAqIEhhcmR3YXJlIHdhdGNoZG9nCisgKi8KKyNpZmRlZiBDT05GSUdfSFdfV0FUQ0hET0cKKwkjaWYgZGVmaW5lZChfX0FTU0VNQkxZX18pCisJCSNkZWZpbmUgV0FUQ0hET0dfUkVTRVQgYmwgaHdfd2F0Y2hkb2dfcmVzZXQKKwkjZWxzZQorCQlleHRlcm4gdm9pZCBod193YXRjaGRvZ19yZXNldCh2b2lkKTsKKworCQkjZGVmaW5lIFdBVENIRE9HX1JFU0VUIGh3X3dhdGNoZG9nX3Jlc2V0CisJI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworI2Vsc2UKKwkvKgorCSAqIE1heWJlIGEgc29mdHdhcmUgd2F0Y2hkb2c/CisJICovCisJI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorCQkjaWYgZGVmaW5lZChfX0FTU0VNQkxZX18pCisJCQkjZGVmaW5lIFdBVENIRE9HX1JFU0VUIGJsIHdhdGNoZG9nX3Jlc2V0CisJCSNlbHNlCisJCQlleHRlcm4gdm9pZCB3YXRjaGRvZ19yZXNldCh2b2lkKTsKKworCQkJI2RlZmluZSBXQVRDSERPR19SRVNFVCB3YXRjaGRvZ19yZXNldAorCQkjZW5kaWYKKwkjZWxzZQorCQkvKgorCQkgKiBObyBoYXJkd2FyZSBvciBzb2Z0d2FyZSB3YXRjaGRvZy4KKwkJICovCisJCSNpZiBkZWZpbmVkKF9fQVNTRU1CTFlfXykKKwkJCSNkZWZpbmUgV0FUQ0hET0dfUkVTRVQgLypYWFggRE9fTk9UX0RFTF9USElTX0NPTU1FTlQqLworCQkjZWxzZQorCQkJI2RlZmluZSBXQVRDSERPR19SRVNFVCgpIHt9CisJCSNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKwkjZW5kaWYgLyogQ09ORklHX1dBVENIRE9HICYmICFfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBDT05GSUdfSFdfV0FUQ0hET0cgKi8KKworI2VuZGlmIC8qIF9XQVRDSERPR19IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS94LWxvYWQvY3JjLmggYi94LWxvYWRlci9pbmNsdWRlL3gtbG9hZC9jcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDkxY2FiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS94LWxvYWQvY3JjLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOQorICogTWFydmVsbCBTZW1pY29uZHVjdG9yIDx3d3cubWFydmVsbC5jb20+CisgKiBXcml0dGVuLWJ5OiBQcmFmdWxsYSBXYWRhc2thciA8cHJhZnVsbGFAbWFydmVsbC5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCisgKiBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX1hMT0FEX0NSQ19ICisjZGVmaW5lIF9YTE9BRF9DUkNfSAorCisvKiBsaWIvY3JjMzIuYyAqLwordWludDMyX3QgY3JjMzIgKHVpbnQzMl90LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVpbnQpOwordWludDMyX3QgY3JjMzJfd2QgKHVpbnQzMl90LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVpbnQsIHVpbnQpOwordWludDMyX3QgY3JjMzJfbm9fY29tcCAodWludDMyX3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdWludCk7CisKKyNlbmRpZiAvKiBfWExPQURfQ1JDX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUveC1sb2FkL3psaWIuaCBiL3gtbG9hZGVyL2luY2x1ZGUveC1sb2FkL3psaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI3MDgxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS94LWxvYWQvemxpYi5oCkBAIC0wLDAgKzEsNjk4IEBACisvKgorICogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB6bGliLmggYW5kIHpjb25mLmggZnJvbSB0aGUgemxpYi0xLjIuMworICogZGlzdHJpYnV0aW9uIGJ5IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIsIHdpdGggc29tZSBhZGRpdGlvbnMKKyAqIGJ5IFBhdWwgTWFja2VycmFzIHRvIGFpZCBpbiBpbXBsZW1lbnRpbmcgRGVmbGF0ZSBjb21wcmVzc2lvbiBhbmQKKyAqIGRlY29tcHJlc3Npb24gZm9yIFBQUCBwYWNrZXRzLgorICovCisKKyAvKgorICAqID09RklMRVZFUlNJT04gOTYwMTIyPT0KKyAgKgorICAqIFRoaXMgbWFya2VyIGlzIHVzZWQgYnkgdGhlIExpbnV4IGluc3RhbGxhdGlvbiBzY3JpcHQgdG8gZGV0ZXJtaW5lCisgICogd2hldGhlciBhbiB1cC10by1kYXRlIHZlcnNpb24gb2YgdGhpcyBmaWxlIGlzIGFscmVhZHkgaW5zdGFsbGVkLgorICAqLworCisvKiB6bGliLmggLS0gaW50ZXJmYWNlIG9mIHRoZSAnemxpYicgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAgdmVyc2lvbiAxLjIuMywgSnVseSAxOHRoLCAyMDA1CisKKyAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCisgIGpsb3VwQGd6aXAub3JnICAgICAgICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKKworCisgIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yCisgIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTAudHh0CisgICh6bGliIGZvcm1hdCksIHJmYzE5NTEudHh0IChkZWZsYXRlIGZvcm1hdCkgYW5kIHJmYzE5NTIudHh0IChnemlwIGZvcm1hdCkuCisqLworCisjaWZuZGVmIFpMSUJfSAorI2RlZmluZSBaTElCX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFpMSUJfVkVSU0lPTiAiMS4yLjMiCisjZGVmaW5lIFpMSUJfVkVSTlVNIDB4MTIzMAorCisvKiAjaW5jbHVkZSAiemNvbmYuaCIgKi8gICAgICAgIC8qIGluY2x1ZGVkIGRpcmVjdGx5IGhlcmUgKi8KKy8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEJlZ2luIG9mIG5ldyB6Y29uZi5oICovCisvKgorICogSWYgeW91ICpyZWFsbHkqIG5lZWQgYSB1bmlxdWUgcHJlZml4IGZvciBhbGwgdHlwZXMgYW5kIGxpYnJhcnkgZnVuY3Rpb25zLAorICogY29tcGlsZSB3aXRoIC1EWl9QUkVGSVguIFRoZSAic3RhbmRhcmQiIHpsaWIgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgaXQuCisgKi8KKyNpZmRlZiBaX1BSRUZJWAorIyAgZGVmaW5lIGRlZmxhdGVJbml0XyAgICAgICAgICB6X2RlZmxhdGVJbml0XworIyAgZGVmaW5lIGRlZmxhdGUgICAgICAgICAgICAgICB6X2RlZmxhdGUKKyMgIGRlZmluZSBkZWZsYXRlRW5kICAgICAgICAgICAgel9kZWZsYXRlRW5kCisjICBkZWZpbmUgaW5mbGF0ZUluaXRfICAgICAgICAgIHpfaW5mbGF0ZUluaXRfCisjICBkZWZpbmUgaW5mbGF0ZSAgICAgICAgICAgICAgIHpfaW5mbGF0ZQorIyAgZGVmaW5lIGluZmxhdGVFbmQgICAgICAgICAgICB6X2luZmxhdGVFbmQKKyMgIGRlZmluZSBkZWZsYXRlSW5pdDJfICAgICAgICAgel9kZWZsYXRlSW5pdDJfCisjICBkZWZpbmUgZGVmbGF0ZVNldERpY3Rpb25hcnkgIHpfZGVmbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBkZWZsYXRlQ29weSAgICAgICAgICAgel9kZWZsYXRlQ29weQorIyAgZGVmaW5lIGRlZmxhdGVSZXNldCAgICAgICAgICB6X2RlZmxhdGVSZXNldAorIyAgZGVmaW5lIGRlZmxhdGVQYXJhbXMgICAgICAgICB6X2RlZmxhdGVQYXJhbXMKKyMgIGRlZmluZSBkZWZsYXRlQm91bmQgICAgICAgICAgel9kZWZsYXRlQm91bmQKKyMgIGRlZmluZSBkZWZsYXRlUHJpbWUgICAgICAgICAgel9kZWZsYXRlUHJpbWUKKyMgIGRlZmluZSBpbmZsYXRlSW5pdDJfICAgICAgICAgel9pbmZsYXRlSW5pdDJfCisjICBkZWZpbmUgaW5mbGF0ZVNldERpY3Rpb25hcnkgIHpfaW5mbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBpbmZsYXRlU3luYyAgICAgICAgICAgel9pbmZsYXRlU3luYworIyAgZGVmaW5lIGluZmxhdGVTeW5jUG9pbnQgICAgICB6X2luZmxhdGVTeW5jUG9pbnQKKyMgIGRlZmluZSBpbmZsYXRlQ29weSAgICAgICAgICAgel9pbmZsYXRlQ29weQorIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgICAgICAgICB6X2luZmxhdGVSZXNldAorIyAgZGVmaW5lIGluZmxhdGVCYWNrICAgICAgICAgICB6X2luZmxhdGVCYWNrCisjICBkZWZpbmUgaW5mbGF0ZUJhY2tFbmQgICAgICAgIHpfaW5mbGF0ZUJhY2tFbmQKKyMgIGRlZmluZSBjb21wcmVzcyAgICAgICAgICAgICAgel9jb21wcmVzcworIyAgZGVmaW5lIGNvbXByZXNzMiAgICAgICAgICAgICB6X2NvbXByZXNzMgorIyAgZGVmaW5lIGNvbXByZXNzQm91bmQgICAgICAgICB6X2NvbXByZXNzQm91bmQKKyMgIGRlZmluZSB1bmNvbXByZXNzICAgICAgICAgICAgel91bmNvbXByZXNzCisjICBkZWZpbmUgYWRsZXIzMiAgICAgICAgICAgICAgIHpfYWRsZXIzMgorIyAgZGVmaW5lIGNyYzMyICAgICAgICAgICAgICAgICB6X2NyYzMyCisjICBkZWZpbmUgZ2V0X2NyY190YWJsZSAgICAgICAgIHpfZ2V0X2NyY190YWJsZQorIyAgZGVmaW5lIHpFcnJvciAgICAgICAgICAgICAgICB6X3pFcnJvcgorCisjICBkZWZpbmUgYWxsb2NfZnVuYyAgICAgICAgICAgIHpfYWxsb2NfZnVuYworIyAgZGVmaW5lIGZyZWVfZnVuYyAgICAgICAgICAgICB6X2ZyZWVfZnVuYworIyAgZGVmaW5lIGluX2Z1bmMgICAgICAgICAgICAgICB6X2luX2Z1bmMKKyMgIGRlZmluZSBvdXRfZnVuYyAgICAgICAgICAgICAgel9vdXRfZnVuYworIyAgZGVmaW5lIEJ5dGUgICAgICAgICAgICAgICAgICB6X0J5dGUKKyMgIGRlZmluZSB1SW50ICAgICAgICAgICAgICAgICAgel91SW50CisjICBkZWZpbmUgdUxvbmcgICAgICAgICAgICAgICAgIHpfdUxvbmcKKyMgIGRlZmluZSBCeXRlZiAgICAgICAgICAgICAgICAgel9CeXRlZgorIyAgZGVmaW5lIGNoYXJmICAgICAgICAgICAgICAgICB6X2NoYXJmCisjICBkZWZpbmUgaW50ZiAgICAgICAgICAgICAgICAgIHpfaW50ZgorIyAgZGVmaW5lIHVJbnRmICAgICAgICAgICAgICAgICB6X3VJbnRmCisjICBkZWZpbmUgdUxvbmdmICAgICAgICAgICAgICAgIHpfdUxvbmdmCisjICBkZWZpbmUgdm9pZHBmICAgICAgICAgICAgICAgIHpfdm9pZHBmCisjICBkZWZpbmUgdm9pZHAgICAgICAgICAgICAgICAgIHpfdm9pZHAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQorIyAgZGVmaW5lIE1TRE9TCisjZW5kaWYKKyNpZiAoZGVmaW5lZChPU18yKSB8fCBkZWZpbmVkKF9fT1MyX18pKSAmJiAhZGVmaW5lZChPUzIpCisjICBkZWZpbmUgT1MyCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU5ET1dTKSAmJiAhZGVmaW5lZChXSU5ET1dTKQorIyAgZGVmaW5lIFdJTkRPV1MKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IGRlZmluZWQoX19XSU4zMl9fKQorIyAgaWZuZGVmIFdJTjMyCisjICAgIGRlZmluZSBXSU4zMgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU5ET1dTKSkgJiYgIWRlZmluZWQoV0lOMzIpCisjICBpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19GTEFUX18pICYmICFkZWZpbmVkKF9fMzg2X18pCisjICAgIGlmbmRlZiBTWVMxNkJJVAorIyAgICAgIGRlZmluZSBTWVMxNkJJVAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisvKgorICogQ29tcGlsZSB3aXRoIC1ETUFYU0VHXzY0SyBpZiB0aGUgYWxsb2MgZnVuY3Rpb24gY2Fubm90IGFsbG9jYXRlIG1vcmUKKyAqIHRoYW4gNjRrIGJ5dGVzIGF0IGEgdGltZSAobmVlZGVkIG9uIHN5c3RlbXMgd2l0aCAxNi1iaXQgaW50KS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBkZWZpbmUgTUFYU0VHXzY0SworI2VuZGlmCisjaWZkZWYgTVNET1MKKyMgIGRlZmluZSBVTkFMSUdORURfT0sKKyNlbmRpZgorCisjaWZkZWYgX19TVERDX1ZFUlNJT05fXworIyAgaWZuZGVmIFNUREMKKyMgICAgZGVmaW5lIFNUREMKKyMgIGVuZGlmCisjICBpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgICAgaWZuZGVmIFNUREM5OQorIyAgICAgIGRlZmluZSBTVERDOTkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoX19IT1NfQUlYX18pKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pICYmICFkZWZpbmVkKFNUREMpICAgIC8qIGlTZXJpZXMgKGZvcm1lcmx5IEFTLzQwMCkuICovCisjICBkZWZpbmUgU1REQworI2VuZGlmCisKKyNpZm5kZWYgU1REQworIyAgaWZuZGVmIGNvbnN0IC8qIGNhbm5vdCB1c2UgIWRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoY29uc3QpIG9uIE1hYyAqLworIyAgICBkZWZpbmUgY29uc3QgICAgICAgLyogbm90ZTogbmVlZCBhIG1vcmUgZ2VudGxlIHNvbHV0aW9uIGhlcmUgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworLyogU29tZSBNYWMgY29tcGlsZXJzIG1lcmdlIGFsbCAuaCBmaWxlcyBpbmNvcnJlY3RseTogKi8KKyNpZiBkZWZpbmVkKF9fTVdFUktTX18pfHxkZWZpbmVkKGFwcGxlYyl8fGRlZmluZWQoVEhJTktfQyl8fGRlZmluZWQoX19TQ19fKQorIyAgZGVmaW5lIE5PX0RVTU1ZX0RFQ0wKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi8KKyNpZm5kZWYgTUFYX01FTV9MRVZFTAorIyAgaWZkZWYgTUFYU0VHXzY0SworIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA4CisjICBlbHNlCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3Igd2luZG93Qml0cyBpbiBkZWZsYXRlSW5pdDIgYW5kIGluZmxhdGVJbml0Mi4KKyAqIFdBUk5JTkc6IHJlZHVjaW5nIE1BWF9XQklUUyBtYWtlcyBtaW5pZ3ppcCB1bmFibGUgdG8gZXh0cmFjdCAuZ3ogZmlsZXMKKyAqIGNyZWF0ZWQgYnkgZ3ppcC4gKEZpbGVzIGNyZWF0ZWQgYnkgbWluaWd6aXAgY2FuIHN0aWxsIGJlIGV4dHJhY3RlZCBieQorICogZ3ppcC4pCisgKi8KKyNpZm5kZWYgTUFYX1dCSVRTCisjICBkZWZpbmUgTUFYX1dCSVRTICAgMTUgLyogMzJLIExaNzcgd2luZG93ICovCisjZW5kaWYKKworLyogVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGRlZmxhdGUgYXJlIChpbiBieXRlcyk6CisgICAgICAgICAgICAoMSA8PCAod2luZG93Qml0cysyKSkgKyAgKDEgPDwgKG1lbUxldmVsKzkpKQorIHRoYXQgaXM6IDEyOEsgZm9yIHdpbmRvd0JpdHM9MTUgICsgIDEyOEsgZm9yIG1lbUxldmVsID0gOCAgKGRlZmF1bHQgdmFsdWVzKQorIHBsdXMgYSBmZXcga2lsb2J5dGVzIGZvciBzbWFsbCBvYmplY3RzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gcmVkdWNlCisgdGhlIGRlZmF1bHQgbWVtb3J5IHJlcXVpcmVtZW50cyBmcm9tIDI1NksgdG8gMTI4SywgY29tcGlsZSB3aXRoCisgICAgIG1ha2UgQ0ZMQUdTPSItTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NyIKKyBPZiBjb3Vyc2UgdGhpcyB3aWxsIGdlbmVyYWxseSBkZWdyYWRlIGNvbXByZXNzaW9uICh0aGVyZSdzIG5vIGZyZWUgbHVuY2gpLgorCisgICBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgaW5mbGF0ZSBhcmUgKGluIGJ5dGVzKSAxIDw8IHdpbmRvd0JpdHMKKyB0aGF0IGlzLCAzMksgZm9yIHdpbmRvd0JpdHM9MTUgKGRlZmF1bHQgdmFsdWUpIHBsdXMgYSBmZXcga2lsb2J5dGVzCisgZm9yIHNtYWxsIG9iamVjdHMuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIE9GIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyMgIGlmZGVmIFNUREMKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICBhcmdzCisjICBlbHNlCisjICAgIGRlZmluZSBPRihhcmdzKSAgKCkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgRkFSIGFyZSBuZWVkZWQgb25seSBmb3IgTVNET1MgbWl4ZWQKKyAqIG1vZGVsIHByb2dyYW1taW5nIChzbWFsbCBvciBtZWRpdW0gbW9kZWwgd2l0aCBzb21lIGZhciBhbGxvY2F0aW9ucykuCisgKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSB3aXRoIE1TQzsgZm9yIG90aGVyIE1TRE9TIGNvbXBpbGVycyB5b3UgbWF5IGhhdmUKKyAqIHRvIGRlZmluZSBOT19NRU1DUFkgaW4genV0aWwuaC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBtaXhlZCBtb2RlbCwKKyAqIGp1c3QgZGVmaW5lIEZBUiB0byBiZSBlbXB0eS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBpZiBkZWZpbmVkKE1fSTg2U00pIHx8IGRlZmluZWQoTV9JODZNTSkKKyAgICAgLyogTVNDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGlmZGVmIF9NU0NfVkVSCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmIChkZWZpbmVkKF9fU01BTExfXykgfHwgZGVmaW5lZChfX01FRElVTV9fKSkKKyAgICAgLyogVHVyYm8gQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfX0JPUkxBTkRDX18KKyMgICAgICBkZWZpbmUgRkFSIF9mYXIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGQVIgZmFyCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpCisgICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIGFzIGEgRExMLCBkZWZpbmUgWkxJQl9ETEwuCisgICAgKiBUaGlzIGlzIG5vdCBtYW5kYXRvcnksIGJ1dCBpdCBvZmZlcnMgYSBsaXR0bGUgcGVyZm9ybWFuY2UgaW5jcmVhc2UuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1MDApKQorIyAgICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmICAvKiBaTElCX0RMTCAqLworICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiB3aXRoIHRoZSBXSU5BUEkvV0lOQVBJViBjYWxsaW5nIGNvbnZlbnRpb24sCisgICAgKiBkZWZpbmUgWkxJQl9XSU5BUEkuCisgICAgKiBDYXV0aW9uOiB0aGUgc3RhbmRhcmQgWkxJQjEuRExMIGlzIE5PVCBjb21waWxlZCB1c2luZyBaTElCX1dJTkFQSS4KKyAgICAqLworIyAgaWZkZWYgWkxJQl9XSU5BUEkKKyMgICAgaWZkZWYgRkFSCisjICAgICAgdW5kZWYgRkFSCisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyAgICAgLyogTm8gbmVlZCBmb3IgX2V4cG9ydCwgdXNlIFpMSUIuREVGIGluc3RlYWQuICovCisgICAgIC8qIEZvciBjb21wbGV0ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHksIHVzZSBXSU5BUEksIG5vdCBfX3N0ZGNhbGwuICovCisjICAgIGRlZmluZSBaRVhQT1JUIFdJTkFQSQorIyAgICBpZmRlZiBXSU4zMgorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgV0lOQVBJVgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBGQVIgQ0RFQ0wKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQkVPU19fKQorIyAgaWZkZWYgWkxJQl9ETEwKKyMgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBaRVhURVJOCisjICBkZWZpbmUgWkVYVEVSTiBleHRlcm4KKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUCisjICBkZWZpbmUgWkVYUE9SVAorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlRWQQorIyAgZGVmaW5lIFpFWFBPUlRWQQorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjICBkZWZpbmUgRkFSCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLworCisjaWZkZWYgU01BTExfTUVESVVNCisgICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLworIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCisjZWxzZQorICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7CisjZW5kaWYKK3R5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwordHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKK3R5cGVkZWYgdUludCAgRkFSIHVJbnRmOwordHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOworCisjaWZkZWYgU1REQworICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIHZvaWQgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgdm9pZCAgICAgICAqdm9pZHA7CisjZWxzZQorICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIEJ5dGUgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgQnl0ZSAgICAgICAqdm9pZHA7CisjZW5kaWYKKworIyAgaWZkZWYgVk1TCisjICAgIGluY2x1ZGUgPHVuaXhpby5oPiAgIC8qIGZvciBvZmZfdCAqLworIyAgZW5kaWYKKyMgIGRlZmluZSB6X29mZl90IG9mZl90CisjaWZuZGVmIFNFRUtfU0VUCisjICBkZWZpbmUgU0VFS19TRVQgICAgICAgIDAgICAgICAgLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgIGRlZmluZSBTRUVLX0NVUiAgICAgICAgMSAgICAgICAvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjICBkZWZpbmUgU0VFS19FTkQgICAgICAgIDIgICAgICAgLyogU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IiAqLworI2VuZGlmCisjaWZuZGVmIHpfb2ZmX3QKKyMgIGRlZmluZSB6X29mZl90IGxvbmcKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pCisjICBkZWZpbmUgTk9fdnNucHJpbnRmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NVlNfXykKKyMgIGRlZmluZSBOT192c25wcmludGYKKyMgIGlmZGVmIEZBUgorIyAgICB1bmRlZiBGQVIKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCisjICAgcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQorI2VuZGlmCisvKiBFbmQgb2YgbmV3IHpjb25mLmggKi8KKworLyoKKyAgICAgVGhlICd6bGliJyBjb21wcmVzc2lvbiBsaWJyYXJ5IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQKKyAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQKKyAgZGF0YS4gIFRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBzdXBwb3J0cyBvbmx5IG9uZSBjb21wcmVzc2lvbiBtZXRob2QKKyAgKGRlZmxhdGlvbikgYnV0IG90aGVyIGFsZ29yaXRobXMgd2lsbCBiZSBhZGRlZCBsYXRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lCisgIHN0cmVhbSBpbnRlcmZhY2UuCisKKyAgICAgQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UKKyAgZW5vdWdoIChmb3IgZXhhbXBsZSBpZiBhbiBpbnB1dCBmaWxlIGlzIG1tYXAnZWQpLCBvciBjYW4gYmUgZG9uZSBieQorICByZXBlYXRlZCBjYWxscyBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb24uICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZQorICBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0CisgIChwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCisKKyAgICAgVGhlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdXNlZCBieSBkZWZhdWx0IGJ5IHRoZSBpbi1tZW1vcnkgZnVuY3Rpb25zIGlzCisgIHRoZSB6bGliIGZvcm1hdCwgd2hpY2ggaXMgYSB6bGliIHdyYXBwZXIgZG9jdW1lbnRlZCBpbiBSRkMgMTk1MCwgd3JhcHBlZAorICBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbSwgd2hpY2ggaXMgaXRzZWxmIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTEuCisKKyAgICAgVGhlIGxpYnJhcnkgYWxzbyBzdXBwb3J0cyByZWFkaW5nIGFuZCB3cml0aW5nIGZpbGVzIGluIGd6aXAgKC5neikgZm9ybWF0CisgIHdpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpbyB1c2luZyB0aGUgZnVuY3Rpb25zIHRoYXQgc3RhcnQKKyAgd2l0aCAiZ3oiLiAgVGhlIGd6aXAgZm9ybWF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSB6bGliIGZvcm1hdC4gIGd6aXAgaXMgYQorICBnemlwIHdyYXBwZXIsIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTIsIHdyYXBwZWQgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0uCisKKyAgICAgVGhpcyBsaWJyYXJ5IGNhbiBvcHRpb25hbGx5IHJlYWQgYW5kIHdyaXRlIGd6aXAgc3RyZWFtcyBpbiBtZW1vcnkgYXMgd2VsbC4KKworICAgICBUaGUgemxpYiBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIGJlIGNvbXBhY3QgYW5kIGZhc3QgZm9yIHVzZSBpbiBtZW1vcnkKKyAgYW5kIG9uIGNvbW11bmljYXRpb25zIGNoYW5uZWxzLiAgVGhlIGd6aXAgZm9ybWF0IHdhcyBkZXNpZ25lZCBmb3Igc2luZ2xlLQorICBmaWxlIGNvbXByZXNzaW9uIG9uIGZpbGUgc3lzdGVtcywgaGFzIGEgbGFyZ2VyIGhlYWRlciB0aGFuIHpsaWIgdG8gbWFpbnRhaW4KKyAgZGlyZWN0b3J5IGluZm9ybWF0aW9uLCBhbmQgdXNlcyBhIGRpZmZlcmVudCwgc2xvd2VyIGNoZWNrIG1ldGhvZCB0aGFuIHpsaWIuCisKKyAgICAgVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuIFRoZSBkZWNvZGVyIGNoZWNrcworICB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyCisgIGNyYXNoIGV2ZW4gaW4gY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCisqLworCit0eXBlZGVmIHZvaWRwZiAoKmFsbG9jX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB1SW50IGl0ZW1zLCB1SW50IHNpemUpKTsKK3R5cGVkZWYgdm9pZCAgICgqZnJlZV9mdW5jKSAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBhZGRyZXNzLCB1SW50IHNpemUpKTsKK3R5cGVkZWYgdm9pZCAgICgqY2JfZnVuYykgICAgT0YoKEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisKK3N0cnVjdCBpbnRlcm5hbF9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3Qgel9zdHJlYW1fcyB7CisJQnl0ZWYJKm5leHRfaW47IC8qIG5leHQgaW5wdXQgYnl0ZSAqLworCXVJbnQJYXZhaWxfaW47IC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgbmV4dF9pbiAqLworCXVMb25nCXRvdGFsX2luOyAvKiB0b3RhbCBuYiBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqLworCUJ5dGVmCSpuZXh0X291dDsgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovCisJdUludAlhdmFpbF9vdXQ7IC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG5leHRfb3V0ICovCisJdUxvbmcJdG90YWxfb3V0OyAvKiB0b3RhbCBuYiBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovCisJY2hhcgkqbXNnOwkvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi8KKwlzdHJ1Y3QJaW50ZXJuYWxfc3RhdGUgRkFSICpzdGF0ZTsgLyogbm90IHZpc2libGUgYnkgYXBwbGljYXRpb25zICovCisJYWxsb2NfZnVuYwl6YWxsb2M7CS8qIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlICovCisJZnJlZV9mdW5jCXpmcmVlOwkvKiB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIHN0YXRlICovCisJdm9pZHBmCW9wYXF1ZTsJLyogcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gemFsbG9jIGFuZCB6ZnJlZSAqLworCWludAlkYXRhX3R5cGU7CS8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZToKKwkJCQkJYmluYXJ5IG9yIHRleHQgKi8KKwljYl9mdW5jCW91dGNiOwkvKiBjYWxsZWQgcmVndWxhcmx5IGp1c3QgYmVmb3JlIGJsb2NrcyBvZiBvdXRwdXQgKi8KKwl1TG9uZwlhZGxlcjsJLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KKwl1TG9uZwlyZXNlcnZlZDsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KK30gel9zdHJlYW07CisKK3R5cGVkZWYgel9zdHJlYW0gRkFSICp6X3N0cmVhbXA7CisKKy8qCisgICAgIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHBhc3NlZCB0byBhbmQgZnJvbSB6bGliIHJvdXRpbmVzLiAgU2VlIFJGQyAxOTUyCisgIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIG1lYW5pbmdzIG9mIHRoZXNlIGZpZWxkcy4KKyovCit0eXBlZGVmIHN0cnVjdCBnel9oZWFkZXJfcyB7CisJaW50CXRleHQ7CS8qIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHQgKi8KKwl1TG9uZwl0aW1lOwkvKiBtb2RpZmljYXRpb24gdGltZSAqLworCWludAl4ZmxhZ3M7CS8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCisJaW50CW9zOwkvKiBvcGVyYXRpbmcgc3lzdGVtICovCisJQnl0ZWYJKmV4dHJhOwkvKiBwb2ludGVyIHRvIGV4dHJhIGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICovCisJdUludAlleHRyYV9sZW47IC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqLworCXVJbnQJZXh0cmFfbWF4OyAvKiBzcGFjZSBhdCBleHRyYSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLworCUJ5dGVmCSpuYW1lOyAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBmaWxlIG5hbWUgb3IgWl9OVUxMICovCisJdUludAluYW1lX21heDsgLyogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLworCUJ5dGVmCSpjb21tZW50OyAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqLworCXVJbnQJY29tbV9tYXg7IC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKwlpbnQJaGNyYzsgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi8KKwlpbnQJZG9uZTsgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQKKwkJCXdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KK30gZ3pfaGVhZGVyOworCit0eXBlZGVmIGd6X2hlYWRlciBGQVIgKmd6X2hlYWRlcnA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0YW50cyAqLworI2RlZmluZSBaX05PX0ZMVVNIICAgICAgMAorI2RlZmluZSBaX1BBUlRJQUxfRkxVU0ggMSAvKiB3aWxsIGJlIHJlbW92ZWQsIHVzZSBaX1NZTkNfRkxVU0ggaW5zdGVhZCAqLworI2RlZmluZSBaX1NZTkNfRkxVU0ggICAgMgorI2RlZmluZSBaX0ZVTExfRkxVU0ggICAgMworI2RlZmluZSBaX0ZJTklTSCAgICAgICAgNAorI2RlZmluZSBaX0JMT0NLICAgICAgICAgNQorLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqLworCisjZGVmaW5lIFpfT0sgICAgICAgICAgICAwCisjZGVmaW5lIFpfU1RSRUFNX0VORCAgICAxCisjZGVmaW5lIFpfTkVFRF9ESUNUICAgICAyCisjZGVmaW5lIFpfRVJSTk8gICAgICAgICgtMSkKKyNkZWZpbmUgWl9TVFJFQU1fRVJST1IgKC0yKQorI2RlZmluZSBaX0RBVEFfRVJST1IgICAoLTMpCisjZGVmaW5lIFpfTUVNX0VSUk9SICAgICgtNCkKKyNkZWZpbmUgWl9CVUZfRVJST1IgICAgKC01KQorI2RlZmluZSBaX1ZFUlNJT05fRVJST1IgKC02KQorLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlCisgKiB2YWx1ZXMgYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLgorICovCisKKyNkZWZpbmUgWl9OT19DT01QUkVTU0lPTiAgICAgICAgIDAKKyNkZWZpbmUgWl9CRVNUX1NQRUVEICAgICAgICAgICAgIDEKKyNkZWZpbmUgWl9CRVNUX0NPTVBSRVNTSU9OICAgICAgIDkKKyNkZWZpbmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICAoLTEpCisvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi8KKworI2RlZmluZSBaX0ZJTFRFUkVEICAgICAgICAgICAgMQorI2RlZmluZSBaX0hVRkZNQU5fT05MWSAgICAgICAgMgorI2RlZmluZSBaX1JMRSAgICAgICAgICAgICAgICAgMworI2RlZmluZSBaX0ZJWEVEICAgICAgICAgICAgICAgNAorI2RlZmluZSBaX0RFRkFVTFRfU1RSQVRFR1kgICAgMAorLyogY29tcHJlc3Npb24gc3RyYXRlZ3k7IHNlZSBkZWZsYXRlSW5pdDIoKSBiZWxvdyBmb3IgZGV0YWlscyAqLworCisjZGVmaW5lIFpfQklOQVJZICAgMAorI2RlZmluZSBaX1RFWFQgICAgIDEKKyNkZWZpbmUgWl9BU0NJSSAgICBaX1RFWFQgICAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDEuMi4yIGFuZCBlYXJsaWVyICovCisjZGVmaW5lIFpfVU5LTk9XTiAgMgorLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqLworCisjZGVmaW5lIFpfREVGTEFURUQgICA4CisvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKHRoZSBvbmx5IG9uZSBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uKSAqLworCisjZGVmaW5lIFpfTlVMTCAgMCAgLyogZm9yIGluaXRpYWxpemluZyB6YWxsb2MsIHpmcmVlLCBvcGFxdWUgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzaWMgZnVuY3Rpb25zICovCisKKy8qIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29tcGFyZSB6bGliVmVyc2lvbiBhbmQgWkxJQl9WRVJTSU9OIGZvciBjb25zaXN0ZW5jeS4KKyAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzCisgICBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB6bGliLmggaGVhZGVyIGZpbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICBUaGlzIGNoZWNrIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQuCisgKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8gT0YoKHpfc3RyZWFtcCBzdHJtLCBjb25zdCBjaGFyICp2ZXJzaW9uLAorCQkJCWludCBzdHJlYW1fc2l6ZSkpOworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgaW5mbGF0ZSBkZWNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgaW50cm9kdWNlCisgIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KKyAgZm9yY2VkIHRvIGZsdXNoLgorCisgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGluZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIC0gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgorICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CisgICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCBuZXh0X2luIGlzIHVwZGF0ZWQgYW5kIHByb2Nlc3NpbmcKKyAgICB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KKworICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0CisgICAgYWNjb3JkaW5nbHkuICBpbmZsYXRlKCkgcHJvdmlkZXMgYXMgbXVjaCBvdXRwdXQgYXMgcG9zc2libGUsIHVudGlsIHRoZXJlCisgICAgaXMgbm8gbW9yZSBpbnB1dCBkYXRhIG9yIG5vIG1vcmUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIgKHNlZSBiZWxvdworICAgIGFib3V0IHRoZSBmbHVzaCBwYXJhbWV0ZXIpLgorCisgIEJlZm9yZSB0aGUgY2FsbCBvZiBpbmZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKKyAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCisgIG1vcmUgb3V0cHV0LCBhbmQgdXBkYXRpbmcgdGhlIG5leHRfKiBhbmQgYXZhaWxfKiB2YWx1ZXMgYWNjb3JkaW5nbHkuCisgIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IKKyAgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKGF2YWlsX291dCA9PSAwKSwgb3IgYWZ0ZXIgZWFjaAorICBjYWxsIG9mIGluZmxhdGUoKS4gSWYgaW5mbGF0ZSByZXR1cm5zIFpfT0sgYW5kIHdpdGggemVybyBhdmFpbF9vdXQsIGl0CisgIG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUKKyAgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KKworICAgIFRoZSBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpIGNhbiBiZSBaX05PX0ZMVVNILCBaX1NZTkNfRkxVU0gsCisgIFpfRklOSVNILCBvciBaX0JMT0NLLiBaX1NZTkNfRkxVU0ggcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgZmx1c2ggYXMgbXVjaAorICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuIFpfQkxPQ0sgcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgc3RvcAorICBpZiBhbmQgd2hlbiBpdCBnZXRzIHRvIHRoZSBuZXh0IGRlZmxhdGUgYmxvY2sgYm91bmRhcnkuIFdoZW4gZGVjb2RpbmcgdGhlCisgIHpsaWIgb3IgZ3ppcCBmb3JtYXQsIHRoaXMgd2lsbCBjYXVzZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyCisgIHRoZSBoZWFkZXIgYW5kIGJlZm9yZSB0aGUgZmlyc3QgYmxvY2suIFdoZW4gZG9pbmcgYSByYXcgaW5mbGF0ZSwgaW5mbGF0ZSgpCisgIHdpbGwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgdGhlIGZpcnN0IGJsb2NrLCBhbmQgd2lsbCByZXR1cm4gd2hlbiBpdCBnZXRzIHRvCisgIHRoZSBlbmQgb2YgdGhhdCBibG9jaywgb3Igd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLgorCisgICAgVGhlIFpfQkxPQ0sgb3B0aW9uIGFzc2lzdHMgaW4gYXBwZW5kaW5nIHRvIG9yIGNvbWJpbmluZyBkZWZsYXRlIHN0cmVhbXMuCisgIEFsc28gdG8gYXNzaXN0IGluIHRoaXMsIG9uIHJldHVybiBpbmZsYXRlKCkgd2lsbCBzZXQgc3RybS0+ZGF0YV90eXBlIHRvIHRoZQorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW4sIHBsdXMgNjQKKyAgaWYgaW5mbGF0ZSgpIGlzIGN1cnJlbnRseSBkZWNvZGluZyB0aGUgbGFzdCBibG9jayBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0sCisgIHBsdXMgMTI4IGlmIGluZmxhdGUoKSByZXR1cm5lZCBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZyBhbiBlbmQtb2YtYmxvY2sKKyAgY29kZSBvciBkZWNvZGluZyB0aGUgY29tcGxldGUgaGVhZGVyIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZQorICBkZWZsYXRlIHN0cmVhbS4gVGhlIGVuZC1vZi1ibG9jayB3aWxsIG5vdCBiZSBpbmRpY2F0ZWQgdW50aWwgYWxsIG9mIHRoZQorICB1bmNvbXByZXNzZWQgZGF0YSBmcm9tIHRoYXQgYmxvY2sgaGFzIGJlZW4gd3JpdHRlbiB0byBzdHJtLT5uZXh0X291dC4gIFRoZQorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgbWF5IGluIGdlbmVyYWwgYmUgZ3JlYXRlciB0aGFuIHNldmVuLCBleGNlcHQgd2hlbgorICBiaXQgNyBvZiBkYXRhX3R5cGUgaXMgc2V0LCBpbiB3aGljaCBjYXNlIHRoZSBudW1iZXIgb2YgdW51c2VkIGJpdHMgd2lsbCBiZQorICBsZXNzIHRoYW4gZWlnaHQuCisKKyAgICBpbmZsYXRlKCkgc2hvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIFpfU1RSRUFNX0VORCBvciBhbgorICBlcnJvci4gSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcAorICAoYSBzaW5nbGUgY2FsbCBvZiBpbmZsYXRlKSwgdGhlIHBhcmFtZXRlciBmbHVzaCBzaG91bGQgYmUgc2V0IHRvCisgIFpfRklOSVNILiBJbiB0aGlzIGNhc2UgYWxsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkIGFuZCBhbGwgcGVuZGluZworICBvdXRwdXQgaXMgZmx1c2hlZDsgYXZhaWxfb3V0IG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZQorICB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtYXkgaGF2ZSBiZWVuIHNhdmVkCisgIGJ5IHRoZSBjb21wcmVzc29yIGZvciB0aGlzIHB1cnBvc2UuKSBUaGUgbmV4dCBvcGVyYXRpb24gb24gdGhpcyBzdHJlYW0gbXVzdAorICBiZSBpbmZsYXRlRW5kIHRvIGRlYWxsb2NhdGUgdGhlIGRlY29tcHJlc3Npb24gc3RhdGUuIFRoZSB1c2Ugb2YgWl9GSU5JU0gKKyAgaXMgbmV2ZXIgcmVxdWlyZWQsIGJ1dCBjYW4gYmUgdXNlZCB0byBpbmZvcm0gaW5mbGF0ZSB0aGF0IGEgZmFzdGVyIGFwcHJvYWNoCisgIG1heSBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIGluZmxhdGUoKSBjYWxsLgorCisgICAgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIGluZmxhdGUoKSBhbHdheXMgZmx1c2hlcyBhcyBtdWNoIG91dHB1dCBhcworICBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIGFsd2F5cyB1c2VzIHRoZSBmYXN0ZXIgYXBwcm9hY2ggb24gdGhlCisgIGZpcnN0IGNhbGwuIFNvIHRoZSBvbmx5IGVmZmVjdCBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgaXMgb24gdGhlIHJldHVybiB2YWx1ZSBvZiBpbmZsYXRlKCksIGFzIG5vdGVkIGJlbG93LCBvciB3aGVuIGl0IHJldHVybnMgZWFybHkKKyAgYmVjYXVzZSBaX0JMT0NLIGlzIHVzZWQuCisKKyAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYWZ0ZXIgdGhpcyBjYWxsIChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkKKyAgYmVsb3cpLCBpbmZsYXRlIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgdGhlIGRpY3Rpb25hcnkKKyAgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfTkVFRF9ESUNUOyBvdGhlcndpc2UgaXQgc2V0cworICBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkIHNvIGZhciAodGhhdCBpcywKKyAgdG90YWxfb3V0IGJ5dGVzKSBhbmQgcmV0dXJucyBaX09LLCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQKKyAgYmVsb3cuIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgaW5mbGF0ZSgpIGNoZWNrcyB0aGF0IGl0cyBjb21wdXRlZCBhZGxlcjMyCisgIGNoZWNrc3VtIGlzIGVxdWFsIHRvIHRoYXQgc2F2ZWQgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9TVFJFQU1fRU5ECisgIG9ubHkgaWYgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuCisKKyAgICBpbmZsYXRlKCkgd2lsbCBkZWNvbXByZXNzIGFuZCBjaGVjayBlaXRoZXIgemxpYi13cmFwcGVkIG9yIGd6aXAtd3JhcHBlZAorICBkZWZsYXRlIGRhdGEuICBUaGUgaGVhZGVyIHR5cGUgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS4gIEFueSBpbmZvcm1hdGlvbgorICBjb250YWluZWQgaW4gdGhlIGd6aXAgaGVhZGVyIGlzIG5vdCByZXRhaW5lZCwgc28gYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0aGF0CisgIGluZm9ybWF0aW9uIHNob3VsZCBpbnN0ZWFkIHVzZSByYXcgaW5mbGF0ZSwgc2VlIGluZmxhdGVJbml0MigpIGJlbG93LCBvcgorICBpbmZsYXRlQmFjaygpIGFuZCBwZXJmb3JtIHRoZWlyIG93biBwcm9jZXNzaW5nIG9mIHRoZSBnemlwIGhlYWRlciBhbmQKKyAgdHJhaWxlci4KKworICAgIGluZmxhdGUoKSByZXR1cm5zIFpfT0sgaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0IHByb2Nlc3NlZAorICBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIFpfU1RSRUFNX0VORCBpZiB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzCisgIGJlZW4gcmVhY2hlZCBhbmQgYWxsIHVuY29tcHJlc3NlZCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQsIFpfTkVFRF9ESUNUIGlmIGEKKyAgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMKKyAgY29ycnVwdGVkIChpbnB1dCBzdHJlYW0gbm90IGNvbmZvcm1pbmcgdG8gdGhlIHpsaWIgZm9ybWF0IG9yIGluY29ycmVjdCBjaGVjaworICB2YWx1ZSksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlCisgIGlmIG5leHRfaW4gb3IgbmV4dF9vdXQgd2FzIE5VTEwpLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnksCisgIFpfQlVGX0VSUk9SIGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlIG9yIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlCisgIG91dHB1dCBidWZmZXIgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLiBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90IGZhdGFsLCBhbmQKKyAgaW5mbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGlucHV0IGFuZCBtb3JlIG91dHB1dCBzcGFjZSB0bworICBjb250aW51ZSBkZWNvbXByZXNzaW5nLiBJZiBaX0RBVEFfRVJST1IgaXMgcmV0dXJuZWQsIHRoZSBhcHBsaWNhdGlvbiBtYXkgdGhlbgorICBjYWxsIGluZmxhdGVTeW5jKCkgdG8gbG9vayBmb3IgYSBnb29kIGNvbXByZXNzaW9uIGJsb2NrIGlmIGEgcGFydGlhbCByZWNvdmVyeQorICBvZiB0aGUgZGF0YSBpcyBkZXNpcmVkLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKKyAgIHBlbmRpbmcgb3V0cHV0LgorCisgICAgIGluZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUKKyAgIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQorICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZWQgZnVuY3Rpb25zICovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB1dGlsaXR5IGZ1bmN0aW9ucyAqLworCisvKgorICAgICBUaGUgZm9sbG93aW5nIHV0aWxpdHkgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgdGhlCisgICBiYXNpYyBzdHJlYW0tb3JpZW50ZWQgZnVuY3Rpb25zLiBUbyBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlLCBzb21lCisgICBkZWZhdWx0IG9wdGlvbnMgYXJlIGFzc3VtZWQgKGNvbXByZXNzaW9uIGxldmVsIGFuZCBtZW1vcnkgdXNhZ2UsCisgICBzdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMpLiBUaGUgc291cmNlIGNvZGUgb2YgdGhlc2UKKyAgIHV0aWxpdHkgZnVuY3Rpb25zIGNhbiBlYXNpbHkgYmUgbW9kaWZpZWQgaWYgeW91IG5lZWQgc3BlY2lhbCBvcHRpb25zLgorKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzIgT0YoKHVMb25nIGFkbGVyLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBBZGxlci0zMiBjaGVja3N1bSB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZAorICAgcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgorICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAorICAgbXVjaCBmYXN0ZXIuIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOworKi8KKworLyoKKyAgICAgQ29tYmluZSB0d28gQWRsZXItMzIgY2hlY2tzdW1zIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsIHNlcTEKKyAgIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBBZGxlci0zMiBjaGVja3N1bXMgd2VyZSBjYWxjdWxhdGVkIGZvcgorICAgZWFjaCwgYWRsZXIxIGFuZCBhZGxlcjIuICBhZGxlcjMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZgorICAgc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGFkbGVyMSwgYWRsZXIyLCBhbmQgbGVuMi4KKyovCisKK1pFWFRFUk4gIHVJbnQgWkVYUE9SVCBjcmMzMiAgT0YoKHVJbnQgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBDUkMtMzIgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZQorICAgdXBkYXRlZCBDUkMtMzIuIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkIGluaXRpYWwKKyAgIHZhbHVlIGZvciB0aGUgZm9yIHRoZSBjcmMuIFByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nIChvbmUncyBjb21wbGVtZW50KSBpcworICAgcGVyZm9ybWVkIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHNvIGl0IHNob3VsZG4ndCBiZSBkb25lIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgdUxvbmcgY3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisKKyAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKKyAgICAgICBjcmMgPSBjcmMzMihjcmMsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgfQorICAgICBpZiAoY3JjICE9IG9yaWdpbmFsX2NyYykgZXJyb3IoKTsKKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyXyBPRigoel9zdHJlYW1wIHN0cm0sIGludCAgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVyc2lvbiwgaW50IHN0cmVhbV9zaXplKSk7CisjZGVmaW5lIGluZmxhdGVJbml0KHN0cm0pIFwKKwlpbmZsYXRlSW5pdF8oKHN0cm0pLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisjZGVmaW5lIGluZmxhdGVJbml0MihzdHJtLCB3aW5kb3dCaXRzKSBcCisJaW5mbGF0ZUluaXQyXygoc3RybSksICh3aW5kb3dCaXRzKSwgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorCisjaWYgIWRlZmluZWQoWlVUSUxfSCkgJiYgIWRlZmluZWQoTk9fRFVNTVlfREVDTCkKKwlzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUge2ludCBkdW1teTt9OyAvKiBoYWNrIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogWkxJQl9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvTWFrZWZpbGUgYi94LWxvYWRlci9saWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwMzQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9NYWtlZmlsZQpAQCAtMCwwICsxLDYyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChBUkNIKS5hCisKK1NPQkpTCSs9IF9hc2hsZGkzLm8KK1NPQkpTCSs9IF9kaXZzaTMubworU09CSlMJKz0gX2xzaHJkaTMubworU09CSlMJKz0gX21vZHNpMy5vCitTT0JKUwkrPSBfdWRpdnNpMy5vCitTT0JKUwkrPSBfdW1vZHNpMy5vCisKK0NPQkpTLXkgKz0gY3JjMzIubworQ09CSlMteSArPSBjdHlwZS5vCitDT0JKUy15ICs9IGRpc3BsYXlfb3B0aW9ucy5vCitDT0JKUy15CSs9IGRpdjAubworQ09CSlMteQkrPSBib2FyZC5vCitDT0JKUy15ICs9IHN0cmluZy5vCitDT0JKUy15CSs9IGVjYy5vCitDT0JKUy15CSs9IHByaW50Zi5vCitDT0JKUy15CSs9IG9tYXBfYmNoX2RlY29kZXIubworQ09CSlMteQkrPSBvbWFwX2JjaC5vCisKK0NPQkpTCTo9ICQoQ09CSlMteSkKK1NSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL19hc2hsZGkzLlMgYi94LWxvYWRlci9saWIvX2FzaGxkaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzRkZGMyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL19hc2hsZGkzLlMKQEAgLTAsMCArMSw0OCBAQAorLyogQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitsYXRlciB2ZXJzaW9uLgorCitJbiBhZGRpdGlvbiB0byB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcyB5b3UgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gbGluayB0aGUKK2NvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyBmaWxlIGludG8gY29tYmluYXRpb25zIHdpdGggb3RoZXIgcHJvZ3JhbXMsCithbmQgdG8gZGlzdHJpYnV0ZSB0aG9zZSBjb21iaW5hdGlvbnMgd2l0aG91dCBhbnkgcmVzdHJpY3Rpb24gY29taW5nCitmcm9tIHRoZSB1c2Ugb2YgdGhpcyBmaWxlLiAgKFRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJlc3RyaWN0aW9ucworZG8gYXBwbHkgaW4gb3RoZXIgcmVzcGVjdHM7IGZvciBleGFtcGxlLCB0aGV5IGNvdmVyIG1vZGlmaWNhdGlvbiBvZgordGhlIGZpbGUsIGFuZCBkaXN0cmlidXRpb24gd2hlbiBub3QgbGlua2VkIGludG8gYSBjb21iaW5lCitleGVjdXRhYmxlLikKKworVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCitCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCisKKworI2lmZGVmIF9fQVJNRUJfXworI2RlZmluZSBhbCByMQorI2RlZmluZSBhaCByMAorI2Vsc2UKKyNkZWZpbmUgYWwgcjAKKyNkZWZpbmUgYWggcjEKKyNlbmRpZgorCisuZ2xvYmwgX19hc2hsZGkzCisuZ2xvYmwJX19hZWFiaV9sbHNsCitfX2FzaGxkaTM6CitfX2FlYWJpX2xsc2w6CisKKwlzdWJzCXIzLCByMiwgIzMyCisJcnNiCWlwLCByMiwgIzMyCisJbW92bWkJYWgsIGFoLCBsc2wgcjIKKwltb3ZwbAlhaCwgYWwsIGxzbCByMworCW9ycm1pCWFoLCBhaCwgYWwsIGxzciBpcAorCW1vdglhbCwgYWwsIGxzbCByMgorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9fZGl2c2kzLlMgYi94LWxvYWRlci9saWIvX2RpdnNpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYmFkYjIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvX2RpdnNpMy5TCkBAIC0wLDAgKzEsMTQyIEBACisKKy5tYWNybyBBUk1fRElWX0JPRFkgZGl2aWRlbmQsIGRpdmlzb3IsIHJlc3VsdCwgY3VyYml0CisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNQorCisJY2x6CVxjdXJiaXQsIFxkaXZpc29yCisJY2x6CVxyZXN1bHQsIFxkaXZpZGVuZAorCXN1YglccmVzdWx0LCBcY3VyYml0LCBccmVzdWx0CisJbW92CVxjdXJiaXQsICMxCisJbW92CVxkaXZpc29yLCBcZGl2aXNvciwgbHNsIFxyZXN1bHQKKwltb3YJXGN1cmJpdCwgXGN1cmJpdCwgbHNsIFxyZXN1bHQKKwltb3YJXHJlc3VsdCwgIzAKKworI2Vsc2UKKworCUAgSW5pdGlhbGx5IHNoaWZ0IHRoZSBkaXZpc29yIGxlZnQgMyBiaXRzIGlmIHBvc3NpYmxlLAorCUAgc2V0IGN1cmJpdCBhY2NvcmRpbmdseS4gIFRoaXMgYWxsb3dzIGZvciBjdXJiaXQgdG8gYmUgbG9jYXRlZAorCUAgYXQgdGhlIGxlZnQgZW5kIG9mIGVhY2ggNCBiaXQgbmliYmxlcyBpbiB0aGUgZGl2aXNpb24gbG9vcAorCUAgdG8gc2F2ZSBvbmUgbG9vcCBpbiBtb3N0IGNhc2VzLgorCXRzdAlcZGl2aXNvciwgIzB4ZTAwMDAwMDAKKwltb3ZlcQlcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCAjMworCW1vdmVxCVxjdXJiaXQsICM4CisJbW92bmUJXGN1cmJpdCwgIzEKKworCUAgVW5sZXNzIHRoZSBkaXZpc29yIGlzIHZlcnkgYmlnLCBzaGlmdCBpdCB1cCBpbiBtdWx0aXBsZXMgb2YKKwlAIGZvdXIgYml0cywgc2luY2UgdGhpcyBpcyB0aGUgYW1vdW50IG9mIHVud2luZGluZyBpbiB0aGUgbWFpbgorCUAgZGl2aXNpb24gbG9vcC4gIENvbnRpbnVlIHNoaWZ0aW5nIHVudGlsIHRoZSBkaXZpc29yIGlzCisJQCBsYXJnZXIgdGhhbiB0aGUgZGl2aWRlbmQuCisxOgljbXAJXGRpdmlzb3IsICMweDEwMDAwMDAwCisJY21wbG8JXGRpdmlzb3IsIFxkaXZpZGVuZAorCW1vdmxvCVxkaXZpc29yLCBcZGl2aXNvciwgbHNsICM0CisJbW92bG8JXGN1cmJpdCwgXGN1cmJpdCwgbHNsICM0CisJYmxvCTFiCisKKwlAIEZvciB2ZXJ5IGJpZyBkaXZpc29ycywgd2UgbXVzdCBzaGlmdCBpdCBhIGJpdCBhdCBhIHRpbWUsIG9yCisJQCB3ZSB3aWxsIGJlIGluIGRhbmdlciBvZiBvdmVyZmxvd2luZy4KKzE6CWNtcAlcZGl2aXNvciwgIzB4ODAwMDAwMDAKKwljbXBsbwlcZGl2aXNvciwgXGRpdmlkZW5kCisJbW92bG8JXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgIzEKKwltb3ZsbwlcY3VyYml0LCBcY3VyYml0LCBsc2wgIzEKKwlibG8JMWIKKworCW1vdglccmVzdWx0LCAjMAorCisjZW5kaWYKKworCUAgRGl2aXNpb24gbG9vcAorMToJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKwlvcnJocwlccmVzdWx0LCAgIFxyZXN1bHQsICAgXGN1cmJpdAorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMxCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzEKKwlvcnJocwlccmVzdWx0LCAgIFxyZXN1bHQsICAgXGN1cmJpdCwgIGxzciAjMQorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMyCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzIKKwlvcnJocwlccmVzdWx0LCAgIFxyZXN1bHQsICAgXGN1cmJpdCwgIGxzciAjMgorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMzCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzMKKwlvcnJocwlccmVzdWx0LCAgIFxyZXN1bHQsICAgXGN1cmJpdCwgIGxzciAjMworCWNtcAlcZGl2aWRlbmQsICMwCQkJQCBFYXJseSB0ZXJtaW5hdGlvbj8KKwltb3ZuZXMJXGN1cmJpdCwgICBcY3VyYml0LCAgbHNyICM0CUAgTm8sIGFueSBtb3JlIGJpdHMgdG8gZG8/CisJbW92bmUJXGRpdmlzb3IsICBcZGl2aXNvciwgbHNyICM0CisJYm5lCTFiCisKKy5lbmRtCisKKy5tYWNybyBBUk1fRElWMl9PUkRFUiBkaXZpc29yLCBvcmRlcgorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDUKKworCWNseglcb3JkZXIsIFxkaXZpc29yCisJcnNiCVxvcmRlciwgXG9yZGVyLCAjMzEKKworI2Vsc2UKKworCWNtcAlcZGl2aXNvciwgIygxIDw8IDE2KQorCW1vdmhzCVxkaXZpc29yLCBcZGl2aXNvciwgbHNyICMxNgorCW1vdmhzCVxvcmRlciwgIzE2CisJbW92bG8JXG9yZGVyLCAjMAorCisJY21wCVxkaXZpc29yLCAjKDEgPDwgOCkKKwltb3ZocwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzciAjOAorCWFkZGhzCVxvcmRlciwgXG9yZGVyLCAjOAorCisJY21wCVxkaXZpc29yLCAjKDEgPDwgNCkKKwltb3ZocwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzciAjNAorCWFkZGhzCVxvcmRlciwgXG9yZGVyLCAjNAorCisJY21wCVxkaXZpc29yLCAjKDEgPDwgMikKKwlhZGRoaQlcb3JkZXIsIFxvcmRlciwgIzMKKwlhZGRscwlcb3JkZXIsIFxvcmRlciwgXGRpdmlzb3IsIGxzciAjMQorCisjZW5kaWYKKworLmVuZG0KKworCS5hbGlnbgk1CisuZ2xvYmwgX19kaXZzaTMKKy5nbG9ibCBfX2FlYWJpX2lkaXYKK19fZGl2c2kzOgorX19hZWFiaV9pZGl2OgorCWNtcAlyMSwgIzAKKwllb3IJaXAsIHIwLCByMQkJCUAgc2F2ZSB0aGUgc2lnbiBvZiB0aGUgcmVzdWx0LgorCWJlcQlMZGl2MAorCXJzYm1pCXIxLCByMSwgIzAJCQlAIGxvb3BzIGJlbG93IHVzZSB1bnNpZ25lZC4KKwlzdWJzCXIyLCByMSwgIzEJCQlAIGRpdmlzaW9uIGJ5IDEgb3IgLTEgPworCWJlcQkxMGYKKwltb3ZzCXIzLCByMAorCXJzYm1pCXIzLCByMCwgIzAJCQlAIHBvc2l0aXZlIGRpdmlkZW5kIHZhbHVlCisJY21wCXIzLCByMQorCWJscwkxMWYKKwl0c3QJcjEsIHIyCQkJCUAgZGl2aXNvciBpcyBwb3dlciBvZiAyID8KKwliZXEJMTJmCisKKwlBUk1fRElWX0JPRFkgcjMsIHIxLCByMCwgcjIKKworCWNtcAlpcCwgIzAKKwlyc2JtaQlyMCwgcjAsICMwCisJbW92CXBjLCBscgorCisxMDoJdGVxCWlwLCByMAkJCQlAIHNhbWUgc2lnbiA/CisJcnNibWkJcjAsIHIwLCAjMAorCW1vdglwYywgbHIKKworMTE6CW1vdmxvCXIwLCAjMAorCW1vdmVxCXIwLCBpcCwgYXNyICMzMQorCW9ycmVxCXIwLCByMCwgIzEKKwltb3YJcGMsIGxyCisKKzEyOglBUk1fRElWMl9PUkRFUiByMSwgcjIKKworCWNtcAlpcCwgIzAKKwltb3YJcjAsIHIzLCBsc3IgcjIKKwlyc2JtaQlyMCwgcjAsICMwCisJbW92CXBjLCBscgorCitMZGl2MDoKKworCXN0cglsciwgW3NwLCAjLTRdIQorCWJsCV9fZGl2MAorCW1vdglyMCwgIzAJCQlAIEFib3V0IGFzIHdyb25nIGFzIGl0IGNvdWxkIGJlLgorCWxkcglwYywgW3NwXSwgIzQKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9fbHNocmRpMy5TIGIveC1sb2FkZXIvbGliL19sc2hyZGkzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmYTc5OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9fbHNocmRpMy5TCkBAIC0wLDAgKzEsNDggQEAKKy8qIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA1CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorbGF0ZXIgdmVyc2lvbi4KKworSW4gYWRkaXRpb24gdG8gdGhlIHBlcm1pc3Npb25zIGluIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMgeW91IHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlCitjb21waWxlZCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpbnRvIGNvbWJpbmF0aW9ucyB3aXRoIG90aGVyIHByb2dyYW1zLAorYW5kIHRvIGRpc3RyaWJ1dGUgdGhvc2UgY29tYmluYXRpb25zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZworZnJvbSB0aGUgdXNlIG9mIHRoaXMgZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByZXN0cmljdGlvbnMKK2RvIGFwcGx5IGluIG90aGVyIHJlc3BlY3RzOyBmb3IgZXhhbXBsZSwgdGhleSBjb3ZlciBtb2RpZmljYXRpb24gb2YKK3RoZSBmaWxlLCBhbmQgZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGEgY29tYmluZQorZXhlY3V0YWJsZS4pCisKK1RoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworCisKKyNpZmRlZiBfX0FSTUVCX18KKyNkZWZpbmUgYWwgcjEKKyNkZWZpbmUgYWggcjAKKyNlbHNlCisjZGVmaW5lIGFsIHIwCisjZGVmaW5lIGFoIHIxCisjZW5kaWYKKworLmdsb2JsIF9fbHNocmRpMworLmdsb2JsIF9fYWVhYmlfbGxzcgorX19sc2hyZGkzOgorX19hZWFiaV9sbHNyOgorCisJc3VicwlyMywgcjIsICMzMgorCXJzYglpcCwgcjIsICMzMgorCW1vdm1pCWFsLCBhbCwgbHNyIHIyCisJbW92cGwJYWwsIGFoLCBsc3IgcjMKKwlvcnJtaQlhbCwgYWwsIGFoLCBsc2wgaXAKKwltb3YJYWgsIGFoLCBsc3IgcjIKKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvX21vZHNpMy5TIGIveC1sb2FkZXIvbGliL19tb2RzaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzljNTg0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL19tb2RzaTMuUwpAQCAtMCwwICsxLDk5IEBACisKKy5tYWNybyBBUk1fTU9EX0JPRFkgZGl2aWRlbmQsIGRpdmlzb3IsIG9yZGVyLCBzcGFyZQorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDUKKworCWNseglcb3JkZXIsIFxkaXZpc29yCisJY2x6CVxzcGFyZSwgXGRpdmlkZW5kCisJc3ViCVxvcmRlciwgXG9yZGVyLCBcc3BhcmUKKwltb3YJXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgXG9yZGVyCisKKyNlbHNlCisKKwltb3YJXG9yZGVyLCAjMAorCisJQCBVbmxlc3MgdGhlIGRpdmlzb3IgaXMgdmVyeSBiaWcsIHNoaWZ0IGl0IHVwIGluIG11bHRpcGxlcyBvZgorCUAgZm91ciBiaXRzLCBzaW5jZSB0aGlzIGlzIHRoZSBhbW91bnQgb2YgdW53aW5kaW5nIGluIHRoZSBtYWluCisJQCBkaXZpc2lvbiBsb29wLiAgQ29udGludWUgc2hpZnRpbmcgdW50aWwgdGhlIGRpdmlzb3IgaXMKKwlAIGxhcmdlciB0aGFuIHRoZSBkaXZpZGVuZC4KKzE6CWNtcAlcZGl2aXNvciwgIzB4MTAwMDAwMDAKKwljbXBsbwlcZGl2aXNvciwgXGRpdmlkZW5kCisJbW92bG8JXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgIzQKKwlhZGRsbwlcb3JkZXIsIFxvcmRlciwgIzQKKwlibG8JMWIKKworCUAgRm9yIHZlcnkgYmlnIGRpdmlzb3JzLCB3ZSBtdXN0IHNoaWZ0IGl0IGEgYml0IGF0IGEgdGltZSwgb3IKKwlAIHdlIHdpbGwgYmUgaW4gZGFuZ2VyIG9mIG92ZXJmbG93aW5nLgorMToJY21wCVxkaXZpc29yLCAjMHg4MDAwMDAwMAorCWNtcGxvCVxkaXZpc29yLCBcZGl2aWRlbmQKKwltb3ZsbwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCAjMQorCWFkZGxvCVxvcmRlciwgXG9yZGVyLCAjMQorCWJsbwkxYgorCisjZW5kaWYKKworCUAgUGVyZm9ybSBhbGwgbmVlZGVkIHN1YnN0cmFjdGlvbnMgdG8ga2VlcCBvbmx5IHRoZSByZW1pbmRlci4KKwlAIERvIGNvbXBhcmlzb25zIGluIGJhdGNoIG9mIDQgZmlyc3QuCisJc3Vicwlcb3JkZXIsIFxvcmRlciwgIzMJCUAgeWVzLCAzIGlzIGludGVuZGVkIGhlcmUKKwlibHQJMmYKKworMToJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvciwgIGxzciAjMQorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvciwgbHNyICMxCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzIKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMgorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMzCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzMKKwljbXAJXGRpdmlkZW5kLCAjMQorCW1vdglcZGl2aXNvciwgXGRpdmlzb3IsIGxzciAjNAorCXN1Ymdlcwlcb3JkZXIsIFxvcmRlciwgIzQKKwliZ2UJMWIKKworCXRzdAlcb3JkZXIsICMzCisJdGVxbmUJXGRpdmlkZW5kLCAjMAorCWJlcQk1ZgorCisJQCBFaXRoZXIgMSwgMiBvciAzIGNvbXBhcmlzb24vc3Vic3RyYWN0aW9ucyBhcmUgbGVmdC4KKzI6CWNtbglcb3JkZXIsICMyCisJYmx0CTRmCisJYmVxCTNmCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKwltb3YJXGRpdmlzb3IsICBcZGl2aXNvciwgIGxzciAjMQorMzoJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKwltb3YJXGRpdmlzb3IsICBcZGl2aXNvciwgIGxzciAjMQorNDoJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKzU6CisuZW5kbQorCisJLmFsaWduCTUKKy5nbG9ibCBfX21vZHNpMworX19tb2RzaTM6CisJY21wCXIxLCAjMAorCWJlcQlMZGl2MAorCXJzYm1pCXIxLCByMSwgIzAJCQlAIGxvb3BzIGJlbG93IHVzZSB1bnNpZ25lZC4KKwltb3ZzCWlwLCByMAkJCQlAIHByZXNlcnZlIHNpZ24gb2YgZGl2aWRlbmQKKwlyc2JtaQlyMCwgcjAsICMwCQkJQCBpZiBuZWdhdGl2ZSBtYWtlIHBvc2l0aXZlCisJc3VicwlyMiwgcjEsICMxCQkJQCBjb21wYXJlIGRpdmlzb3Igd2l0aCAxCisJY21wbmUJcjAsIHIxCQkJCUAgY29tcGFyZSBkaXZpZGVuZCB3aXRoIGRpdmlzb3IKKwltb3ZlcQlyMCwgIzAKKwl0c3RoaQlyMSwgcjIJCQkJQCBzZWUgaWYgZGl2aXNvciBpcyBwb3dlciBvZiAyCisJYW5kZXEJcjAsIHIwLCByMgorCWJscwkxMGYKKworCUFSTV9NT0RfQk9EWSByMCwgcjEsIHIyLCByMworCisxMDoJY21wCWlwLCAjMAorCXJzYm1pCXIwLCByMCwgIzAKKwltb3YJcGMsIGxyCisKKworTGRpdjA6CisKKwlzdHIJbHIsIFtzcCwgIy00XSEKKwlibAlfX2RpdjAKKwltb3YJcjAsICMwCQkJQCBBYm91dCBhcyB3cm9uZyBhcyBpdCBjb3VsZCBiZS4KKwlsZHIJcGMsIFtzcF0sICM0CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvX3VkaXZzaTMuUyBiL3gtbG9hZGVyL2xpYi9fdWRpdnNpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZGNkNDgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvX3VkaXZzaTMuUwpAQCAtMCwwICsxLDc3IEBACisvKiAjIDEgImxpYmdjYzEuUyIgKi8KK0AgbGliZ2NjMSByb3V0aW5lcyBmb3IgQVJNIGNwdS4KK0AgRGl2aXNpb24gcm91dGluZXMsIHdyaXR0ZW4gYnkgUmljaGFyZCBFYXJuc2hhdywgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKK2RpdmlkZW5kCS5yZXEJcjAKK2Rpdmlzb3IJCS5yZXEJcjEKK3Jlc3VsdAkJLnJlcQlyMgorY3VyYml0CQkucmVxCXIzCisvKiBpcAkJLnJlcQlyMTIJKi8KKy8qIHNwCQkucmVxCXIxMwkqLworLyogbHIJCS5yZXEJcjE0CSovCisvKiBwYwkJLnJlcQlyMTUJKi8KKwkudGV4dAorCS5nbG9ibAkgX191ZGl2c2kzCisJLnR5cGUgIF9fdWRpdnNpMyAgICAgICAsZnVuY3Rpb24KKwkuYWxpZ24JMAorIF9fdWRpdnNpMyAgICAgIDoKKwljbXAJZGl2aXNvciwgIzAKKwliZXEJTGRpdjAKKwltb3YJY3VyYml0LCAjMQorCW1vdglyZXN1bHQsICMwCisJY21wCWRpdmlkZW5kLCBkaXZpc29yCisJYmNjCUxnb3RfcmVzdWx0CitMb29wMToKKwlAIFVubGVzcyB0aGUgZGl2aXNvciBpcyB2ZXJ5IGJpZywgc2hpZnQgaXQgdXAgaW4gbXVsdGlwbGVzIG9mCisJQCBmb3VyIGJpdHMsIHNpbmNlIHRoaXMgaXMgdGhlIGFtb3VudCBvZiB1bndpbmRpbmcgaW4gdGhlIG1haW4KKwlAIGRpdmlzaW9uIGxvb3AuICBDb250aW51ZSBzaGlmdGluZyB1bnRpbCB0aGUgZGl2aXNvciBpcworCUAgbGFyZ2VyIHRoYW4gdGhlIGRpdmlkZW5kLgorCWNtcAlkaXZpc29yLCAjMHgxMDAwMDAwMAorCWNtcGNjCWRpdmlzb3IsIGRpdmlkZW5kCisJbW92Y2MJZGl2aXNvciwgZGl2aXNvciwgbHNsICM0CisJbW92Y2MJY3VyYml0LCBjdXJiaXQsIGxzbCAjNAorCWJjYwlMb29wMQorTGJpZ251bToKKwlAIEZvciB2ZXJ5IGJpZyBkaXZpc29ycywgd2UgbXVzdCBzaGlmdCBpdCBhIGJpdCBhdCBhIHRpbWUsIG9yCisJQCB3ZSB3aWxsIGJlIGluIGRhbmdlciBvZiBvdmVyZmxvd2luZy4KKwljbXAJZGl2aXNvciwgIzB4ODAwMDAwMDAKKwljbXBjYwlkaXZpc29yLCBkaXZpZGVuZAorCW1vdmNjCWRpdmlzb3IsIGRpdmlzb3IsIGxzbCAjMQorCW1vdmNjCWN1cmJpdCwgY3VyYml0LCBsc2wgIzEKKwliY2MJTGJpZ251bQorTG9vcDM6CisJQCBUZXN0IGZvciBwb3NzaWJsZSBzdWJ0cmFjdGlvbnMsIGFuZCBub3RlIHdoaWNoIGJpdHMKKwlAIGFyZSBkb25lIGluIHRoZSByZXN1bHQuICBPbiB0aGUgZmluYWwgcGFzcywgdGhpcyBtYXkgc3VidHJhY3QKKwlAIHRvbyBtdWNoIGZyb20gdGhlIGRpdmlkZW5kLCBidXQgdGhlIHJlc3VsdCB3aWxsIGJlIG9rLCBzaW5jZSB0aGUKKwlAICJiaXQiIHdpbGwgaGF2ZSBiZWVuIHNoaWZ0ZWQgb3V0IGF0IHRoZSBib3R0b20uCisJY21wCWRpdmlkZW5kLCBkaXZpc29yCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yCisJb3JyY3MJcmVzdWx0LCByZXN1bHQsIGN1cmJpdAorCWNtcAlkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMxCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzEKKwlvcnJjcwlyZXN1bHQsIHJlc3VsdCwgY3VyYml0LCBsc3IgIzEKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMgorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMyCisJb3JyY3MJcmVzdWx0LCByZXN1bHQsIGN1cmJpdCwgbHNyICMyCisJY21wCWRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzMKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMworCW9ycmNzCXJlc3VsdCwgcmVzdWx0LCBjdXJiaXQsIGxzciAjMworCWNtcAlkaXZpZGVuZCwgIzAJCQlAIEVhcmx5IHRlcm1pbmF0aW9uPworCW1vdm5lcwljdXJiaXQsIGN1cmJpdCwgbHNyICM0CQlAIE5vLCBhbnkgbW9yZSBiaXRzIHRvIGRvPworCW1vdm5lCWRpdmlzb3IsIGRpdmlzb3IsIGxzciAjNAorCWJuZQlMb29wMworTGdvdF9yZXN1bHQ6CisJbW92CXIwLCByZXN1bHQKKwltb3YgCXBjLCBscgorTGRpdjA6CisJc3RyCWxyLCBbc3AsICMtNF0hCisJYmwJIF9fZGl2MCAgICAgICAoUExUKQorCW1vdglyMCwgIzAJCQlAIGFib3V0IGFzIHdyb25nIGFzIGl0IGNvdWxkIGJlCisJbGRtaWEJc3AhLCB7cGN9CisJLnNpemUgIF9fdWRpdnNpMyAgICAgICAsIC4gLSAgX191ZGl2c2kzCisvKiAjIDIzNSAibGliZ2NjMS5TIiAqLworLyogIyAzMjAgImxpYmdjYzEuUyIgKi8KKy8qICMgNDIxICJsaWJnY2MxLlMiICovCisvKiAjIDQzMyAibGliZ2NjMS5TIiAqLworLyogIyA0NTYgImxpYmdjYzEuUyIgKi8KKy8qICMgNTAwICJsaWJnY2MxLlMiICovCisvKiAjIDU4MCAibGliZ2NjMS5TIiAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL191bW9kc2kzLlMgYi94LWxvYWRlci9saWIvX3Vtb2RzaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGFlYmU4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL191bW9kc2kzLlMKQEAgLTAsMCArMSw4OCBAQAorLyogIyAxICJsaWJnY2MxLlMiICovCitAIGxpYmdjYzEgcm91dGluZXMgZm9yIEFSTSBjcHUuCitAIERpdmlzaW9uIHJvdXRpbmVzLCB3cml0dGVuIGJ5IFJpY2hhcmQgRWFybnNoYXcsIChyZWFybnNoYUBhcm1sdGQuY28udWspCisvKiAjIDE0NSAibGliZ2NjMS5TIiAqLworZGl2aWRlbmQJLnJlcQlyMAorZGl2aXNvcgkJLnJlcQlyMQorb3ZlcmRvbmUJLnJlcQlyMgorY3VyYml0CQkucmVxCXIzCisvKiBpcAkJLnJlcQlyMTIJKi8KKy8qIHNwCQkucmVxCXIxMwkqLworLyogbHIJCS5yZXEJcjE0CSovCisvKiBwYwkJLnJlcQlyMTUJKi8KKwkudGV4dAorCS5nbG9ibAkgX191bW9kc2kzCisJLnR5cGUgIF9fdW1vZHNpMyAgICAgICAsZnVuY3Rpb24KKwkuYWxpZ24gMAorIF9fdW1vZHNpMyAgICAgIDoKKwljbXAJZGl2aXNvciwgIzAKKwliZXEJTGRpdjAKKwltb3YJY3VyYml0LCAjMQorCWNtcAlkaXZpZGVuZCwgZGl2aXNvcgorCW1vdmNjICAJcGMsIGxyCitMb29wMToKKwlAIFVubGVzcyB0aGUgZGl2aXNvciBpcyB2ZXJ5IGJpZywgc2hpZnQgaXQgdXAgaW4gbXVsdGlwbGVzIG9mCisJQCBmb3VyIGJpdHMsIHNpbmNlIHRoaXMgaXMgdGhlIGFtb3VudCBvZiB1bndpbmRpbmcgaW4gdGhlIG1haW4KKwlAIGRpdmlzaW9uIGxvb3AuICBDb250aW51ZSBzaGlmdGluZyB1bnRpbCB0aGUgZGl2aXNvciBpcworCUAgbGFyZ2VyIHRoYW4gdGhlIGRpdmlkZW5kLgorCWNtcAlkaXZpc29yLCAjMHgxMDAwMDAwMAorCWNtcGNjCWRpdmlzb3IsIGRpdmlkZW5kCisJbW92Y2MJZGl2aXNvciwgZGl2aXNvciwgbHNsICM0CisJbW92Y2MJY3VyYml0LCBjdXJiaXQsIGxzbCAjNAorCWJjYwlMb29wMQorTGJpZ251bToKKwlAIEZvciB2ZXJ5IGJpZyBkaXZpc29ycywgd2UgbXVzdCBzaGlmdCBpdCBhIGJpdCBhdCBhIHRpbWUsIG9yCisJQCB3ZSB3aWxsIGJlIGluIGRhbmdlciBvZiBvdmVyZmxvd2luZy4KKwljbXAJZGl2aXNvciwgIzB4ODAwMDAwMDAKKwljbXBjYwlkaXZpc29yLCBkaXZpZGVuZAorCW1vdmNjCWRpdmlzb3IsIGRpdmlzb3IsIGxzbCAjMQorCW1vdmNjCWN1cmJpdCwgY3VyYml0LCBsc2wgIzEKKwliY2MJTGJpZ251bQorTG9vcDM6CisJQCBUZXN0IGZvciBwb3NzaWJsZSBzdWJ0cmFjdGlvbnMuICBPbiB0aGUgZmluYWwgcGFzcywgdGhpcyBtYXkKKwlAIHN1YnRyYWN0IHRvbyBtdWNoIGZyb20gdGhlIGRpdmlkZW5kLCBzbyBrZWVwIHRyYWNrIG9mIHdoaWNoCisJQCBzdWJ0cmFjdGlvbnMgYXJlIGRvbmUsIHdlIGNhbiBmaXggdGhlbSB1cCBhZnRlcndhcmRzLi4uCisJbW92CW92ZXJkb25lLCAjMAorCWNtcAlkaXZpZGVuZCwgZGl2aXNvcgorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvcgorCWNtcAlkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMxCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzEKKwlvcnJjcwlvdmVyZG9uZSwgb3ZlcmRvbmUsIGN1cmJpdCwgcm9yICMxCisJY21wCWRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzIKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMgorCW9ycmNzCW92ZXJkb25lLCBvdmVyZG9uZSwgY3VyYml0LCByb3IgIzIKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMworCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMzCisJb3JyY3MJb3ZlcmRvbmUsIG92ZXJkb25lLCBjdXJiaXQsIHJvciAjMworCW1vdglpcCwgY3VyYml0CisJY21wCWRpdmlkZW5kLCAjMAkJCUAgRWFybHkgdGVybWluYXRpb24/CisJbW92bmVzCWN1cmJpdCwgY3VyYml0LCBsc3IgIzQJCUAgTm8sIGFueSBtb3JlIGJpdHMgdG8gZG8/CisJbW92bmUJZGl2aXNvciwgZGl2aXNvciwgbHNyICM0CisJYm5lCUxvb3AzCisJQCBBbnkgc3VidHJhY3Rpb25zIHRoYXQgd2Ugc2hvdWxkIG5vdCBoYXZlIGRvbmUgd2lsbCBiZSByZWNvcmRlZCBpbgorCUAgdGhlIHRvcCB0aHJlZSBiaXRzIG9mICJvdmVyZG9uZSIuICBFeGFjdGx5IHdoaWNoIHdlcmUgbm90IG5lZWRlZAorCUAgYXJlIGdvdmVybmVkIGJ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgYml0LCBzdG9yZWQgaW4gaXAuCisJQCBJZiB3ZSB0ZXJtaW5hdGVkIGVhcmx5LCBiZWNhdXNlIGRpdmlkZW5kIGJlY2FtZSB6ZXJvLAorCUAgdGhlbiBub25lIG9mIHRoZSBiZWxvdyB3aWxsIG1hdGNoLCBzaW5jZSB0aGUgYml0IGluIGlwIHdpbGwgbm90IGJlCisJQCBpbiB0aGUgYm90dG9tIG5pYmJsZS4KKwlhbmRzCW92ZXJkb25lLCBvdmVyZG9uZSwgIzB4ZTAwMDAwMDAKKwltb3ZlcSAgCXBjLCBscgkJCQlAIE5vIGZpeHVwcyBuZWVkZWQKKwl0c3QJb3ZlcmRvbmUsIGlwLCByb3IgIzMKKwlhZGRuZQlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMworCXRzdAlvdmVyZG9uZSwgaXAsIHJvciAjMgorCWFkZG5lCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMyCisJdHN0CW92ZXJkb25lLCBpcCwgcm9yICMxCisJYWRkbmUJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzEKKwltb3YgCXBjLCBscgorTGRpdjA6CisJc3RyCWxyLCBbc3AsICMtNF0hCisJYmwJIF9fZGl2MCAgICAgICAoUExUKQorCW1vdglyMCwgIzAJCQlAIGFib3V0IGFzIHdyb25nIGFzIGl0IGNvdWxkIGJlCisJbGRtaWEJc3AhLCB7cGN9CisJLnNpemUgIF9fdW1vZHNpMyAgICAgICAsIC4gLSAgX191bW9kc2kzCisvKiAjIDMyMCAibGliZ2NjMS5TIiAqLworLyogIyA0MjEgImxpYmdjYzEuUyIgKi8KKy8qICMgNDMzICJsaWJnY2MxLlMiICovCisvKiAjIDQ1NiAibGliZ2NjMS5TIiAqLworLyogIyA1MDAgImxpYmdjYzEuUyIgKi8KKy8qICMgNTgwICJsaWJnY2MxLlMiICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvYm9hcmQuYyBiL3gtbG9hZGVyL2xpYi9ib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTM1ODQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvYm9hcmQuYwpAQCAtMCwwICsxLDQ4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUZXhhcyBJbnN0cnVtZW50cy4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIEppYW4gWmhhbmcsIFRleGFzIEluc3RydW1lbnRzLCBqemhhbmdAdGkuY29tLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMi0yMDA2CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGJvb3RtLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgPGltYWdlLmg+CisjaW5jbHVkZSA8bW1jLmg+CisjaW5jbHVkZSA8dGltZXN0YW1wLmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisvKgorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zCisgKi8KKyNpZm5kZWYgQ09ORklHX0lERU5UX1NUUklORworI2RlZmluZSBDT05GSUdfSURFTlRfU1RSSU5HICIiCisjZW5kaWYKKworLyogVHlwZSBEZWZpbml0aW9uICovCisKK3R5cGVkZWYgaW50IChpbml0X2ZuY190KSh2b2lkKTsKKworLyoKKyAqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqLworZXh0ZXJuIGludCBtaXNjX2luaXRfciAodm9pZCk7CitleHRlcm4gaW50IG1tY19pbml0KGludCB2ZXJib3NlKTsKK2V4dGVybiBibG9ja19kZXZfZGVzY190ICptbWNfZ2V0X2RldihpbnQgZGV2KTsKK2V4dGVybiBpbnQgZ2V0X2Jvb3RfZGV2aWNlc19saXN0KGNvbnN0IHUzMioqIGRldmljZXNfbGlzdCk7CisKKy8qCisgKiBHbG9iYWwgVmFyaWFibGVzCisgKi8KK2NvbnN0IGNoYXIgdmVyc2lvbl9zdHJpbmdbXSA9CisJWF9MT0FERVJfVkVSU0lPTiIgKCIgWF9MT0FERVJfREFURSAiIC0gIiBYX0xPQURFUl9USU1FICIpIkNPTkZJR19JREVOVF9TVFJJTkc7CisKK2luaXRfZm5jX3QgKmluaXRfc2VxdWVuY2VbXSA9IHsKKwljcHVfaW5pdCwJCS8qIGJhc2ljIGNwdSBkZXBlbmRlbnQgc2V0dXAgKi8KKwlib2FyZF9pbml0LAkJLyogYmFzaWMgYm9hcmQgZGVwZW5kZW50IHNldHVwICovCisjaWZkZWYgQ0ZHX1BSSU5URgorIAlzZXJpYWxfaW5pdCwJCS8qIHNlcmlhbCBjb21tdW5pY2F0aW9ucyBzZXR1cCAqLworCWRpc3BsYXlfb3B0aW9ucywKKyNlbmRpZgorICAJbmFuZF9pbml0LAkJLyogYm9hcmQgc3BlY2lmaWMgbmFuZCBpbml0ICovCisgIAlOVUxMLAorfTsKKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfbG9hZF9wYXJhbXMoY29uc3QgdWludDhfdCAqYnVmZmVyLCBjb25zdCBpbnQgKmluZGV4LCBpbnQgY291bnQpCit7CisJaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IGluZGV4ID09IE5VTEwgfHwgY291bnQgPT0gMCB8fCAqaW5kZXggPCBCT09UTV9JTkRFWF9TVEFSVCB8fCAqaW5kZXggPj0gY291bnQpIHsKKwkJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJcmV0dXJuIChCT09UTV9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKyNpZiAoZGVmaW5lZChDRkdfTU1DX09ORU5BTkQpIHx8IGRlZmluZWQgKENGR19NTUNfTkFORCkpICYmIGRlZmluZWQoQ0ZHX0NNRF9GQVQpCisvKgorICogIGludCBmYXRfbG9hZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIHJlYWQgZnJvbSB0aGUgZmlyc3QgaW5pdGlhbGl6ZWQKKyAqICAgIE11bHRpbWVkaWEgQ2FyZCAoTU1DKSBkZXZpY2UsIG9uZSBvZiBvbmUgb3IgbW9yZSBkZXNpZ25hdGVkCisgKiAgICBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXJzIChTUEwpIGZyb20gdGhlIGEgRkFUIGZpbGUgc3lzdGVtIG9uCisgKiAgICB0aGUgZmlyc3QgcGFydGl0aW9uIG9mIGEgTWFzdGVyIEJvb3QgUmVjb3JkIHZvbHVtZS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlci4KKyAqICAgIGluZGV4ICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgYm9vdCBmaWxlIHRvIGF0dGVtcHQgdG8gbG9hZC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIuCisgKiAgICBpbmRleCAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGJvb3QgZmlsZSB0bworICogICAgICAgICAgICAgYXR0ZW1wdCB0byBsb2FkLgorICoKKyAqICBSZXR1cm5zOgorICogICAgQk9PVE1fU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2Vzczsgb3RoZXJ3aXNlLCBCT09UTV9TVEFUVVNfRkFJTFVSRQorICogICAgb24gZXJyb3IuCisgKgorICovCitzdGF0aWMgaW50IGZhdF9sb2FkKHVpbnQ4X3QgKmJ1ZmZlciwgaW50ICppbmRleCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19CT09URklMRSkKKwljb25zdCBjaGFyICogY29uc3QgZmlsZXNbXSA9IHsgQ09ORklHX0JPT1RGSUxFIH07CisjZWxpZiBkZWZpbmVkKENPTkZJR19CT09URklMRV9MSVNUKSAmJiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkKKwljb25zdCBjaGFyICogY29uc3QgZmlsZXNbXSA9IENPTkZJR19CT09URklMRV9MSVNUOworI2Vsc2UKKwljb25zdCBjaGFyICogY29uc3QgZmlsZXNbXSA9IHsgTlVMTCB9OworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0JPT1RGSUxFKSAqLworCWNvbnN0IGNoYXIgKiBmaWxlID0gTlVMTDsKKwljb25zdCBjaGFyICogZmFpbHVyZSA9IE5VTEw7CisJY29uc3QgaW50IGNvdW50ID0gQVJSQVlfU0laRShmaWxlcyk7CisJY29uc3QgaW50IGRldmljZSA9IDA7CisJY29uc3QgaW50IHBhcnRpdGlvbiA9IDE7CisJY29uc3QgaW50IG1heHNpemUgPSAwOworCWNvbnN0IGludCB2ZXJib3NlID0gMTsKKwlsb25nIHNpemUgPSAwOworCWJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7CisKKwlpZiAoIWNoZWNrX2xvYWRfcGFyYW1zKGJ1ZmZlciwgaW5kZXgsIGNvdW50KSkgeworCQlyZXR1cm4gKEJPT1RNX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwlmaWxlID0gZmlsZXNbKCppbmRleCkrK107CisKKwlpZiAoKmluZGV4ID49IGNvdW50KSB7CisJCSppbmRleCA9IEJPT1RNX0lOREVYX1NUT1A7CisJfQorCisJc3RhdHVzID0gbW1jX2luaXQodmVyYm9zZSk7CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJZmFpbHVyZSA9ICJNTUMgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iOworCQlnb3RvIGZhaWw7CisJfQorCisgICAgZGV2X2Rlc2MgPSBtbWNfZ2V0X2RldihkZXZpY2UpOworCisgICAgaWYgKGRldl9kZXNjID09IE5VTEwpIHsKKwkJZmFpbHVyZSA9ICJDb3VsZCBub3QgYWNjZXNzIE1NQyBkZXZpY2VcbiI7CisJCWdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmYXRfcmVnaXN0ZXJfZGV2aWNlKGRldl9kZXNjLCBwYXJ0aXRpb24pOworCisJc2l6ZSA9IGZpbGVfZmF0X3JlYWQoZmlsZSwgYnVmZmVyLCBtYXhzaXplKTsKKworCWlmIChzaXplID09IC0xKSB7CisJCXByaW50ZigiQ291bGQgbm90IHJlYWQgZmlsZSBcIiVzXCJcbiIsIGZpbGUpOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpbnRmKCJcbiVsZCBieXRlcyByZWFkXG4iLCBzaXplKTsKKworCXByaW50ZigiTG9hZGluZyBmcm9tIE1NQyVkLCBmaWxlIFwiJXNcIlxuIiwgZGV2aWNlLCBmaWxlKTsKKworCXJldHVybiAoQk9PVE1fU1RBVFVTX1NVQ0NFU1MpOworCisgZmFpbDoKKwlpZiAoZmFpbHVyZSAhPSBOVUxMKSB7CisJCXB1dHMoZmFpbHVyZSk7CisJfQorCisJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7Cit9CisjZW5kaWYgLyogKGRlZmluZWQoQ0ZHX01NQ19PTkVOQU5EKSB8fCBkZWZpbmVkIChDRkdfTU1DX05BTkQpKSAmJiBkZWZpbmVkKENGR19DTURfRkFUKSAqLworCisvKgorICogIGludCBibG9ja19sb2FkKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gcmVhZCBmcm9tIGEgYmxvY2sgZGV2aWNlIG9uZSBvZiBvbmUgb3IKKyAqICAgIG1vcmUgZGVzaWduYXRlZCBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXJzIChTUEwpIHNwZWNpZmllZCBieSB0aGUKKyAqICAgIGFycmF5IG9mIGJsb2NrIGV4dGVudHMuCisgKgorICogIElucHV0KHMpOgorICogICAgYnVmZmVyICAgICAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgc2Vjb25kYXJ5IHByb2dyYW0KKyAqICAgICAgICAgICAgICAgICBsb2FkZXIuCisgKiAgICBpbmRleCAgICAgIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBvZiBib290IGV4dGVudCB0byBhdHRlbXB0IHRvCisgKiAgICAgICAgICAgICAgICAgbG9hZC4KKyAqICAgIGNvdW50ICAgICAgLSBUaGUgdG90YWwgbnVtYmVyIG9mIGV4dGVudHMuCisgKiAgICBleHRlbnRzICAgIC0gVGhlIGFycmF5IG9mIGJvb3QgZmlsZSBleHRlbnRzIHRvIGF0dGVtcHQgdG8gbG9hZC4KKyAqICAgIGRldmljZSAgICAgLSBBIHBvaW50ZXIgdG8gYSBDIHN0cmluZyBkZXNjcmliaW5nIHRoZSBibG9jayBkZXZpY2UgCisgKiAgICAgICAgICAgICAgICAgYmVpbmcgbG9hZGVkIGZyb20uCisgKiAgICByZWFkICAgICAgIC0gQSBwb2ludGVyIHRvIHRoZSBkZXZpY2Utc3BlY2lmaWMgZnVuY3Rpb24gdGhhdCB3aWxsCisgKiAgICAgICAgICAgICAgICAgcmVhZCB0aGUgYmxvY2tzIHRvIGxvYWQuCisgKiAgICBibG9ja19zaXplIC0gVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgZGV2aWNlJ3MgZnVuZGFtZW50YWwgcmVhZAorICogICAgICAgICAgICAgICAgIGJsb2NrIHNpemUuCisgKiAgICAKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYnVmZmVyICAgICAtIEEgcG9pbnRlciB0byB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyLgorICogICAgaW5kZXggICAgICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgdGhlIG5leHQgYm9vdCBleHRlbnQgdG8KKyAqICAgICAgICAgICAgICAgICBhdHRlbXB0IHRvIGxvYWQuCisgKgorICogIFJldHVybnM6CisgKiAgICBCT09UTV9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzOyBvdGhlcndpc2UsIEJPT1RNX1NUQVRVU19GQUlMVVJFCisgKiAgICBvbiBlcnJvci4KKyAqCisgKi8KK3N0YXRpYyBpbnQgYmxvY2tfbG9hZCh1aW50OF90ICpidWZmZXIsIGludCAqaW5kZXgsIGludCBjb3VudCwgY29uc3QgYm9vdF9leHRlbnRfdCBleHRlbnRzW10sIGNvbnN0IGNoYXIgKmRldmljZSwgaW50ICgqcmVhZCkodW5zaWduZWQgY2hhciAqLCB1bG9uZyksIHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSkKK3sKKwljb25zdCBib290X2V4dGVudF90ICpleHRlbnQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKwlpbnQgcmVhZF9zdGF0dXM7CisKKwlpZiAoIWNoZWNrX2xvYWRfcGFyYW1zKGJ1ZmZlciwgaW5kZXgsIGNvdW50KSkgeworCQlyZXR1cm4gKEJPT1RNX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwlleHRlbnQgPSAmZXh0ZW50c1soKmluZGV4KSsrXTsKKworCWlmICgqaW5kZXggPj0gY291bnQpIHsKKwkJKmluZGV4ID0gQk9PVE1fSU5ERVhfU1RPUDsKKwl9CisKKwllbmQgPSBleHRlbnQtPnN0YXJ0ICsgZXh0ZW50LT5zaXplICsgMTsKKworCWZvciAoYWRkcmVzcyA9IGV4dGVudC0+c3RhcnQ7IGFkZHJlc3MgPCBlbmQ7IGFkZHJlc3MgKz0gYmxvY2tfc2l6ZSkgeworCQlyZWFkX3N0YXR1cyA9IHJlYWQoYnVmZmVyLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAKKwkJLyogSWYgc3VjY2Vzc2Z1bCwgbW92ZSB0aGUgZGF0YSBwb2ludGVyLiAgSWYgRUNDIGZhaWxzLAorCQkgKiByZXBvcnQgZmFpbHVyZSB0byBjYWxsZXIuICBJZiBza2lwcGluZyBiYWQgYmxvY2ssCisJCSAqIGp1c3QgY29udGludWUgbG9vcGluZyB3aXRob3V0IG1vdmluZyB0aGUgZGF0YSBwb2ludGVyLgorCQkgKi8KKwkJaWYgKHJlYWRfc3RhdHVzID09IE5BTkRfUkVBRF9TVUNDRVNTKQorCQl7CisJCQlidWZmZXIgKz0gYmxvY2tfc2l6ZTsKKwkJfQorCQllbHNlIGlmIChyZWFkX3N0YXR1cyA9PSBOQU5EX1JFQURfRUNDX0ZBSUxVUkUpCisJCXsKKwkJCXJldHVybiAoQk9PVE1fU1RBVFVTX0ZBSUxVUkUpOworCQl9CisJfQorCisJcHJpbnRmKCJMb2FkaW5nIGZyb20gJXMsIG9mZnNldCAlIzA4bHhcbiIsIGRldmljZSwgZXh0ZW50LT5zdGFydCk7CisKKwlyZXR1cm4gKEJPT1RNX1NUQVRVU19TVUNDRVNTKTsKK30KKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfT05FTkFORCkKKy8qCisgKiAgaW50IG9uZW5hbmRfbG9hZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIHJlYWQgZnJvbSBhIE9uZU5BTkQgZGV2aWNlIG9uZSBvZiBvbmUgb3IKKyAqICAgIG1vcmUgZGVzaWduYXRlZCBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXJzIChTUEwpIHNwZWNpZmllZCBieSB0aGUKKyAqICAgIGFycmF5IG9mIGJsb2NrIGV4dGVudHMuCisgKgorICogIElucHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbQorICogICAgICAgICAgICAgbG9hZGVyLgorICogICAgaW5kZXggIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBvZiBib290IGV4dGVudCB0byBhdHRlbXB0IHRvCisgKiAgICAgICAgICAgICBsb2FkLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlci4KKyAqICAgIGluZGV4ICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgdGhlIG5leHQgYm9vdCBleHRlbnQgdG8KKyAqICAgICAgICAgICAgIGF0dGVtcHQgdG8gbG9hZC4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIEJPT1RNX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSwgQk9PVE1fU1RBVFVTX0ZBSUxVUkUKKyAqICAgIG9uIGVycm9yLgorICoKKyAqLworc3RhdGljIGludCBvbmVuYW5kX2xvYWQodWludDhfdCAqYnVmZmVyLCBpbnQgKmluZGV4KQoreworI2lmIGRlZmluZWQoQ09ORklHX09ORU5BTkRfQk9PVEVYVEVOVCkKKwljb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSA9IHsgQ09ORklHX09ORU5BTkRfQk9PVEVYVEVOVCB9OworI2VsaWYgZGVmaW5lZChDT05GSUdfT05FTkFORF9CT09URVhURU5UX0xJU1QpICYmIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKQorCWNvbnN0IGJvb3RfZXh0ZW50X3QgZXh0ZW50c1tdID0gQ09ORklHX09ORU5BTkRfQk9PVEVYVEVOVF9MSVNUOworI2Vsc2UKKwljb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSA9IHsgTlVMTCB9OworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX09ORU5BTkRfQk9PVEVYVEVOVCkgKi8KKworCXJldHVybiBibG9ja19sb2FkKGJ1ZmZlciwKKwkJCQkJICBpbmRleCwKKwkJCQkJICBBUlJBWV9TSVpFKGV4dGVudHMpLAorCQkJCQkgIGV4dGVudHMsCisJCQkJCSAgIk9uZU5BTkQiLAorCQkJCQkgIG9uZW5hbmRfcmVhZF9ibG9jaywKKwkJCQkJICBPTkVOQU5EX0JMT0NLX1NJWkUpOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX0dQTUNfT05FTkFORCkgKi8KKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfTkFORCkKKy8qCisgKiAgaW50IG5hbmRfbG9hZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIHJlYWQgZnJvbSBhIE5BTkQgZGV2aWNlIG9uZSBvZiBvbmUgb3IKKyAqICAgIG1vcmUgZGVzaWduYXRlZCBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXJzIChTUEwpIHNwZWNpZmllZCBieSB0aGUKKyAqICAgIGFycmF5IG9mIGJsb2NrIGV4dGVudHMuCisgKgorICogIElucHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbQorICogICAgICAgICAgICAgbG9hZGVyLgorICogICAgaW5kZXggIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBvZiBib290IGV4dGVudCB0byBhdHRlbXB0IHRvCisgKiAgICAgICAgICAgICBsb2FkLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlci4KKyAqICAgIGluZGV4ICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgdGhlIG5leHQgYm9vdCBleHRlbnQgdG8KKyAqICAgICAgICAgICAgIGF0dGVtcHQgdG8gbG9hZC4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIEJPT1RNX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSwgQk9PVE1fU1RBVFVTX0ZBSUxVUkUKKyAqICAgIG9uIGVycm9yLgorICoKKyAqLworc3RhdGljIGludCBuYW5kX2xvYWQodWludDhfdCAqYnVmZmVyLCBpbnQgKmluZGV4KQoreworI2lmIGRlZmluZWQoQ09ORklHX05BTkRfQk9PVEVYVEVOVCkKKwljb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSA9IHsgQ09ORklHX05BTkRfQk9PVEVYVEVOVCB9OworI2VsaWYgZGVmaW5lZChDT05GSUdfTkFORF9CT09URVhURU5UX0xJU1QpICYmIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKQorCWNvbnN0IGJvb3RfZXh0ZW50X3QgZXh0ZW50c1tdID0gQ09ORklHX05BTkRfQk9PVEVYVEVOVF9MSVNUOworI2Vsc2UKKwljb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSA9IHsgTlVMTCB9OworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX05BTkRfQk9PVEVYVEVOVCkgKi8KKworCXJldHVybiBibG9ja19sb2FkKGJ1ZmZlciwKKwkJCQkJICBpbmRleCwKKwkJCQkJICBBUlJBWV9TSVpFKGV4dGVudHMpLAorCQkJCQkgIGV4dGVudHMsCisJCQkJCSAgIk5BTkQiLAorCQkJCQkgIG5hbmRfcmVhZF9ibG9jaywKKwkJCQkJICBOQU5EX0JMT0NLX1NJWkUpOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX0dQTUNfTkFORCkgKi8KKworLyoKKyAqICB2b2lkIGRvX2FybV9ib290KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gYm9vdCB0aGUgc3lzdGVtIGZyb20gdGhlIHNwZWNpZmllZAorICogICAgYm9vdCBkZXZpY2UgYWZ0ZXIgY29weWluZyB0aGUgc2Vjb25kYXJ5LXByb2dyYW0gbG9hZGVyIGludG8KKyAqICAgIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGJ1ZmZlci4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHNlY29uZGFyeSBwcm9ncmFtCisgKiAgICAgICAgICAgICBsb2FkZXIuCisgKiAgICB0eXBlICAgLSBUaGUgYm9vdCBkZXZpY2UgdG8gYm9vdCBmcm9tLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlci4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLworc3RhdGljIHZvaWQgZG9fYXJtX2Jvb3QodWludDhfdCAqYnVmZmVyLCB1MzIgdHlwZSkKK3sKKwlpbnQgaW5kZXggPSBCT09UTV9JTkRFWF9TVEFSVDsKKyAJaW50IHN0YXR1cyA9IEJPT1RNX1NUQVRVU19GQUlMVVJFOworCWRldmljZV9sb2FkIGxvYWRfaW1hZ2UgPSBOVUxMOworCisJLyogRGV0ZXJtaW5lLCBiYXNlZCBvbiB0aGUgYm9vdCBzZXR0aW5nLCB0aGUgc291cmNlIHdlIGFyZSBnb2luZworCSAqIHRvIGF0dGVtcHQgdG8gYm9vdCBmcm9tLgorCSAqLworCisJc3dpdGNoICh0eXBlKSB7CisKKyNpZiAoKGRlZmluZWQoQ0ZHX01NQ19PTkVOQU5EKSB8fCBkZWZpbmVkIChDRkdfTU1DX05BTkQpKSAmJiBkZWZpbmVkKENGR19DTURfRkFUKSkKKwljYXNlIE1NQ19OQU5EOgorCWNhc2UgTU1DX09ORU5BTkQ6CisJCWxvYWRfaW1hZ2UgPSBmYXRfbG9hZDsKKwkJYnJlYWs7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfT05FTkFORCkKKwljYXNlIEdQTUNfT05FTkFORDoKKwkJbG9hZF9pbWFnZSA9IG9uZW5hbmRfbG9hZDsKKwkJYnJlYWs7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfTkFORCkKKwljYXNlIEdQTUNfTkFORDoKKwkJbG9hZF9pbWFnZSA9IG5hbmRfbG9hZDsKKwkJYnJlYWs7CisjZW5kaWYKKworCWRlZmF1bHQ6CisJCWdvdG8gZmFpbDsKKworCX0KKworCS8qIEF0dGVtcHQgdG8gbG9hZCBhbmQgYm9vdCBhbnkgY29uZmlndXJlZCBpbWFnZXMgdW50aWwgd2UKKwkgKiBzdWNjZXNzZnVsbHkgYm9vdCBvciB1bnRpbCB3ZSd2ZSBleGhhdXN0ZWQgYWxsIHBvc3NpYmxlIGltYWdlcy4KKwkgKi8KKworCWRvIHsKKwkJc3RhdHVzID0gbG9hZF9pbWFnZShidWZmZXIsICZpbmRleCk7CisKKwkJaWYgKGJvb3RtX2xvYWRfc3VjY2Vzc2Z1bChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPSBib290bShidWZmZXIpOworCQl9CisKKwl9IHdoaWxlIChib290bV9sb2FkX2NvbnRpbnVlKHN0YXR1cywgaW5kZXgpKTsKK2ZhaWw6CisJcmV0dXJuOworfQorCit2b2lkIHN0YXJ0X2FybWJvb3QgKHZvaWQpCit7CisJY29uc3QgdTMyKiBkZXZpY2VzX2xpc3QgPSBOVUxMOworCWludCBkZXZJZHg7CisJaW50IGJvb3RfZGV2aWNlc19jb3VudCA9IGdldF9ib290X2RldmljZXNfbGlzdCgmZGV2aWNlc19saXN0KTsKKwljb25zdCBjaGFyICogYm9vdF9uYW1lID0gTlVMTDsKKwlpbml0X2ZuY190ICoqaW5pdF9mbmNfcHRyOworCXVpbnQ4X3QgKmJ1ZmZlciA9ICh1aW50OF90ICopQ0ZHX0xPQURBRERSOworCisgICAJZm9yIChpbml0X2ZuY19wdHIgPSBpbml0X3NlcXVlbmNlOyAqaW5pdF9mbmNfcHRyOyArK2luaXRfZm5jX3B0cikgeworCQlpZiAoKCppbml0X2ZuY19wdHIpKCkgIT0gMCkgeworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJbWlzY19pbml0X3IoKTsKKworCWZvciggZGV2SWR4ID0gMDsgZGV2SWR4IDwgYm9vdF9kZXZpY2VzX2NvdW50OyBkZXZJZHgrKyApCisJeworCQl1MzIgYm9vdF9kZXYgPSBkZXZpY2VzX2xpc3RbZGV2SWR4XTsKKwkJc3dpdGNoIChib290X2RldikgeworCisJCWNhc2UgTU1DX05BTkQ6CisJCWNhc2UgTU1DX09ORU5BTkQ6CisJCQlib290X25hbWUgPSAiTU1DIjsKKwkJCWJyZWFrOworCisJCWNhc2UgR1BNQ19PTkVOQU5EOgorCQkJYm9vdF9uYW1lID0gIk9uZU5BTkQiOworCQkJYnJlYWs7CisKKwkJY2FzZSBHUE1DX05BTkQ6CisJCQlib290X25hbWUgPSAiTkFORCI7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUEVSSVBIRVJBTDoKKwkJCWJvb3RfbmFtZSA9ICIiOworCQkJcHJpbnRmKCJUcnlpbmcgbG9hZCBmcm9tIFVTQlxuIik7CisJCQlkb191c2IoKTsgIC8qIGNoZWNrIGZvciB1c2IgZG93bmxvYWQgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYm9vdF9uYW1lID0gIjx1bmtub3duPiI7CisJCQlicmVhazsKKworCQl9CisKKwkJZGVidWcoIlRyeWluZyBYLUxvYWRlciBvbiAlc1xuIiwgYm9vdF9uYW1lKTsKKwkJLyogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuLiAqLworCQlkb19hcm1fYm9vdChidWZmZXIsIGJvb3RfZGV2KTsKKwl9CisKKwkvKiBJZiBmb3Igc29tZSByZWFzb24gaXQgZG9lcywgd2UgaGF2ZSBvbmx5IG9uZSBjaG9pY2UsIGhhbmcuICovCisJcHV0cygiSW1hZ2VzIGV4aGF1c3RlZFxuIik7CitmYWlsOgorCWhhbmcoKTsKK30KKwordm9pZCBoYW5nICh2b2lkKQoreworCS8qIGNhbGwgYm9hcmQgc3BlY2lmaWMgaGFuZyBmdW5jdGlvbiAqLworCWJvYXJkX2hhbmcoKTsKKworCS8qIGlmIGJvYXJkX2hhbmcoKSByZXR1cm5zLCBoYW5nZSBoZXJlICovCisJcHV0cygiWC1Mb2FkZXIgaGFuZ3NcbiIpOworCisJZm9yICg7Oyk7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvYm9vdG0uYyBiL3gtbG9hZGVyL2xpYi9ib290bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDEzMjEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvYm9vdG0uYwpAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBFcmlrIE1vdXcgKEouQS5LLk1vdXdAaXRzLnR1ZGVsZnQubmwpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcJIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGltYWdlLmg+CisjaW5jbHVkZSA8dS1ib290L3psaWIuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgZGVmaW5lZCAoQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0NNRExJTkVfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0lOSVRSRF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfU0VSSUFMX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19SRVZJU0lPTl9UQUcpCitzdGF0aWMgdm9pZCBzZXR1cF9zdGFydF90YWcgKGJkX3QgKmJkKTsKKworIyBpZmRlZiBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MKK3N0YXRpYyB2b2lkIHNldHVwX21lbW9yeV90YWdzIChiZF90ICpiZCk7CisjIGVuZGlmCitzdGF0aWMgdm9pZCBzZXR1cF9jb21tYW5kbGluZV90YWcgKGJkX3QgKmJkLCBjaGFyICpjb21tYW5kbGluZSk7CisKKyMgaWZkZWYgQ09ORklHX0lOSVRSRF9UQUcKK3N0YXRpYyB2b2lkIHNldHVwX2luaXRyZF90YWcgKGJkX3QgKmJkLCB1bG9uZyBpbml0cmRfc3RhcnQsCisJCQkgICAgICB1bG9uZyBpbml0cmRfZW5kKTsKKyMgZW5kaWYKK3N0YXRpYyB2b2lkIHNldHVwX2VuZF90YWcgKGJkX3QgKmJkKTsKKworc3RhdGljIHN0cnVjdCB0YWcgKnBhcmFtczsKKyNlbmRpZiAvKiBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgfHwgQ09ORklHX0NNRExJTkVfVEFHIHx8IENPTkZJR19JTklUUkRfVEFHICovCisKK2ludCBkb19ib290bV9saW51eChpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10sIGJvb3RtX2hlYWRlcnNfdCAqaW1hZ2VzKQoreworCWJkX3QJKmJkID0gZ2QtPmJkOworCWNoYXIJKnM7CisJaW50CW1hY2hpZCA9IGJkLT5iaV9hcmNoX251bWJlcjsKKwl2b2lkCSgqdGhlS2VybmVsKShpbnQgemVybywgaW50IGFyY2gsIHVpbnQgcGFyYW1zKTsKKworI2lmZGVmIENPTkZJR19DTURMSU5FX1RBRworCWNoYXIgKmNvbW1hbmRsaW5lID0gZ2V0ZW52ICgiYm9vdGFyZ3MiKTsKKyNlbmRpZgorCisJaWYgKChmbGFnICE9IDApICYmIChmbGFnICE9IEJPT1RNX1NUQVRFX09TX0dPKSkKKwkJcmV0dXJuIDE7CisKKwl0aGVLZXJuZWwgPSAodm9pZCAoKikoaW50LCBpbnQsIHVpbnQpKWltYWdlcy0+ZXA7CisKKwlzID0gZ2V0ZW52ICgibWFjaGlkIik7CisJaWYgKHMpIHsKKwkJbWFjaGlkID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDE2KTsKKwkJcHJpbnRmICgiVXNpbmcgbWFjaGlkIDB4JXggZnJvbSBlbnZpcm9ubWVudFxuIiwgbWFjaGlkKTsKKwl9CisKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDE1KTsKKworCWRlYnVnICgiIyMgVHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gTGludXggKGF0IGFkZHJlc3MgJTA4bHgpIC4uLlxuIiwKKwkgICAgICAgKHVsb25nKSB0aGVLZXJuZWwpOworCisjaWYgZGVmaW5lZCAoQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0NNRExJTkVfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0lOSVRSRF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfU0VSSUFMX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19SRVZJU0lPTl9UQUcpCisJc2V0dXBfc3RhcnRfdGFnIChiZCk7CisjaWZkZWYgQ09ORklHX1NFUklBTF9UQUcKKwlzZXR1cF9zZXJpYWxfdGFnICgmcGFyYW1zKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19SRVZJU0lPTl9UQUcKKwlzZXR1cF9yZXZpc2lvbl90YWcgKCZwYXJhbXMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTCisJc2V0dXBfbWVtb3J5X3RhZ3MgKGJkKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DTURMSU5FX1RBRworCXNldHVwX2NvbW1hbmRsaW5lX3RhZyAoYmQsIGNvbW1hbmRsaW5lKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JTklUUkRfVEFHCisJaWYgKGltYWdlcy0+cmRfc3RhcnQgJiYgaW1hZ2VzLT5yZF9lbmQpCisJCXNldHVwX2luaXRyZF90YWcgKGJkLCBpbWFnZXMtPnJkX3N0YXJ0LCBpbWFnZXMtPnJkX2VuZCk7CisjZW5kaWYKKwlzZXR1cF9lbmRfdGFnIChiZCk7CisjZW5kaWYKKworCS8qIHdlIGFzc3VtZSB0aGF0IHRoZSBrZXJuZWwgaXMgaW4gcGxhY2UgKi8KKwlwcmludGYgKCJcblN0YXJ0aW5nIGtlcm5lbCAuLi5cblxuIik7CisKKyNpZmRlZiBDT05GSUdfVVNCX0RFVklDRQorCXsKKwkJZXh0ZXJuIHZvaWQgdWRjX2Rpc2Nvbm5lY3QgKHZvaWQpOworCQl1ZGNfZGlzY29ubmVjdCAoKTsKKwl9CisjZW5kaWYKKworCWNsZWFudXBfYmVmb3JlX2xpbnV4ICgpOworCisJdGhlS2VybmVsICgwLCBtYWNoaWQsIGJkLT5iaV9ib290X3BhcmFtcyk7CisJLyogZG9lcyBub3QgcmV0dXJuICovCisKKwlyZXR1cm4gMTsKK30KKworCisjaWYgZGVmaW5lZCAoQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0NNRExJTkVfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0lOSVRSRF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfU0VSSUFMX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19SRVZJU0lPTl9UQUcpCitzdGF0aWMgdm9pZCBzZXR1cF9zdGFydF90YWcgKGJkX3QgKmJkKQoreworCXBhcmFtcyA9IChzdHJ1Y3QgdGFnICopIGJkLT5iaV9ib290X3BhcmFtczsKKworCXBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfQ09SRTsKKwlwYXJhbXMtPmhkci5zaXplID0gdGFnX3NpemUgKHRhZ19jb3JlKTsKKworCXBhcmFtcy0+dS5jb3JlLmZsYWdzID0gMDsKKwlwYXJhbXMtPnUuY29yZS5wYWdlc2l6ZSA9IDA7CisJcGFyYW1zLT51LmNvcmUucm9vdGRldiA9IDA7CisKKwlwYXJhbXMgPSB0YWdfbmV4dCAocGFyYW1zKTsKK30KKworCisjaWZkZWYgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTCitzdGF0aWMgdm9pZCBzZXR1cF9tZW1vcnlfdGFncyAoYmRfdCAqYmQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX05SX0RSQU1fQkFOS1M7IGkrKykgeworCQlwYXJhbXMtPmhkci50YWcgPSBBVEFHX01FTTsKKwkJcGFyYW1zLT5oZHIuc2l6ZSA9IHRhZ19zaXplICh0YWdfbWVtMzIpOworCisJCXBhcmFtcy0+dS5tZW0uc3RhcnQgPSBiZC0+YmlfZHJhbVtpXS5zdGFydDsKKwkJcGFyYW1zLT51Lm1lbS5zaXplID0gYmQtPmJpX2RyYW1baV0uc2l6ZTsKKworCQlwYXJhbXMgPSB0YWdfbmV4dCAocGFyYW1zKTsKKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTICovCisKKworc3RhdGljIHZvaWQgc2V0dXBfY29tbWFuZGxpbmVfdGFnIChiZF90ICpiZCwgY2hhciAqY29tbWFuZGxpbmUpCit7CisJY2hhciAqcDsKKworCWlmICghY29tbWFuZGxpbmUpCisJCXJldHVybjsKKworCS8qIGVhdCBsZWFkaW5nIHdoaXRlIHNwYWNlICovCisJZm9yIChwID0gY29tbWFuZGxpbmU7ICpwID09ICcgJzsgcCsrKTsKKworCS8qIHNraXAgbm9uLWV4aXN0ZW50IGNvbW1hbmQgbGluZXMgc28gdGhlIGtlcm5lbCB3aWxsIHN0aWxsCisJICogdXNlIGl0cyBkZWZhdWx0IGNvbW1hbmQgbGluZS4KKwkgKi8KKwlpZiAoKnAgPT0gJ1wwJykKKwkJcmV0dXJuOworCisJcGFyYW1zLT5oZHIudGFnID0gQVRBR19DTURMSU5FOworCXBhcmFtcy0+aGRyLnNpemUgPQorCQkoc2l6ZW9mIChzdHJ1Y3QgdGFnX2hlYWRlcikgKyBzdHJsZW4gKHApICsgMSArIDQpID4+IDI7CisKKwlzdHJjcHkgKHBhcmFtcy0+dS5jbWRsaW5lLmNtZGxpbmUsIHApOworCisJcGFyYW1zID0gdGFnX25leHQgKHBhcmFtcyk7Cit9CisKKworI2lmZGVmIENPTkZJR19JTklUUkRfVEFHCitzdGF0aWMgdm9pZCBzZXR1cF9pbml0cmRfdGFnIChiZF90ICpiZCwgdWxvbmcgaW5pdHJkX3N0YXJ0LCB1bG9uZyBpbml0cmRfZW5kKQoreworCS8qIGFuIEFUQUdfSU5JVFJEIG5vZGUgdGVsbHMgdGhlIGtlcm5lbCB3aGVyZSB0aGUgY29tcHJlc3NlZAorCSAqIHJhbWRpc2sgY2FuIGJlIGZvdW5kLiBBVEFHX1JESU1HIGlzIGEgYmV0dGVyIG5hbWUsIGFjdHVhbGx5LgorCSAqLworCXBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfSU5JVFJEMjsKKwlwYXJhbXMtPmhkci5zaXplID0gdGFnX3NpemUgKHRhZ19pbml0cmQpOworCisJcGFyYW1zLT51LmluaXRyZC5zdGFydCA9IGluaXRyZF9zdGFydDsKKwlwYXJhbXMtPnUuaW5pdHJkLnNpemUgPSBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0OworCisJcGFyYW1zID0gdGFnX25leHQgKHBhcmFtcyk7Cit9CisjZW5kaWYgLyogQ09ORklHX0lOSVRSRF9UQUcgKi8KKworI2lmZGVmIENPTkZJR19TRVJJQUxfVEFHCit2b2lkIHNldHVwX3NlcmlhbF90YWcgKHN0cnVjdCB0YWcgKip0bXApCit7CisJc3RydWN0IHRhZyAqcGFyYW1zID0gKnRtcDsKKwlzdHJ1Y3QgdGFnX3NlcmlhbG5yIHNlcmlhbG5yOworCXZvaWQgZ2V0X2JvYXJkX3NlcmlhbChzdHJ1Y3QgdGFnX3NlcmlhbG5yICpzZXJpYWxucik7CisKKwlnZXRfYm9hcmRfc2VyaWFsKCZzZXJpYWxucik7CisJcGFyYW1zLT5oZHIudGFnID0gQVRBR19TRVJJQUw7CisJcGFyYW1zLT5oZHIuc2l6ZSA9IHRhZ19zaXplICh0YWdfc2VyaWFsbnIpOworCXBhcmFtcy0+dS5zZXJpYWxuci5sb3cgPSBzZXJpYWxuci5sb3c7CisJcGFyYW1zLT51LnNlcmlhbG5yLmhpZ2g9IHNlcmlhbG5yLmhpZ2g7CisJcGFyYW1zID0gdGFnX25leHQgKHBhcmFtcyk7CisJKnRtcCA9IHBhcmFtczsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JFVklTSU9OX1RBRwordm9pZCBzZXR1cF9yZXZpc2lvbl90YWcoc3RydWN0IHRhZyAqKmluX3BhcmFtcykKK3sKKwl1MzIgcmV2ID0gMDsKKwl1MzIgZ2V0X2JvYXJkX3Jldih2b2lkKTsKKworCXJldiA9IGdldF9ib2FyZF9yZXYoKTsKKwlwYXJhbXMtPmhkci50YWcgPSBBVEFHX1JFVklTSU9OOworCXBhcmFtcy0+aGRyLnNpemUgPSB0YWdfc2l6ZSAodGFnX3JldmlzaW9uKTsKKwlwYXJhbXMtPnUucmV2aXNpb24ucmV2ID0gcmV2OworCXBhcmFtcyA9IHRhZ19uZXh0IChwYXJhbXMpOworfQorI2VuZGlmICAvKiBDT05GSUdfUkVWSVNJT05fVEFHICovCisKKworc3RhdGljIHZvaWQgc2V0dXBfZW5kX3RhZyAoYmRfdCAqYmQpCit7CisJcGFyYW1zLT5oZHIudGFnID0gQVRBR19OT05FOworCXBhcmFtcy0+aGRyLnNpemUgPSAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTIHx8IENPTkZJR19DTURMSU5FX1RBRyB8fCBDT05GSUdfSU5JVFJEX1RBRyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2NyYzMyLmMgYi94LWxvYWRlci9saWIvY3JjMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTc0OTRjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2NyYzMyLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGNyYzMyLmMgZnJvbSB0aGUgemxpYi0xLjEuMyBkaXN0cmlidXRpb24KKyAqIGJ5IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIuCisgKi8KKworLyogY3JjMzIuYyAtLSBjb21wdXRlIHRoZSBDUkMtMzIgb2YgYSBkYXRhIHN0cmVhbQorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpZm5kZWYgVVNFX0hPU1RDQworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y29tcGlsZXIuaD4KKyNpbmNsdWRlIDx4LWxvYWQvY3JjLmg+CisKKyNpbmNsdWRlICJ4LWxvYWQvemxpYi5oIgorCisjZGVmaW5lIGxvY2FsIHN0YXRpYworI2RlZmluZSBaRVhQT1JUCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgdG9sZSh4KSBjcHVfdG9fbGUzMih4KQorCisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKworbG9jYWwgaW50IGNyY190YWJsZV9lbXB0eSA9IDE7Citsb2NhbCB1aW50MzJfdCBjcmNfdGFibGVbMjU2XTsKK2xvY2FsIHZvaWQgbWFrZV9jcmNfdGFibGUgT0YoKHZvaWQpKTsKKworLyoKKyAgR2VuZXJhdGUgYSB0YWJsZSBmb3IgYSBieXRlLXdpc2UgMzItYml0IENSQyBjYWxjdWxhdGlvbiBvbiB0aGUgcG9seW5vbWlhbDoKKyAgeF4zMit4XjI2K3heMjMreF4yMit4XjE2K3heMTIreF4xMSt4XjEwK3heOCt4XjcreF41K3heNCt4XjIreCsxLgorCisgIFBvbHlub21pYWxzIG92ZXIgR0YoMikgYXJlIHJlcHJlc2VudGVkIGluIGJpbmFyeSwgb25lIGJpdCBwZXIgY29lZmZpY2llbnQsCisgIHdpdGggdGhlIGxvd2VzdCBwb3dlcnMgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgVGhlbiBhZGRpbmcgcG9seW5vbWlhbHMKKyAgaXMganVzdCBleGNsdXNpdmUtb3IsIGFuZCBtdWx0aXBseWluZyBhIHBvbHlub21pYWwgYnkgeCBpcyBhIHJpZ2h0IHNoaWZ0IGJ5CisgIG9uZS4gIElmIHdlIGNhbGwgdGhlIGFib3ZlIHBvbHlub21pYWwgcCwgYW5kIHJlcHJlc2VudCBhIGJ5dGUgYXMgdGhlCisgIHBvbHlub21pYWwgcSwgYWxzbyB3aXRoIHRoZSBsb3dlc3QgcG93ZXIgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IChzbyB0aGUKKyAgYnl0ZSAweGIxIGlzIHRoZSBwb2x5bm9taWFsIHheNyt4XjMreCsxKSwgdGhlbiB0aGUgQ1JDIGlzIChxKnheMzIpIG1vZCBwLAorICB3aGVyZSBhIG1vZCBiIG1lYW5zIHRoZSByZW1haW5kZXIgYWZ0ZXIgZGl2aWRpbmcgYSBieSBiLgorCisgIFRoaXMgY2FsY3VsYXRpb24gaXMgZG9uZSB1c2luZyB0aGUgc2hpZnQtcmVnaXN0ZXIgbWV0aG9kIG9mIG11bHRpcGx5aW5nIGFuZAorICB0YWtpbmcgdGhlIHJlbWFpbmRlci4gIFRoZSByZWdpc3RlciBpcyBpbml0aWFsaXplZCB0byB6ZXJvLCBhbmQgZm9yIGVhY2gKKyAgaW5jb21pbmcgYml0LCB4XjMyIGlzIGFkZGVkIG1vZCBwIHRvIHRoZSByZWdpc3RlciBpZiB0aGUgYml0IGlzIGEgb25lICh3aGVyZQorICB4XjMyIG1vZCBwIGlzIHAreF4zMiA9IHheMjYrLi4uKzEpLCBhbmQgdGhlIHJlZ2lzdGVyIGlzIG11bHRpcGxpZWQgbW9kIHAgYnkKKyAgeCAod2hpY2ggaXMgc2hpZnRpbmcgcmlnaHQgYnkgb25lIGFuZCBhZGRpbmcgeF4zMiBtb2QgcCBpZiB0aGUgYml0IHNoaWZ0ZWQKKyAgb3V0IGlzIGEgb25lKS4gIFdlIHN0YXJ0IHdpdGggdGhlIGhpZ2hlc3QgcG93ZXIgKGxlYXN0IHNpZ25pZmljYW50IGJpdCkgb2YKKyAgcSBhbmQgcmVwZWF0IGZvciBhbGwgZWlnaHQgYml0cyBvZiBxLgorCisgIFRoZSB0YWJsZSBpcyBzaW1wbHkgdGhlIENSQyBvZiBhbGwgcG9zc2libGUgZWlnaHQgYml0IHZhbHVlcy4gIFRoaXMgaXMgYWxsCisgIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZ2VuZXJhdGUgQ1JDJ3Mgb24gZGF0YSBhIGJ5dGUgYXQgYSB0aW1lIGZvciBhbGwKKyAgY29tYmluYXRpb25zIG9mIENSQyByZWdpc3RlciB2YWx1ZXMgYW5kIGluY29taW5nIGJ5dGVzLgorKi8KK2xvY2FsIHZvaWQgbWFrZV9jcmNfdGFibGUoKQoreworICB1aW50MzJfdCBjOworICBpbnQgbiwgazsKKyAgdUxvbmcgcG9seTsJCS8qIHBvbHlub21pYWwgZXhjbHVzaXZlLW9yIHBhdHRlcm4gKi8KKyAgLyogdGVybXMgb2YgcG9seW5vbWlhbCBkZWZpbmluZyB0aGlzIGNyYyAoZXhjZXB0IHheMzIpOiAqLworICBzdGF0aWMgY29uc3QgQnl0ZSBwW10gPSB7MCwxLDIsNCw1LDcsOCwxMCwxMSwxMiwxNiwyMiwyMywyNn07CisKKyAgLyogbWFrZSBleGNsdXNpdmUtb3IgcGF0dGVybiBmcm9tIHBvbHlub21pYWwgKDB4ZWRiODgzMjBMKSAqLworICBwb2x5ID0gMEw7CisgIGZvciAobiA9IDA7IG4gPCBzaXplb2YocCkvc2l6ZW9mKEJ5dGUpOyBuKyspCisgICAgcG9seSB8PSAxTCA8PCAoMzEgLSBwW25dKTsKKworICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspCisgIHsKKyAgICBjID0gKHVMb25nKW47CisgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykKKyAgICAgIGMgPSBjICYgMSA/IHBvbHkgXiAoYyA+PiAxKSA6IGMgPj4gMTsKKyAgICBjcmNfdGFibGVbbl0gPSB0b2xlKGMpOworICB9CisgIGNyY190YWJsZV9lbXB0eSA9IDA7Cit9CisjZWxzZQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUYWJsZSBvZiBDUkMtMzIncyBvZiBhbGwgc2luZ2xlLWJ5dGUgdmFsdWVzIChtYWRlIGJ5IG1ha2VfY3JjX3RhYmxlKQorICovCisKK2xvY2FsIGNvbnN0IHVpbnQzMl90IGNyY190YWJsZVsyNTZdID0gewordG9sZSgweDAwMDAwMDAwTCksIHRvbGUoMHg3NzA3MzA5NkwpLCB0b2xlKDB4ZWUwZTYxMmNMKSwgdG9sZSgweDk5MDk1MWJhTCksCit0b2xlKDB4MDc2ZGM0MTlMKSwgdG9sZSgweDcwNmFmNDhmTCksIHRvbGUoMHhlOTYzYTUzNUwpLCB0b2xlKDB4OWU2NDk1YTNMKSwKK3RvbGUoMHgwZWRiODgzMkwpLCB0b2xlKDB4NzlkY2I4YTRMKSwgdG9sZSgweGUwZDVlOTFlTCksIHRvbGUoMHg5N2QyZDk4OEwpLAordG9sZSgweDA5YjY0YzJiTCksIHRvbGUoMHg3ZWIxN2NiZEwpLCB0b2xlKDB4ZTdiODJkMDdMKSwgdG9sZSgweDkwYmYxZDkxTCksCit0b2xlKDB4MWRiNzEwNjRMKSwgdG9sZSgweDZhYjAyMGYyTCksIHRvbGUoMHhmM2I5NzE0OEwpLCB0b2xlKDB4ODRiZTQxZGVMKSwKK3RvbGUoMHgxYWRhZDQ3ZEwpLCB0b2xlKDB4NmRkZGU0ZWJMKSwgdG9sZSgweGY0ZDRiNTUxTCksIHRvbGUoMHg4M2QzODVjN0wpLAordG9sZSgweDEzNmM5ODU2TCksIHRvbGUoMHg2NDZiYThjMEwpLCB0b2xlKDB4ZmQ2MmY5N2FMKSwgdG9sZSgweDhhNjVjOWVjTCksCit0b2xlKDB4MTQwMTVjNGZMKSwgdG9sZSgweDYzMDY2Y2Q5TCksIHRvbGUoMHhmYTBmM2Q2M0wpLCB0b2xlKDB4OGQwODBkZjVMKSwKK3RvbGUoMHgzYjZlMjBjOEwpLCB0b2xlKDB4NGM2OTEwNWVMKSwgdG9sZSgweGQ1NjA0MWU0TCksIHRvbGUoMHhhMjY3NzE3MkwpLAordG9sZSgweDNjMDNlNGQxTCksIHRvbGUoMHg0YjA0ZDQ0N0wpLCB0b2xlKDB4ZDIwZDg1ZmRMKSwgdG9sZSgweGE1MGFiNTZiTCksCit0b2xlKDB4MzViNWE4ZmFMKSwgdG9sZSgweDQyYjI5ODZjTCksIHRvbGUoMHhkYmJiYzlkNkwpLCB0b2xlKDB4YWNiY2Y5NDBMKSwKK3RvbGUoMHgzMmQ4NmNlM0wpLCB0b2xlKDB4NDVkZjVjNzVMKSwgdG9sZSgweGRjZDYwZGNmTCksIHRvbGUoMHhhYmQxM2Q1OUwpLAordG9sZSgweDI2ZDkzMGFjTCksIHRvbGUoMHg1MWRlMDAzYUwpLCB0b2xlKDB4YzhkNzUxODBMKSwgdG9sZSgweGJmZDA2MTE2TCksCit0b2xlKDB4MjFiNGY0YjVMKSwgdG9sZSgweDU2YjNjNDIzTCksIHRvbGUoMHhjZmJhOTU5OUwpLCB0b2xlKDB4YjhiZGE1MGZMKSwKK3RvbGUoMHgyODAyYjg5ZUwpLCB0b2xlKDB4NWYwNTg4MDhMKSwgdG9sZSgweGM2MGNkOWIyTCksIHRvbGUoMHhiMTBiZTkyNEwpLAordG9sZSgweDJmNmY3Yzg3TCksIHRvbGUoMHg1ODY4NGMxMUwpLCB0b2xlKDB4YzE2MTFkYWJMKSwgdG9sZSgweGI2NjYyZDNkTCksCit0b2xlKDB4NzZkYzQxOTBMKSwgdG9sZSgweDAxZGI3MTA2TCksIHRvbGUoMHg5OGQyMjBiY0wpLCB0b2xlKDB4ZWZkNTEwMmFMKSwKK3RvbGUoMHg3MWIxODU4OUwpLCB0b2xlKDB4MDZiNmI1MWZMKSwgdG9sZSgweDlmYmZlNGE1TCksIHRvbGUoMHhlOGI4ZDQzM0wpLAordG9sZSgweDc4MDdjOWEyTCksIHRvbGUoMHgwZjAwZjkzNEwpLCB0b2xlKDB4OTYwOWE4OGVMKSwgdG9sZSgweGUxMGU5ODE4TCksCit0b2xlKDB4N2Y2YTBkYmJMKSwgdG9sZSgweDA4NmQzZDJkTCksIHRvbGUoMHg5MTY0NmM5N0wpLCB0b2xlKDB4ZTY2MzVjMDFMKSwKK3RvbGUoMHg2YjZiNTFmNEwpLCB0b2xlKDB4MWM2YzYxNjJMKSwgdG9sZSgweDg1NjUzMGQ4TCksIHRvbGUoMHhmMjYyMDA0ZUwpLAordG9sZSgweDZjMDY5NWVkTCksIHRvbGUoMHgxYjAxYTU3YkwpLCB0b2xlKDB4ODIwOGY0YzFMKSwgdG9sZSgweGY1MGZjNDU3TCksCit0b2xlKDB4NjViMGQ5YzZMKSwgdG9sZSgweDEyYjdlOTUwTCksIHRvbGUoMHg4YmJlYjhlYUwpLCB0b2xlKDB4ZmNiOTg4N2NMKSwKK3RvbGUoMHg2MmRkMWRkZkwpLCB0b2xlKDB4MTVkYTJkNDlMKSwgdG9sZSgweDhjZDM3Y2YzTCksIHRvbGUoMHhmYmQ0NGM2NUwpLAordG9sZSgweDRkYjI2MTU4TCksIHRvbGUoMHgzYWI1NTFjZUwpLCB0b2xlKDB4YTNiYzAwNzRMKSwgdG9sZSgweGQ0YmIzMGUyTCksCit0b2xlKDB4NGFkZmE1NDFMKSwgdG9sZSgweDNkZDg5NWQ3TCksIHRvbGUoMHhhNGQxYzQ2ZEwpLCB0b2xlKDB4ZDNkNmY0ZmJMKSwKK3RvbGUoMHg0MzY5ZTk2YUwpLCB0b2xlKDB4MzQ2ZWQ5ZmNMKSwgdG9sZSgweGFkNjc4ODQ2TCksIHRvbGUoMHhkYTYwYjhkMEwpLAordG9sZSgweDQ0MDQyZDczTCksIHRvbGUoMHgzMzAzMWRlNUwpLCB0b2xlKDB4YWEwYTRjNWZMKSwgdG9sZSgweGRkMGQ3Y2M5TCksCit0b2xlKDB4NTAwNTcxM2NMKSwgdG9sZSgweDI3MDI0MWFhTCksIHRvbGUoMHhiZTBiMTAxMEwpLCB0b2xlKDB4YzkwYzIwODZMKSwKK3RvbGUoMHg1NzY4YjUyNUwpLCB0b2xlKDB4MjA2Zjg1YjNMKSwgdG9sZSgweGI5NjZkNDA5TCksIHRvbGUoMHhjZTYxZTQ5ZkwpLAordG9sZSgweDVlZGVmOTBlTCksIHRvbGUoMHgyOWQ5Yzk5OEwpLCB0b2xlKDB4YjBkMDk4MjJMKSwgdG9sZSgweGM3ZDdhOGI0TCksCit0b2xlKDB4NTliMzNkMTdMKSwgdG9sZSgweDJlYjQwZDgxTCksIHRvbGUoMHhiN2JkNWMzYkwpLCB0b2xlKDB4YzBiYTZjYWRMKSwKK3RvbGUoMHhlZGI4ODMyMEwpLCB0b2xlKDB4OWFiZmIzYjZMKSwgdG9sZSgweDAzYjZlMjBjTCksIHRvbGUoMHg3NGIxZDI5YUwpLAordG9sZSgweGVhZDU0NzM5TCksIHRvbGUoMHg5ZGQyNzdhZkwpLCB0b2xlKDB4MDRkYjI2MTVMKSwgdG9sZSgweDczZGMxNjgzTCksCit0b2xlKDB4ZTM2MzBiMTJMKSwgdG9sZSgweDk0NjQzYjg0TCksIHRvbGUoMHgwZDZkNmEzZUwpLCB0b2xlKDB4N2E2YTVhYThMKSwKK3RvbGUoMHhlNDBlY2YwYkwpLCB0b2xlKDB4OTMwOWZmOWRMKSwgdG9sZSgweDBhMDBhZTI3TCksIHRvbGUoMHg3ZDA3OWViMUwpLAordG9sZSgweGYwMGY5MzQ0TCksIHRvbGUoMHg4NzA4YTNkMkwpLCB0b2xlKDB4MWUwMWYyNjhMKSwgdG9sZSgweDY5MDZjMmZlTCksCit0b2xlKDB4Zjc2MjU3NWRMKSwgdG9sZSgweDgwNjU2N2NiTCksIHRvbGUoMHgxOTZjMzY3MUwpLCB0b2xlKDB4NmU2YjA2ZTdMKSwKK3RvbGUoMHhmZWQ0MWI3NkwpLCB0b2xlKDB4ODlkMzJiZTBMKSwgdG9sZSgweDEwZGE3YTVhTCksIHRvbGUoMHg2N2RkNGFjY0wpLAordG9sZSgweGY5YjlkZjZmTCksIHRvbGUoMHg4ZWJlZWZmOUwpLCB0b2xlKDB4MTdiN2JlNDNMKSwgdG9sZSgweDYwYjA4ZWQ1TCksCit0b2xlKDB4ZDZkNmEzZThMKSwgdG9sZSgweGExZDE5MzdlTCksIHRvbGUoMHgzOGQ4YzJjNEwpLCB0b2xlKDB4NGZkZmYyNTJMKSwKK3RvbGUoMHhkMWJiNjdmMUwpLCB0b2xlKDB4YTZiYzU3NjdMKSwgdG9sZSgweDNmYjUwNmRkTCksIHRvbGUoMHg0OGIyMzY0YkwpLAordG9sZSgweGQ4MGQyYmRhTCksIHRvbGUoMHhhZjBhMWI0Y0wpLCB0b2xlKDB4MzYwMzRhZjZMKSwgdG9sZSgweDQxMDQ3YTYwTCksCit0b2xlKDB4ZGY2MGVmYzNMKSwgdG9sZSgweGE4NjdkZjU1TCksIHRvbGUoMHgzMTZlOGVlZkwpLCB0b2xlKDB4NDY2OWJlNzlMKSwKK3RvbGUoMHhjYjYxYjM4Y0wpLCB0b2xlKDB4YmM2NjgzMWFMKSwgdG9sZSgweDI1NmZkMmEwTCksIHRvbGUoMHg1MjY4ZTIzNkwpLAordG9sZSgweGNjMGM3Nzk1TCksIHRvbGUoMHhiYjBiNDcwM0wpLCB0b2xlKDB4MjIwMjE2YjlMKSwgdG9sZSgweDU1MDUyNjJmTCksCit0b2xlKDB4YzViYTNiYmVMKSwgdG9sZSgweGIyYmQwYjI4TCksIHRvbGUoMHgyYmI0NWE5MkwpLCB0b2xlKDB4NWNiMzZhMDRMKSwKK3RvbGUoMHhjMmQ3ZmZhN0wpLCB0b2xlKDB4YjVkMGNmMzFMKSwgdG9sZSgweDJjZDk5ZThiTCksIHRvbGUoMHg1YmRlYWUxZEwpLAordG9sZSgweDliNjRjMmIwTCksIHRvbGUoMHhlYzYzZjIyNkwpLCB0b2xlKDB4NzU2YWEzOWNMKSwgdG9sZSgweDAyNmQ5MzBhTCksCit0b2xlKDB4OWMwOTA2YTlMKSwgdG9sZSgweGViMGUzNjNmTCksIHRvbGUoMHg3MjA3Njc4NUwpLCB0b2xlKDB4MDUwMDU3MTNMKSwKK3RvbGUoMHg5NWJmNGE4MkwpLCB0b2xlKDB4ZTJiODdhMTRMKSwgdG9sZSgweDdiYjEyYmFlTCksIHRvbGUoMHgwY2I2MWIzOEwpLAordG9sZSgweDkyZDI4ZTliTCksIHRvbGUoMHhlNWQ1YmUwZEwpLCB0b2xlKDB4N2NkY2VmYjdMKSwgdG9sZSgweDBiZGJkZjIxTCksCit0b2xlKDB4ODZkM2QyZDRMKSwgdG9sZSgweGYxZDRlMjQyTCksIHRvbGUoMHg2OGRkYjNmOEwpLCB0b2xlKDB4MWZkYTgzNmVMKSwKK3RvbGUoMHg4MWJlMTZjZEwpLCB0b2xlKDB4ZjZiOTI2NWJMKSwgdG9sZSgweDZmYjA3N2UxTCksIHRvbGUoMHgxOGI3NDc3N0wpLAordG9sZSgweDg4MDg1YWU2TCksIHRvbGUoMHhmZjBmNmE3MEwpLCB0b2xlKDB4NjYwNjNiY2FMKSwgdG9sZSgweDExMDEwYjVjTCksCit0b2xlKDB4OGY2NTllZmZMKSwgdG9sZSgweGY4NjJhZTY5TCksIHRvbGUoMHg2MTZiZmZkM0wpLCB0b2xlKDB4MTY2Y2NmNDVMKSwKK3RvbGUoMHhhMDBhZTI3OEwpLCB0b2xlKDB4ZDcwZGQyZWVMKSwgdG9sZSgweDRlMDQ4MzU0TCksIHRvbGUoMHgzOTAzYjNjMkwpLAordG9sZSgweGE3NjcyNjYxTCksIHRvbGUoMHhkMDYwMTZmN0wpLCB0b2xlKDB4NDk2OTQ3NGRMKSwgdG9sZSgweDNlNmU3N2RiTCksCit0b2xlKDB4YWVkMTZhNGFMKSwgdG9sZSgweGQ5ZDY1YWRjTCksIHRvbGUoMHg0MGRmMGI2NkwpLCB0b2xlKDB4MzdkODNiZjBMKSwKK3RvbGUoMHhhOWJjYWU1M0wpLCB0b2xlKDB4ZGViYjllYzVMKSwgdG9sZSgweDQ3YjJjZjdmTCksIHRvbGUoMHgzMGI1ZmZlOUwpLAordG9sZSgweGJkYmRmMjFjTCksIHRvbGUoMHhjYWJhYzI4YUwpLCB0b2xlKDB4NTNiMzkzMzBMKSwgdG9sZSgweDI0YjRhM2E2TCksCit0b2xlKDB4YmFkMDM2MDVMKSwgdG9sZSgweGNkZDcwNjkzTCksIHRvbGUoMHg1NGRlNTcyOUwpLCB0b2xlKDB4MjNkOTY3YmZMKSwKK3RvbGUoMHhiMzY2N2EyZUwpLCB0b2xlKDB4YzQ2MTRhYjhMKSwgdG9sZSgweDVkNjgxYjAyTCksIHRvbGUoMHgyYTZmMmI5NEwpLAordG9sZSgweGI0MGJiZTM3TCksIHRvbGUoMHhjMzBjOGVhMUwpLCB0b2xlKDB4NWEwNWRmMWJMKSwgdG9sZSgweDJkMDJlZjhkTCkKK307CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworIyBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgRE9fQ1JDKHgpIGNyYyA9IHRhYlsoY3JjIF4gKHgpKSAmIDI1NV0gXiAoY3JjID4+IDgpCisjIGVsc2UKKyMgIGRlZmluZSBET19DUkMoeCkgY3JjID0gdGFiWygoY3JjID4+IDI0KSBeICh4KSkgJiAyNTVdIF4gKGNyYyA8PCA4KQorIyBlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIE5vIG9uZXMgY29tcGxlbWVudCB2ZXJzaW9uLiBKRkZTMiAoYW5kIG90aGVyIHRoaW5ncyA/KQorICogZG9uJ3QgdXNlIG9uZXMgY29tcGxpbWVudCBpbiB0aGVpciBDUkMgY2FsY3VsYXRpb25zLgorICovCit1aW50MzJfdCBaRVhQT1JUIGNyYzMyX25vX2NvbXAodWludDMyX3QgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikKK3sKKyAgICBjb25zdCB1aW50MzJfdCAqdGFiID0gY3JjX3RhYmxlOworICAgIGNvbnN0IHVpbnQzMl90ICpiID0oY29uc3QgdWludDMyX3QgKilidWY7CisgICAgc2l6ZV90IHJlbV9sZW47CisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKyAgICBpZiAoY3JjX3RhYmxlX2VtcHR5KQorICAgICAgbWFrZV9jcmNfdGFibGUoKTsKKyNlbmRpZgorICAgIGNyYyA9IGNwdV90b19sZTMyKGNyYyk7CisgICAgLyogQWxpZ24gaXQgKi8KKyAgICBpZiAoKChsb25nKWIpICYgMyAmJiBsZW4pIHsKKwkgdWludDhfdCAqcCA9ICh1aW50OF90ICopYjsKKwkgZG8geworCSAgICAgIERPX0NSQygqcCsrKTsKKwkgfSB3aGlsZSAoKC0tbGVuKSAmJiAoKGxvbmcpcCkmMyk7CisJIGIgPSAodWludDMyX3QgKilwOworICAgIH0KKworICAgIHJlbV9sZW4gPSBsZW4gJiAzOworICAgIGxlbiA9IGxlbiA+PiAyOworICAgIGZvciAoLS1iOyBsZW47IC0tbGVuKSB7CisJIC8qIGxvYWQgZGF0YSAzMiBiaXRzIHdpZGUsIHhvciBkYXRhIDMyIGJpdHMgd2lkZS4gKi8KKwkgY3JjIF49ICorK2I7IC8qIHVzZSBwcmUgaW5jcmVtZW50IGZvciBzcGVlZCAqLworCSBET19DUkMoMCk7CisJIERPX0NSQygwKTsKKwkgRE9fQ1JDKDApOworCSBET19DUkMoMCk7CisgICAgfQorICAgIGxlbiA9IHJlbV9sZW47CisgICAgLyogQW5kIHRoZSBsYXN0IGZldyBieXRlcyAqLworICAgIGlmIChsZW4pIHsKKwkgdWludDhfdCAqcCA9ICh1aW50OF90ICopKGIgKyAxKSAtIDE7CisJIGRvIHsKKwkgICAgICBET19DUkMoKisrcCk7IC8qIHVzZSBwcmUgaW5jcmVtZW50IGZvciBzcGVlZCAqLworCSB9IHdoaWxlICgtLWxlbik7CisgICAgfQorCisgICAgcmV0dXJuIGxlMzJfdG9fY3B1KGNyYyk7Cit9CisjdW5kZWYgRE9fQ1JDCisKK3VpbnQzMl90IFpFWFBPUlQgY3JjMzIgKHVpbnQzMl90IGNyYywgY29uc3QgQnl0ZWYgKnAsIHVJbnQgbGVuKQoreworICAgICByZXR1cm4gY3JjMzJfbm9fY29tcChjcmMgXiAweGZmZmZmZmZmTCwgcCwgbGVuKSBeIDB4ZmZmZmZmZmZMOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBjcmMzMiBjaGVja3N1bSB0cmlnZ2VyaW5nIHRoZSB3YXRjaGRvZyBldmVyeSAnY2h1bmtfc3onIGJ5dGVzCisgKiBvZiBpbnB1dC4KKyAqLwordWludDMyX3QgWkVYUE9SVCBjcmMzMl93ZCAodWludDMyX3QgY3JjLAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICAgdUludCBsZW4sIHVJbnQgY2h1bmtfc3opCit7CisjaWYgZGVmaW5lZChDT05GSUdfSFdfV0FUQ0hET0cpIHx8IGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCwgKmN1cnI7CisJaW50IGNodW5rOworCisJY3VyciA9IGJ1ZjsKKwllbmQgPSBidWYgKyBsZW47CisJd2hpbGUgKGN1cnIgPCBlbmQpIHsKKwkJY2h1bmsgPSBlbmQgLSBjdXJyOworCQlpZiAoY2h1bmsgPiBjaHVua19zeikKKwkJCWNodW5rID0gY2h1bmtfc3o7CisJCWNyYyA9IGNyYzMyIChjcmMsIGN1cnIsIGNodW5rKTsKKwkJY3VyciArPSBjaHVuazsKKwkJV0FUQ0hET0dfUkVTRVQgKCk7CisJfQorI2Vsc2UKKwljcmMgPSBjcmMzMiAoY3JjLCBidWYsIGxlbik7CisjZW5kaWYKKworCXJldHVybiBjcmM7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvY3R5cGUuYyBiL3gtbG9hZGVyL2xpYi9jdHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDA0NjgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvY3R5cGUuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiAgbGludXgvbGliL2N0eXBlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCit1bnNpZ25lZCBjaGFyIF9jdHlwZVtdID0geworX0MsX0MsX0MsX0MsX0MsX0MsX0MsX0MsCQkJLyogMC03ICovCitfQyxfQ3xfUyxfQ3xfUyxfQ3xfUyxfQ3xfUyxfQ3xfUyxfQyxfQywJCS8qIDgtMTUgKi8KK19DLF9DLF9DLF9DLF9DLF9DLF9DLF9DLAkJCS8qIDE2LTIzICovCitfQyxfQyxfQyxfQyxfQyxfQyxfQyxfQywJCQkvKiAyNC0zMSAqLworX1N8X1NQLF9QLF9QLF9QLF9QLF9QLF9QLF9QLAkJCS8qIDMyLTM5ICovCitfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCwJCQkvKiA0MC00NyAqLworX0QsX0QsX0QsX0QsX0QsX0QsX0QsX0QsCQkJLyogNDgtNTUgKi8KK19ELF9ELF9QLF9QLF9QLF9QLF9QLF9QLAkJCS8qIDU2LTYzICovCitfUCxfVXxfWCxfVXxfWCxfVXxfWCxfVXxfWCxfVXxfWCxfVXxfWCxfVSwJLyogNjQtNzEgKi8KK19VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLAkJCS8qIDcyLTc5ICovCitfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSwJCQkvKiA4MC04NyAqLworX1UsX1UsX1UsX1AsX1AsX1AsX1AsX1AsCQkJLyogODgtOTUgKi8KK19QLF9MfF9YLF9MfF9YLF9MfF9YLF9MfF9YLF9MfF9YLF9MfF9YLF9MLAkvKiA5Ni0xMDMgKi8KK19MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLAkJCS8qIDEwNC0xMTEgKi8KK19MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLAkJCS8qIDExMi0xMTkgKi8KK19MLF9MLF9MLF9QLF9QLF9QLF9QLF9DLAkJCS8qIDEyMC0xMjcgKi8KKzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCQkvKiAxMjgtMTQzICovCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAkJLyogMTQ0LTE1OSAqLworX1N8X1NQLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLCAgIC8qIDE2MC0xNzUgKi8KK19QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLCAgICAgICAvKiAxNzYtMTkxICovCitfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSwgICAgICAgLyogMTkyLTIwNyAqLworX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1AsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX0wsICAgICAgIC8qIDIwOC0yMjMgKi8KK19MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLCAgICAgICAvKiAyMjQtMjM5ICovCitfTCxfTCxfTCxfTCxfTCxfTCxfTCxfUCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTH07ICAgICAgLyogMjQwLTI1NSAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2Rpc3BsYXlfb3B0aW9ucy5jIGIveC1sb2FkZXIvbGliL2Rpc3BsYXlfb3B0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDc0YmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvZGlzcGxheV9vcHRpb25zLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KK2ludCBkaXNwbGF5X29wdGlvbnMgKHZvaWQpCit7CisJZXh0ZXJuIGNoYXIgdmVyc2lvbl9zdHJpbmdbXTsKKworI2lmIGRlZmluZWQoQlVJTERfVEFHKQorCXByaW50ZiAoIlxuXG4lcywgQnVpbGQ6ICVzXG5cbiIsIHZlcnNpb25fc3RyaW5nLCBCVUlMRF9UQUcpOworI2Vsc2UKKwlwcmludGYgKCJcblxuJXNcblxuIiwgdmVyc2lvbl9zdHJpbmcpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcmludCBzaXplcyBhcyAieHh4IEtpQiIsICJ4eHgueSBLaUIiLCAieHh4IE1pQiIsICJ4eHgueSBNaUIiLAorICogeHh4IEdpQiwgeHh4LnkgR2lCLCBldGMgYXMgbmVlZGVkOyBhbGxvdyBmb3Igb3B0aW9uYWwgdHJhaWxpbmcgc3RyaW5nCisgKiAobGlrZSAiXG4iKQorICovCit2b2lkIHByaW50X3NpemUodW5zaWduZWQgbG9uZyBsb25nIHNpemUsIGNvbnN0IGNoYXIgKnMpCit7CisJdW5zaWduZWQgbG9uZyBtID0gMCwgbjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZjsKKwlzdGF0aWMgY29uc3QgY2hhciBuYW1lc1tdID0geydFJywgJ1AnLCAnVCcsICdHJywgJ00nLCAnSyd9OworCXVuc2lnbmVkIGxvbmcgZCA9IDEwICogQVJSQVlfU0laRShuYW1lcyk7CisJY2hhciBjID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5hbWVzKTsgaSsrLCBkIC09IDEwKSB7CisJCWlmIChzaXplID4+IGQpIHsKKwkJCWMgPSBuYW1lc1tpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFjKSB7CisJCXByaW50ZigiJWxsdSBCeXRlcyVzIiwgc2l6ZSwgcyk7CisJCXJldHVybjsKKwl9CisKKwluID0gc2l6ZSA+PiBkOworCWYgPSBzaXplICYgKCgxVUxMIDw8IGQpIC0gMSk7CisKKwkvKiBJZiB0aGVyZSdzIGEgcmVtYWluZGVyLCBkZWFsIHdpdGggaXQgKi8KKwlpZiAoZikgeworCQltID0gKDEwVUxMICogZiArICgxVUxMIDw8IChkIC0gMSkpKSA+PiBkOworCisJCWlmIChtID49IDEwKSB7CisJCQltIC09IDEwOworCQkJbiArPSAxOworCQl9CisJfQorCisJcHJpbnRmICgiJWx1Iiwgbik7CisJaWYgKG0pIHsKKwkJcHJpbnRmICgiLiVsZCIsIG0pOworCX0KKwlwcmludGYgKCIgJWNpQiVzIiwgYywgcyk7Cit9CisKKy8qCisgKiBQcmludCBkYXRhIGJ1ZmZlciBpbiBoZXggYW5kIGFzY2lpIGZvcm0gdG8gdGhlIHRlcm1pbmFsLgorICoKKyAqIGRhdGEgcmVhZHMgYXJlIGJ1ZmZlcmVkIHNvIHRoYXQgZWFjaCBtZW1vcnkgYWRkcmVzcyBpcyBvbmx5IHJlYWQgb25jZS4KKyAqIFVzZWZ1bCB3aGVuIGRpc3BsYXlpbmcgdGhlIGNvbnRlbnRzIG9mIHZvbGF0aWxlIHJlZ2lzdGVycy4KKyAqCisgKiBwYXJhbWV0ZXJzOgorICogICAgYWRkcjogU3RhcnRpbmcgYWRkcmVzcyB0byBkaXNwbGF5IGF0IHN0YXJ0IG9mIGxpbmUKKyAqICAgIGRhdGE6IHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAqICAgIHdpZHRoOiBkYXRhIHZhbHVlIHdpZHRoLiAgTWF5IGJlIDEsIDIsIG9yIDQuCisgKiAgICBjb3VudDogbnVtYmVyIG9mIHZhbHVlcyB0byBkaXNwbGF5CisgKiAgICBsaW5lbGVuOiBOdW1iZXIgb2YgdmFsdWVzIHRvIHByaW50IHBlciBsaW5lOyBzcGVjaWZ5IDAgZm9yIGRlZmF1bHQgbGVuZ3RoCisgKi8KKyNkZWZpbmUgTUFYX0xJTkVfTEVOR1RIX0JZVEVTICg2NCkKKyNkZWZpbmUgREVGQVVMVF9MSU5FX0xFTkdUSF9CWVRFUyAoMTYpCitpbnQgcHJpbnRfYnVmZmVyICh1bG9uZyBhZGRyLCB2b2lkKiBkYXRhLCB1aW50IHdpZHRoLCB1aW50IGNvdW50LCB1aW50IGxpbmVsZW4pCit7CisJLyogbGluZWJ1ZiBhcyBhIHVuaW9uIGNhdXNlcyBwcm9wZXIgYWxpZ25tZW50ICovCisJdW5pb24gbGluZWJ1ZiB7CisJCXVpbnQzMl90IHVpW01BWF9MSU5FX0xFTkdUSF9CWVRFUy9zaXplb2YodWludDMyX3QpICsgMV07CisJCXVpbnQxNl90IHVzW01BWF9MSU5FX0xFTkdUSF9CWVRFUy9zaXplb2YodWludDE2X3QpICsgMV07CisJCXVpbnQ4X3QgIHVjW01BWF9MSU5FX0xFTkdUSF9CWVRFUy9zaXplb2YodWludDhfdCkgKyAxXTsKKwl9IGxiOworCWludCBpOworCisJaWYgKGxpbmVsZW4qd2lkdGggPiBNQVhfTElORV9MRU5HVEhfQllURVMpCisJCWxpbmVsZW4gPSBNQVhfTElORV9MRU5HVEhfQllURVMgLyB3aWR0aDsKKwlpZiAobGluZWxlbiA8IDEpCisJCWxpbmVsZW4gPSBERUZBVUxUX0xJTkVfTEVOR1RIX0JZVEVTIC8gd2lkdGg7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJcHJpbnRmKCIlMDhseDoiLCBhZGRyKTsKKworCQkvKiBjaGVjayBmb3Igb3ZlcmZsb3cgY29uZGl0aW9uICovCisJCWlmIChjb3VudCA8IGxpbmVsZW4pCisJCQlsaW5lbGVuID0gY291bnQ7CisKKwkJLyogQ29weSBmcm9tIG1lbW9yeSBpbnRvIGxpbmVidWYgYW5kIHByaW50IGhleCB2YWx1ZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxpbmVsZW47IGkrKykgeworCQkJdWludDMyX3QgeDsKKwkJCWlmICh3aWR0aCA9PSA0KQorCQkJCXggPSBsYi51aVtpXSA9ICoodm9sYXRpbGUgdWludDMyX3QgKilkYXRhOworCQkJZWxzZSBpZiAod2lkdGggPT0gMikKKwkJCQl4ID0gbGIudXNbaV0gPSAqKHZvbGF0aWxlIHVpbnQxNl90ICopZGF0YTsKKwkJCWVsc2UKKwkJCQl4ID0gbGIudWNbaV0gPSAqKHZvbGF0aWxlIHVpbnQ4X3QgKilkYXRhOworCQkJcHJpbnRmKCIgJTAqeCIsIHdpZHRoICogMiwgeCk7CisJCQlkYXRhICs9IHdpZHRoOworCQl9CisKKwkJLyogUHJpbnQgZGF0YSBpbiBBU0NJSSBjaGFyYWN0ZXJzICovCisJCWZvciAoaSA9IDA7IGkgPCBsaW5lbGVuICogd2lkdGg7IGkrKykgeworCQkJaWYgKCFpc3ByaW50KGxiLnVjW2ldKSB8fCBsYi51Y1tpXSA+PSAweDgwKQorCQkJCWxiLnVjW2ldID0gJy4nOworCQl9CisJCWxiLnVjW2ldID0gJ1wwJzsKKwkJcHJpbnRmKCIgICAgJXNcbiIsIGxiLnVjKTsKKworCQkvKiB1cGRhdGUgcmVmZXJlbmNlcyAqLworCQlhZGRyICs9IGxpbmVsZW4gKiB3aWR0aDsKKwkJY291bnQgLT0gbGluZWxlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9kaXYwLmMgYi94LWxvYWRlci9saWIvZGl2MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjdiZjEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvZGl2MC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogUmVwbGFjZW1lbnQgKD1kdW1teSkgZm9yIEdOVS9MaW51eCBkaXZpc2lvbi1ieSB6ZXJvIGhhbmRsZXIgKi8KK3ZvaWQgX19kaXYwICh2b2lkKQoreworCWV4dGVybiB2b2lkIGhhbmcgKHZvaWQpOworCisJaGFuZygpOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2VjYy5jIGIveC1sb2FkZXIvbGliL2VjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZmM0MGQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvZWNjLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAgVGV4YXMgSW5zdHJ1bWVudHMKKyAqIAorICogVGhpcyBmaWxlIG9zIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgdS1ib290IGZpbGU6CisgKgljb21tb24vY21kX25hbmQuYworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKw0KKy8qCisgKiBQcmUtY2FsY3VsYXRlZCAyNTYtd2F5IDEgYnl0ZSBjb2x1bW4gcGFyaXR5CisgKi8KK3N0YXRpYyBjb25zdCB1X2NoYXIgbmFuZF9lY2NfcHJlY2FsY190YWJsZVtdID0geworCTB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksIDB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsCisJMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwgMHgzYywgMHg2OSwgMHg2YSwgMHgzZiwgMHgzZiwgMHg2YSwgMHg2OSwgMHgzYywgMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwKKwkweDY2LCAweDMzLCAweDMwLCAweDY1LCAweDNmLCAweDZhLCAweDY5LCAweDNjLCAweDNjLCAweDY5LCAweDZhLCAweDNmLCAweDY1LCAweDMwLCAweDMzLCAweDY2LAorCTB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsIDB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsCisJMHg2OSwgMHgzYywgMHgzZiwgMHg2YSwgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywgMHgzMywgMHg2NiwgMHg2NSwgMHgzMCwgMHg2YSwgMHgzZiwgMHgzYywgMHg2OSwKKwkweDBjLCAweDU5LCAweDVhLCAweDBmLCAweDU1LCAweDAwLCAweDAzLCAweDU2LCAweDU2LCAweDAzLCAweDAwLCAweDU1LCAweDBmLCAweDVhLCAweDU5LCAweDBjLAorCTB4MGYsIDB4NWEsIDB4NTksIDB4MGMsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDMsIDB4NTYsIDB4MGMsIDB4NTksIDB4NWEsIDB4MGYsCisJMHg2YSwgMHgzZiwgMHgzYywgMHg2OSwgMHgzMywgMHg2NiwgMHg2NSwgMHgzMCwgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywgMHg2OSwgMHgzYywgMHgzZiwgMHg2YSwKKwkweDZhLCAweDNmLCAweDNjLCAweDY5LCAweDMzLCAweDY2LCAweDY1LCAweDMwLCAweDMwLCAweDY1LCAweDY2LCAweDMzLCAweDY5LCAweDNjLCAweDNmLCAweDZhLAorCTB4MGYsIDB4NWEsIDB4NTksIDB4MGMsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDMsIDB4NTYsIDB4MGMsIDB4NTksIDB4NWEsIDB4MGYsCisJMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwgMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwgMHg1NiwgMHgwMywgMHgwMCwgMHg1NSwgMHgwZiwgMHg1YSwgMHg1OSwgMHgwYywKKwkweDY5LCAweDNjLCAweDNmLCAweDZhLCAweDMwLCAweDY1LCAweDY2LCAweDMzLCAweDMzLCAweDY2LCAweDY1LCAweDMwLCAweDZhLCAweDNmLCAweDNjLCAweDY5LAorCTB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsIDB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsCisJMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwgMHgzZiwgMHg2YSwgMHg2OSwgMHgzYywgMHgzYywgMHg2OSwgMHg2YSwgMHgzZiwgMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwKKwkweDY1LCAweDMwLCAweDMzLCAweDY2LCAweDNjLCAweDY5LCAweDZhLCAweDNmLCAweDNmLCAweDZhLCAweDY5LCAweDNjLCAweDY2LCAweDMzLCAweDMwLCAweDY1LAorCTB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksIDB4MDMsIDB4NTYsIDB4NTUsIDB4MDAKK307CisKKworLyoKKyAqIENyZWF0ZXMgbm9uLWludmVydGVkIEVDQyBjb2RlIGZyb20gbGluZSBwYXJpdHkKKyAqLworc3RhdGljIHZvaWQgbmFuZF90cmFuc19yZXN1bHQodV9jaGFyIHJlZzIsIHVfY2hhciByZWczLAorCXVfY2hhciAqZWNjX2NvZGUpCit7CisJdV9jaGFyIGEsIGIsIGksIHRtcDEsIHRtcDI7CisKKwkvKiBJbml0aWFsaXplIHZhcmlhYmxlcyAqLworCWEgPSBiID0gMHg4MDsKKwl0bXAxID0gdG1wMiA9IDA7CisKKwkvKiBDYWxjdWxhdGUgZmlyc3QgRUNDIGJ5dGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChyZWczICYgYSkJCS8qIExQMTUsMTMsMTEsOSAtLT4gZWNjX2NvZGVbMF0gKi8KKwkJCXRtcDEgfD0gYjsKKwkJYiA+Pj0gMTsKKwkJaWYgKHJlZzIgJiBhKQkJLyogTFAxNCwxMiwxMCw4IC0tPiBlY2NfY29kZVswXSAqLworCQkJdG1wMSB8PSBiOworCQliID4+PSAxOworCQlhID4+PSAxOworCX0KKworCS8qIENhbGN1bGF0ZSBzZWNvbmQgRUNDIGJ5dGUgKi8KKwliID0gMHg4MDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChyZWczICYgYSkJCS8qIExQNyw1LDMsMSAtLT4gZWNjX2NvZGVbMV0gKi8KKwkJCXRtcDIgfD0gYjsKKwkJYiA+Pj0gMTsKKwkJaWYgKHJlZzIgJiBhKQkJLyogTFA2LDQsMiwwIC0tPiBlY2NfY29kZVsxXSAqLworCQkJdG1wMiB8PSBiOworCQliID4+PSAxOworCQlhID4+PSAxOworCX0KKworCS8qIFN0b3JlIHR3byBvZiB0aGUgRUNDIGJ5dGVzICovCisJZWNjX2NvZGVbMF0gPSB0bXAxOworCWVjY19jb2RlWzFdID0gdG1wMjsKK30KKworLyoKKyAqIENhbGN1bGF0ZSAzIGJ5dGUgRUNDIGNvZGUgZm9yIDI1NiBieXRlIGJsb2NrCisgKi8KKy8qIEVDQyBDYWxjdWxhdGlvbiBpcyBkaWZmZXJlbnQgYmV0d2VlbiBOQU5EIGFuZCBOQU5EIExlZ2FjeSBjb2RlCisgKiBpbiBVLUJvb3QuIElmIE5BTkRfTEVHQUNZIGlzIGVuYWJsZWQgaW4gdS1ib290IGl0IHNob3VsZCBiZSAKKyAqIGVuYWJsZWQgaW4gdGhlIGNvbmZpZyBmaWxlIGluIHgtbG9hZGVyIGFsc28gCisgKi8KKyNpZmRlZiBOQU5EX0xFR0FDWQordm9pZCBuYW5kX2NhbGN1bGF0ZV9lY2MgKGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKQoreworCXVfY2hhciBpZHgsIHJlZzEsIHJlZzM7CisJaW50IGo7CisKKwkvKiBJbml0aWFsaXplIHZhcmlhYmxlcyAqLworCXJlZzEgPSByZWczID0gMDsKKwllY2NfY29kZVswXSA9IGVjY19jb2RlWzFdID0gZWNjX2NvZGVbMl0gPSAwOworCisJLyogQnVpbGQgdXAgY29sdW1uIHBhcml0eSAqLworCWZvcihqID0gMDsgaiA8IDI1NjsgaisrKSB7CisKKwkJLyogR2V0IENQMCAtIENQNSBmcm9tIHRhYmxlICovCisJCWlkeCA9IG5hbmRfZWNjX3ByZWNhbGNfdGFibGVbZGF0W2pdXTsKKwkJcmVnMSBePSBpZHg7CisKKwkJLyogQWxsIGJpdCBYT1IgPSAxID8gKi8KKwkJaWYgKGlkeCAmIDB4NDApIHsKKwkJCXJlZzMgXj0gKHVfY2hhcikgajsKKwkJfQorCX0KKworCS8qIENyZWF0ZSBub24taW52ZXJ0ZWQgRUNDIGNvZGUgZnJvbSBsaW5lIHBhcml0eSAqLworCW5hbmRfdHJhbnNfcmVzdWx0KChyZWcxICYgMHg0MCkgPyB+cmVnMyA6IHJlZzMsIHJlZzMsIGVjY19jb2RlKTsKKworCS8qIENhbGN1bGF0ZSBmaW5hbCBFQ0MgY29kZSAqLworCWVjY19jb2RlWzBdID0gfmVjY19jb2RlWzBdOworCWVjY19jb2RlWzFdID0gfmVjY19jb2RlWzFdOworCWVjY19jb2RlWzJdID0gKCh+cmVnMSkgPDwgMikgfCAweDAzOworfQorI2Vsc2UKK3ZvaWQgbmFuZF9jYWxjdWxhdGVfZWNjIChjb25zdCB1X2NoYXIgKmRhdCwgdV9jaGFyICplY2NfY29kZSkKK3sKKwl1X2NoYXIgaWR4LCByZWcxLCByZWcyLCByZWczOworCWludCBqOworCisJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlyZWcxID0gcmVnMiA9IHJlZzMgPSAwOworCWVjY19jb2RlWzBdID0gZWNjX2NvZGVbMV0gPSBlY2NfY29kZVsyXSA9IDA7CisKKwkvKiBCdWlsZCB1cCBjb2x1bW4gcGFyaXR5ICovCisJZm9yKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKworCQkvKiBHZXQgQ1AwIC0gQ1A1IGZyb20gdGFibGUgKi8KKwkJaWR4ID0gbmFuZF9lY2NfcHJlY2FsY190YWJsZVtkYXRbal1dOworCQlyZWcxIF49IChpZHggJiAweDNmKTsKKworCQkvKiBBbGwgYml0IFhPUiA9IDEgPyAqLworCQlpZiAoaWR4ICYgMHg0MCkgeworCQkJcmVnMyBePSAodV9jaGFyKSBqOworCQkJcmVnMiBePSB+KCh1X2NoYXIpIGopOworCQl9CisJfQorCisJLyogQ3JlYXRlIG5vbi1pbnZlcnRlZCBFQ0MgY29kZSBmcm9tIGxpbmUgcGFyaXR5ICovCisJbmFuZF90cmFuc19yZXN1bHQocmVnMiwgcmVnMywgZWNjX2NvZGUpOworCisJLyogQ2FsY3VsYXRlIGZpbmFsIEVDQyBjb2RlICovCisJZWNjX2NvZGVbMF0gPSB+ZWNjX2NvZGVbMF07CisJZWNjX2NvZGVbMV0gPSB+ZWNjX2NvZGVbMV07CisJZWNjX2NvZGVbMl0gPSAoKH5yZWcxKSA8PCAyKSB8IDB4MDM7Cit9CisjZW5kaWYKKy8qCisgKiBEZXRlY3QgYW5kIGNvcnJlY3QgYSAxIGJpdCBlcnJvciBmb3IgMjU2IGJ5dGUgYmxvY2sKKyAqLworaW50IG5hbmRfY29ycmVjdF9kYXRhICh1X2NoYXIgKmRhdCwgdV9jaGFyICpyZWFkX2VjYywgdV9jaGFyICpjYWxjX2VjYykKK3sKKwl1X2NoYXIgYSwgYiwgYywgZDEsIGQyLCBkMywgYWRkLCBiaXQsIGk7CisKKwkvKiBEbyBlcnJvciBkZXRlY3Rpb24gKi8KKwlkMSA9IGNhbGNfZWNjWzBdIF4gcmVhZF9lY2NbMF07CisJZDIgPSBjYWxjX2VjY1sxXSBeIHJlYWRfZWNjWzFdOworCWQzID0gY2FsY19lY2NbMl0gXiByZWFkX2VjY1syXTsKKworCWlmICgoZDEgfCBkMiB8IGQzKSA9PSAwKSB7CisJCS8qIE5vIGVycm9ycyAqLworCQlyZXR1cm4gMDsKKwl9CisJZWxzZSB7CisJCWEgPSAoZDEgXiAoZDEgPj4gMSkpICYgMHg1NTsKKwkJYiA9IChkMiBeIChkMiA+PiAxKSkgJiAweDU1OworCQljID0gKGQzIF4gKGQzID4+IDEpKSAmIDB4NTQ7CisKKwkJLyogRm91bmQgYW5kIHdpbGwgY29ycmVjdCBzaW5nbGUgYml0IGVycm9yIGluIHRoZSBkYXRhICovCisJCWlmICgoYSA9PSAweDU1KSAmJiAoYiA9PSAweDU1KSAmJiAoYyA9PSAweDU0KSkgeworCQkJYyA9IDB4ODA7CisJCQlhZGQgPSAwOworCQkJYSA9IDB4ODA7CisJCQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJCQlpZiAoZDEgJiBjKQorCQkJCQlhZGQgfD0gYTsKKwkJCQljID4+PSAyOworCQkJCWEgPj49IDE7CisJCQl9CisJCQljID0gMHg4MDsKKwkJCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQkJCWlmIChkMiAmIGMpCisJCQkJCWFkZCB8PSBhOworCQkJCWMgPj49IDI7CisJCQkJYSA+Pj0gMTsKKwkJCX0KKwkJCWJpdCA9IDA7CisJCQliID0gMHgwNDsKKwkJCWMgPSAweDgwOworCQkJZm9yIChpPTA7IGk8MzsgaSsrKSB7CisJCQkJaWYgKGQzICYgYykKKwkJCQkJYml0IHw9IGI7CisJCQkJYyA+Pj0gMjsKKwkJCQliID4+PSAxOworCQkJfQorCQkJYiA9IDB4MDE7CisJCQlhID0gZGF0W2FkZF07CisJCQlhIF49IChiIDw8IGJpdCk7CisJCQlkYXRbYWRkXSA9IGE7CisJCQlyZXR1cm4gMTsKKwkJfQorCQllbHNlIHsKKwkJCWkgPSAwOworCQkJd2hpbGUgKGQxKSB7CisJCQkJaWYgKGQxICYgMHgwMSkKKwkJCQkJKytpOworCQkJCWQxID4+PSAxOworCQkJfQorCQkJd2hpbGUgKGQyKSB7CisJCQkJaWYgKGQyICYgMHgwMSkKKwkJCQkJKytpOworCQkJCWQyID4+PSAxOworCQkJfQorCQkJd2hpbGUgKGQzKSB7CisJCQkJaWYgKGQzICYgMHgwMSkKKwkJCQkJKytpOworCQkJCWQzID4+PSAxOworCQkJfQorCQkJaWYgKGkgPT0gMSkgeworCQkJCS8qIEVDQyBDb2RlIEVycm9yIENvcnJlY3Rpb24gKi8KKwkJCQlyZWFkX2VjY1swXSA9IGNhbGNfZWNjWzBdOworCQkJCXJlYWRfZWNjWzFdID0gY2FsY19lY2NbMV07CisJCQkJcmVhZF9lY2NbMl0gPSBjYWxjX2VjY1syXTsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qIFVuY29ycmVjdGFibGUgRXJyb3IgKi8KKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJcmV0dXJuIC0xOworfQorCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvb21hcF9iY2guYyBiL3gtbG9hZGVyL2xpYi9vbWFwX2JjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNDI0YTYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvb21hcF9iY2guYwpAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIG9tYXBfYmNoLmMKKyAqCisgKiBTdXBwb3J0IG1vZHVsZXMgZm9yIEJDSCA0LWJpdC84LWJpdCBlcnJvciBjb3JyZWN0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgezIwMTF9IFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgImFzIGlzIiBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNkZWZpbmUgR1BNQ19FQ0NfQkNIX1JFU1VMVF8wICAgMHgyNDAKKyNkZWZpbmUgUEFHRV9TSVpFICAgICAgICAgICAgICAgMjA0OAorI2RlZmluZSBOQU5EX0VDQ19SRUFEICAgICAgICAgICAwCisjZGVmaW5lIE5BTkRfRUNDX1dSSVRFICAgICAgICAgIDEKKyNkZWZpbmUgX19yYXdfd3JpdGVsKHYsYSkgKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGEpID0gKHYpKQorI2RlZmluZSBfX3Jhd19yZWFkbChhKSAgICAoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYSkpCisKK2ludCBkZWNvZGVfYmNoKGludCBzZWxlY3RfNF84LCB1bnNpZ25lZCBjaGFyICplY2MsIHVuc2lnbmVkIGludCAqZXJyX2xvYyk7CisKKy8qCisgKiAgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDggLSBWZXJzaW9uIGZvciA4QklUIEJDSCBjb3JyZWN0aW9uLgorICoKKyAqICBAZGF0Ogl1bnVzZWQKKyAqICBAZWNjX2NvZGU6CWVjY19jb2RlIGJ1ZmZlcgorICovCitpbnQgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDgoY29uc3QgdWludDhfdCAqZGF0LAorCQkJCSAgIHVpbnQ4X3QgKmVjY19jb2RlKQoreworICB1bnNpZ25lZCBsb25nIHJlZywgdmFsMSA9IDB4MCwgdmFsMiA9IDB4MDsKKyAgdW5zaWduZWQgbG9uZyB2YWwzID0gMHgwLCB2YWw0ID0gMHgwOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFLzUxMjsgaSsrKSB7CisgICAgLyogUmVhZGluZyBIVyBFQ0NfQkNIX1Jlc3VsdHMKKyAgICAgKiAweDI0MC0weDI0QywgMHgyNTAtMHgyNUMsIDB4MjYwLTB4MjZDLCAweDI3MC0weDI3QworICAgICAqLworICAgIHJlZyA9ICh1bnNpZ25lZCBsb25nKShHUE1DX0JBU0UgKworCQkJICBHUE1DX0VDQ19CQ0hfUkVTVUxUXzAgKyAoMHgxMCAqIGkpKTsKKyAgICB2YWwxID0gX19yYXdfcmVhZGwocmVnKTsKKyAgICB2YWwyID0gX19yYXdfcmVhZGwocmVnICsgNCk7CisgICAgdmFsMyA9IF9fcmF3X3JlYWRsKHJlZyArIDgpOworICAgIHZhbDQgPSBfX3Jhd19yZWFkbChyZWcgKyAxMik7CisKKyAgICAqZWNjX2NvZGUrKyA9ICh2YWw0ICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDMgPj4gMjQpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDMgPj4gMTYpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDMgPj4gOCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICh2YWwzICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDIgPj4gMjQpICYgMHhGRik7CisKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMiA+PiAxNikgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMiA+PiA4KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKHZhbDIgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMSA+PiAyNCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMSA+PiAxNikgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMSA+PiA4KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKHZhbDEgJiAweEZGKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyoKKyAqICBvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoNCAtIFZlcnNpb24gZm9yIDRCSVQgQkNIIGNvcnJlY3Rpb24uCisgKgorICogIEBkYXQ6CXVudXNlZAorICogIEBlY2NfY29kZToJZWNjX2NvZGUgYnVmZmVyCisgKi8KK2ludCBvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoNChjb25zdCB1aW50OF90ICpkYXQsCisJCQkJICAgdWludDhfdCAqZWNjX2NvZGUpCit7CisgIHVuc2lnbmVkIGxvbmcgcmVnLCB2YWwxID0gMHgwLCB2YWwyID0gMHgwOwkKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFBBR0VfU0laRS81MTI7IGkrKykgeworICAgIC8qIFJlYWRpbmcgSFcgRUNDX0JDSF9SZXN1bHRzCisgICAgICogMHgyNDAtMHgyNEMsIDB4MjUwLTB4MjVDLCAweDI2MC0weDI2QywgMHgyNzAtMHgyN0MKKyAgICAgKi8KKyAgICByZWcgPSAodW5zaWduZWQgbG9uZykoR1BNQ19CQVNFICsKKwkJCSAgR1BNQ19FQ0NfQkNIX1JFU1VMVF8wICsgKDB4MTAgKiBpKSk7CisgICAgdmFsMSA9IF9fcmF3X3JlYWRsKHJlZyk7CisgICAgdmFsMiA9IF9fcmF3X3JlYWRsKHJlZyArIDQpOworCisgICAgKmVjY19jb2RlKysgPSAoKHZhbDIgPj4gMTYpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDIgPj4gOCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICh2YWwyICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDEgPj4gMjQpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDEgPj4gMTYpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDEgPj4gOCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICh2YWwxICYgMHhGRik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEltcGxlbWVudGF0aW9uIGZvciA0Yi84YiBCQ0ggY29ycmVjdGlvbi4gIFBhc3MgZWl0aGVyIDQgb3IgOCBpbnRvIHRoZSAKKyAgIGNvcnJlY3RfYml0cyBwYXJhbWV0ZXIuICovCitzdGF0aWMgaW50IG9tYXBfY29ycmVjdF9kYXRhX2JjaChpbnQgY29ycmVjdF9iaXRzLCB1aW50OF90ICpkYXQsCisJCQkJIHVpbnQ4X3QgKnJlYWRfZWNjLCB1aW50OF90ICpjYWxjX2VjYykKK3sKKyAgaW50IGk9MCwgYmxvY2tDbnQ9NCwgaiwgZWNjZmxhZywgY291bnQsIGNvcnJlY3RlZD0wOworICBpbnQgZWNjc2l6ZSA9IChjb3JyZWN0X2JpdHMgPT0gOCkgPyAxMyA6IDc7CisgIGludCBtb2RlID0gKGNvcnJlY3RfYml0cyA9PSA4KSA/IDEgOiAwOworICB1bnNpZ25lZCBpbnQgZXJyX2xvY1s4XTsKKworICBpZiAoY29ycmVjdF9iaXRzID09IDQpCisgICAgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDQoZGF0LCBjYWxjX2VjYyk7CisgIGVsc2UgaWYgKGNvcnJlY3RfYml0cyA9PSA4KQorICAgIG9tYXBfY2FsY3VsYXRlX2VjY19iY2g4KGRhdCwgY2FsY19lY2MpOworICBlbHNlCisgICAgcmV0dXJuIC0xOyAgLyogdW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNvcnJlY3Rpb24gYml0cyAqLworCisgIGZvciAoaSA9IDA7IGkgPCBibG9ja0NudDsgaSsrKSB7CisgICAgLyogY2hlY2sgaWYgYW55IGVjYyBlcnJvciAqLworICAgIGVjY2ZsYWcgPSAwOworICAgIGZvciAoaiA9IDA7IChqIDwgZWNjc2l6ZSkgJiYgKGVjY2ZsYWcgPT0gMCk7IGorKykKKyAgICAgIGlmIChjYWxjX2VjY1tqXSAhPSAwKQorCWVjY2ZsYWcgPSAxOworCisgICAgaWYgKGVjY2ZsYWcgPT0gMSkgeworICAgICAgZWNjZmxhZyA9IDA7CisgICAgICBmb3IgKGogPSAwOyAoaiA8IGVjY3NpemUpICYmIChlY2NmbGFnID09IDApOyBqKyspCisJaWYgKHJlYWRfZWNjW2pdICE9IDB4RkYpCisJICBlY2NmbGFnID0gMTsKKyAgICB9CisKKyAgICBpZiAoZWNjZmxhZyA9PSAxKSB7CisgICAgICBjb3VudCA9IDA7CisgICAgICAvKnByaW50ayhLRVJOX0lORk8gIi4uLmJjaCBjb3JyZWN0KCVkIDUxMiBieXRlKVxuIiwgaSsxKTsqLworICAgICAgY291bnQgPSBkZWNvZGVfYmNoKG1vZGUsIGNhbGNfZWNjLCBlcnJfbG9jKTsKKyAgICAgIAorICAgICAgLyoKKyAgICAgICAqIElmIHVuY29ycmVjdGFibGUgZXJyb3IgZGV0ZWN0ZWQgaW4gc3ViLXBhZ2UsCisgICAgICAgKiBrZWVwIHVuY29ycmVjdGFibGUgZmxhZyB0byB1cHBlciBsYXllcgorICAgICAgICovCisgICAgICBpZihjb3VudCA9PSAtMSkKKyAgICAgICAgY29ycmVjdGVkID0gLTE7CisgICAgICAvKgorICAgICAgICogSWYgbm8gdW5jb3JyZWN0YWJsZSBlcnJvciB0aGVuIGluY3JlbWVudAorICAgICAgICogY29ycmVjdGVkIGNvdW50CisgICAgICAgKi8KKyAgICAgIGlmKGNvcnJlY3RlZCAhPSAtMSkKKyAgICAgICAgY29ycmVjdGVkICs9IGNvdW50OworCQkJCisgICAgICBmb3IgKGogPSAwOyBqIDwgY291bnQ7IGorKykgeworCS8qcHJpbnRrKEtFUk5fSU5GTyAiZXJyX2xvYz0lZFxuIiwgZXJyX2xvY1tqXSk7Ki8KKyAgICAgICAgcHJpbnRmKCJlcnJfbG9jPSVkXG4iLCBlcnJfbG9jW2pdKTsKKwlpZiAoZXJyX2xvY1tqXSA8IDQwOTYpCisJICBkYXRbZXJyX2xvY1tqXSA+PiAzXSBePSAxIDw8IChlcnJfbG9jW2pdICYgNyk7CisJLyogZWxzZSwgbm90IGludGVyZXN0ZWQgdG8gY29ycmVjdCBlY2MgKi8KKyAgICAgIH0KKworICAgIH0KKworICAgIGNhbGNfZWNjID0gY2FsY19lY2MgKyBlY2NzaXplOworICAgIHJlYWRfZWNjID0gcmVhZF9lY2MgKyBlY2NzaXplOworICAgIGRhdCArPSA1MTI7CisgIH0KKworICByZXR1cm4gY29ycmVjdGVkOworfQorCisvKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciA0IGJpdCBCQ0ggY29ycmVjdGlvbiAqLworaW50IG9tYXBfY29ycmVjdF9kYXRhX2JjaDQodWludDhfdCAqZGF0LCB1aW50OF90ICpyZWFkX2VjYywgdWludDhfdCAqY2FsY19lY2MpCit7CisgIHJldHVybiBvbWFwX2NvcnJlY3RfZGF0YV9iY2goNCwgZGF0LCByZWFkX2VjYywgY2FsY19lY2MpOworfQorCisvKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciA4IGJpdCBCQ0ggY29ycmVjdGlvbiAqLworaW50IG9tYXBfY29ycmVjdF9kYXRhX2JjaDgodWludDhfdCAqZGF0LCB1aW50OF90ICpyZWFkX2VjYywgdWludDhfdCAqY2FsY19lY2MpCit7CisgIHJldHVybiBvbWFwX2NvcnJlY3RfZGF0YV9iY2goOCwgZGF0LCByZWFkX2VjYywgY2FsY19lY2MpOworfQorCisvKgorICogb21hcF9lbmFibGVfZWNjIC0gVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZSBoYXJkd2FyZSBlY2MgZnVuY3Rpb25hbGl0eQorICogQG10ZDogICAgICAgIE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbW9kZTogICAgICAgUmVhZC9Xcml0ZSBtb2RlCisgKi8KK3ZvaWQgb21hcF9lbmFibGVfaHdlY2NfYmNoNCh1aW50MzJfdCBidXNfd2lkdGgsIGludDMyX3QgbW9kZSkKK3sKKyAgdWludDMyX3QgYmNoX21vZD0wOworICB1aW50MzJfdCBkZXZfd2lkdGggPSAoYnVzX3dpZHRoPT04KT8wOjE7CisgIHVuc2lnbmVkIGludCBlY2NzaXplMSwgZWNjc2l6ZTA7CisgIHVuc2lnbmVkIGludCBlY2NfY29uZl92YWwgPSAwLCBlY2Nfc2l6ZV9jb25mX3ZhbCA9IDA7CisKKyAgc3dpdGNoIChtb2RlKSB7CisgIGNhc2UgTkFORF9FQ0NfUkVBRCAgICA6CisgICAgZWNjc2l6ZTEgPSAweEQ7IGVjY3NpemUwID0gMHg0ODsKKyAgICAvKiBFQ0NTSVpFMT0yNiB8IEVDQ1NJWkUwPTEyICovCisgICAgZWNjX3NpemVfY29uZl92YWwgPSAoZWNjc2l6ZTEgPDwgMjIpIHwgKGVjY3NpemUwIDw8IDEyKTsKKworICAgIC8qIEVDQ0FMR09SSVRITSB8IEVDQ0JDSFQ4IHwgRUNDV1JBUE1PREUgfCBFQ0MxNkIgfAorICAgICAqIEVDQ1RPUFNFQ1RPUiB8IEVDQ0NTIHwgRUNDIEVuYWJsZQorICAgICAqLworICAgIGVjY19jb25mX3ZhbCA9ICgoMHgwMSA8PCAxNikgfCAoYmNoX21vZCA8PCAxMikgfCAoMHgwOSA8PCA4KSB8CisJCSAgICAoZGV2X3dpZHRoIDw8IDcpIHwgKDB4MDMgPDwgNCkgfAorCQkgICAgKDAgPDwgMSkgfCAoMHgxKSk7CisgICAgYnJlYWs7CisgIGNhc2UgTkFORF9FQ0NfV1JJVEUgICA6CisgICAgZWNjc2l6ZTEgPSAweDIwOyBlY2NzaXplMCA9IDB4MDA7CisKKyAgICAvKiBFQ0NTSVpFMT0zMiB8IEVDQ1NJWkUwPTAwICovCisgICAgZWNjX3NpemVfY29uZl92YWwgPSAoZWNjc2l6ZTEgPDwgMjIpIHwgKGVjY3NpemUwIDw8IDEyKTsKKworICAgIC8qIEVDQ0FMR09SSVRITSB8IEVDQ0JDSFQ4IHwgRUNDV1JBUE1PREUgfCBFQ0MxNkIgfAorICAgICAqIEVDQ1RPUFNFQ1RPUiB8IEVDQ0NTIHwgRUNDIEVuYWJsZQorICAgICAqLworICAgIGVjY19jb25mX3ZhbCA9ICgoMHgwMSA8PCAxNikgfCAoYmNoX21vZCA8PCAxMikgfCAoMHgwNiA8PCA4KSB8CisJCSAgICAoZGV2X3dpZHRoIDw8IDcpIHwgKDB4MDMgPDwgNCkgfAorCQkgICAgKDAgPDwgMSkgfCAoMHgxKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcHJpbnRmKCJFcnJvcjogVW5yZWNvZ25pemVkIE1vZGVbJWRdIVxuIiwgbW9kZSk7CisgICAgYnJlYWs7CisgIH0KKworICBfX3Jhd193cml0ZWwoMHgxLCAoR1BNQ19FQ0NfQ09OVFJPTCkpOworICBfX3Jhd193cml0ZWwoZWNjX3NpemVfY29uZl92YWwsIChHUE1DX0VDQ19TSVpFX0NPTkZJRykpOworICBfX3Jhd193cml0ZWwoZWNjX2NvbmZfdmFsLCAoR1BNQ19FQ0NfQ09ORklHKSk7CisgIF9fcmF3X3dyaXRlbCgweDEwMSwgKEdQTUNfRUNDX0NPTlRST0wpKTsKK30KKworLyoKKyAqIG9tYXBfZW5hYmxlX2VjYyAtIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgaGFyZHdhcmUgZWNjIGZ1bmN0aW9uYWxpdHkKKyAqIEBtdGQ6ICAgICAgICBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG1vZGU6ICAgICAgIFJlYWQvV3JpdGUgbW9kZQorICovCit2b2lkIG9tYXBfZW5hYmxlX2h3ZWNjX2JjaDgodWludDMyX3QgYnVzX3dpZHRoLCBpbnQzMl90IG1vZGUpCit7CisgIHVpbnQzMl90IGJjaF9tb2Q9MTsKKyAgdWludDMyX3QgZGV2X3dpZHRoID0gKGJ1c193aWR0aD09OCk/MDoxOworICB1bnNpZ25lZCBpbnQgZWNjc2l6ZTEsIGVjY3NpemUwOworICB1bnNpZ25lZCBpbnQgZWNjX2NvbmZfdmFsID0gMCwgZWNjX3NpemVfY29uZl92YWwgPSAwOworCisgIHN3aXRjaCAobW9kZSkgeworICBjYXNlIE5BTkRfRUNDX1JFQUQgICAgOgorICAgIGVjY3NpemUxID0gMHgxQTsgZWNjc2l6ZTAgPSAweDE4OworICAgIC8qIEVDQ1NJWkUxPTI2IHwgRUNDU0laRTA9MTIgKi8KKyAgICBlY2Nfc2l6ZV9jb25mX3ZhbCA9IChlY2NzaXplMSA8PCAyMikgfCAoZWNjc2l6ZTAgPDwgMTIpOworCisgICAgLyogRUNDQUxHT1JJVEhNIHwgRUNDQkNIVDggfCBFQ0NXUkFQTU9ERSB8IEVDQzE2QiB8CisgICAgICogRUNDVE9QU0VDVE9SIHwgRUNDQ1MgfCBFQ0MgRW5hYmxlCisgICAgICovCisgICAgZWNjX2NvbmZfdmFsID0gKCgweDAxIDw8IDE2KSB8IChiY2hfbW9kIDw8IDEyKSB8ICgweDA0IDw8IDgpIHwKKwkJICAgIChkZXZfd2lkdGggPDwgNykgfCAoMHgwMyA8PCA0KSB8CisJCSAgICAoMCA8PCAxKSB8ICgweDEpKTsKKyAgICBicmVhazsKKyAgY2FzZSBOQU5EX0VDQ19XUklURSAgIDoKKyAgICBlY2NzaXplMSA9IDB4MjA7IGVjY3NpemUwID0gMHgwMDsKKworICAgIC8qIEVDQ1NJWkUxPTMyIHwgRUNDU0laRTA9MDAgKi8KKyAgICBlY2Nfc2l6ZV9jb25mX3ZhbCA9IChlY2NzaXplMSA8PCAyMikgfCAoZWNjc2l6ZTAgPDwgMTIpOworCisgICAgLyogRUNDQUxHT1JJVEhNIHwgRUNDQkNIVDggfCBFQ0NXUkFQTU9ERSB8IEVDQzE2QiB8CisgICAgICogRUNDVE9QU0VDVE9SIHwgRUNDQ1MgfCBFQ0MgRW5hYmxlCisgICAgICovCisgICAgZWNjX2NvbmZfdmFsID0gKCgweDAxIDw8IDE2KSB8IChiY2hfbW9kIDw8IDEyKSB8ICgweDA2IDw8IDgpIHwKKwkJICAgIChkZXZfd2lkdGggPDwgNykgfCAoMHgwMyA8PCA0KSB8CisJCSAgICAoMCA8PCAxKSB8ICgweDEpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBwcmludGYoIkVycm9yOiBVbnJlY29nbml6ZWQgTW9kZVslZF0hXG4iLCBtb2RlKTsKKyAgICBicmVhazsKKyAgfQorCisgIF9fcmF3X3dyaXRlbCgweDEsIChHUE1DX0VDQ19DT05UUk9MKSk7CisgIF9fcmF3X3dyaXRlbChlY2Nfc2l6ZV9jb25mX3ZhbCwgKEdQTUNfRUNDX1NJWkVfQ09ORklHKSk7CisgIF9fcmF3X3dyaXRlbChlY2NfY29uZl92YWwsIChHUE1DX0VDQ19DT05GSUcpKTsKKyAgX19yYXdfd3JpdGVsKDB4MTAxLCAoR1BNQ19FQ0NfQ09OVFJPTCkpOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL29tYXBfYmNoX2RlY29kZXIuYyBiL3gtbG9hZGVyL2xpYi9vbWFwX2JjaF9kZWNvZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3ZTkzYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9vbWFwX2JjaF9kZWNvZGVyLmMKQEAgLTAsMCArMSw0MDUgQEAKKy8qCisgKiBsaWIvb21hcF9iY2hfZGVjb2Rlci5jCisgKgorICogV2hvbGUgQkNIIEVDQyBEZWNvZGVyIChQb3N0IGhhcmR3YXJlIGdlbmVyYXRlZCBzeW5kcm9tZSBkZWNvZGluZykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiBBdXRob3I6IFN1a3VtYXIgR2hvcmFpIDxzLWdob3JhaUB0aS5jb20KKyAqCQkgICBNaWNoYWVsIEZpbGxpbmdlciA8bS1maWxsaW5nZXJAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2RlZmluZSBwcmludGsgLy9wcmludGYKKworI2RlZmluZSBtbQkJMTMKKyNkZWZpbmUga2tfc2hvcnRlbgk0MDk2CisjZGVmaW5lIG5uCQk4MTkxCS8qIExlbmd0aCBvZiBjb2Rld29yZCwgbiA9IDIqKm1tIC0gMSAqLworCisjZGVmaW5lIFBQUAkweDIwMUIJLyogUHJpbWFyeSBQb2x5bm9taWFsIDogeF4xMyArIHheNCArIHheMyArIHggKyAxICovCisjZGVmaW5lIFAJMHgwMDFCCS8qIFdpdGggb21pdHRlZCB4XjEzICovCisjZGVmaW5lIFBPTFkJMTIJLyogZGVncmVlIG9mIHRoZSBwcmltYXJ5IFBvbHlub21pYWwgbGVzcyBvbmUgKi8KKworLyoqCisgKiBtcHlfbW9kX2dmIC0gR0FMT0lTIGZpZWxkIG11bHRpcGxpZXIKKyAqIElucHV0ICA6IEEoeCksIEIoeCkKKyAqIE91dHB1dCA6IEEoeCkqQih4KSBtb2QgUCh4KQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1weV9tb2RfZ2YodW5zaWduZWQgaW50IGEsIHVuc2lnbmVkIGludCBiKQoreworCXVuc2lnbmVkIGludCBSID0gMDsKKwl1bnNpZ25lZCBpbnQgUjEgPSAwOworCXVuc2lnbmVkIGludCBrID0gMDsKKworCWZvciAoayA9IDA7IGsgPCBtbTsgaysrKSB7CisKKwkJUiA9IChSIDw8IDEpICYgMHgxRkZFOworCQlpZiAoUjEgPT0gMSkKKwkJCVIgXj0gUDsKKworCQlpZiAoKChhID4+IChQT0xZIC0gaykpICYgMSkgPT0gMSkKKwkJCVIgXj0gYjsKKworCQlpZiAoayA8IFBPTFkpCisJCQlSMSA9IChSID4+IFBPTFkpICYgMTsKKwl9CisJcmV0dXJuIFI7Cit9CisKKy8qKgorICogY2hpZW4gLSBDSElFTiBzZWFyY2gKKyAqCisgKiBAbG9jYXRpb24gLSBFcnJvciBsb2NhdGlvbiB2ZWN0b3IgcG9pbnRlcgorICoKKyAqIElucHV0cyAgOiBFTFAoeikKKyAqCSAgICAgTm8uIG9mIGZvdW5kIGVycm9ycworICoJICAgICBTaXplIG9mIGlucHV0IGNvZGV3b3JkCisgKiBPdXRwdXRzIDogVXAgdG8gOCBsb2NhdGlvbnMKKyAqCSAgICAgTm8uIG9mIGVycm9ycworICovCitzdGF0aWMgaW50IGNoaWVuKHVuc2lnbmVkIGludCBzZWxlY3RfNF84LCBpbnQgZXJyX251bXMsCisJCQkJdW5zaWduZWQgaW50IGVycltdLCB1bnNpZ25lZCBpbnQgKmxvY2F0aW9uKQoreworCWludCBpLCBjb3VudDsgLyogTnVtYmVyIG9mIGRlY3RlY3RlZCBlcnJvcnMgKi8KKwkvKiBDb250YWlucyBhY2N1bXVsYXRpb24gb2YgZXZhbHVhdGlvbiBhdCB4XmkgKGk6MS0+OCkgKi8KKwl1bnNpZ25lZCBpbnQgZ2FtbWFzWzhdOworCXVuc2lnbmVkIGludCBhbHBoYTsKKwl1bnNpZ25lZCBpbnQgYml0LCBlY2NfYml0czsKKwl1bnNpZ25lZCBpbnQgZWxwX3N1bTsKKworCWVjY19iaXRzID0gKHNlbGVjdF80XzggPT0gMCkgPyA1MiA6IDEwNDsKKwkKKwkvKiBTdGFydCBldmFsdWF0aW9uIGF0IEFscGhhKio4MTkyIGFuZCBkZWNyZWFzaW5nICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJZ2FtbWFzW2ldID0gZXJyW2ldOworCisJY291bnQgPSAwOworCWZvciAoaSA9IDE7IChpIDw9IG5uKSAmJiAoY291bnQgPCBlcnJfbnVtcyk7IGkrKykgeworCisJCS8qIFJlc3VsdCBvZiBldmFsdWF0aW9uIGF0IHJvb3QgKi8KKwkJZWxwX3N1bSA9IDEgXiBnYW1tYXNbMF0gXiBnYW1tYXNbMV0gXgorCQkJCWdhbW1hc1syXSBeIGdhbW1hc1szXSBeCisJCQkJZ2FtbWFzWzRdIF4gZ2FtbWFzWzVdIF4KKwkJCQlnYW1tYXNbNl0gXiBnYW1tYXNbN107CisKKwkJYWxwaGEgPSBQUFAgPj4gMTsKKwkJZ2FtbWFzWzBdID0gbXB5X21vZF9nZihnYW1tYXNbMF0sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTIgKi8KKwkJZ2FtbWFzWzFdID0gbXB5X21vZF9nZihnYW1tYXNbMV0sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTIgKi8KKwkJZ2FtbWFzWzJdID0gbXB5X21vZF9nZihnYW1tYXNbMl0sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTMgKi8KKwkJZ2FtbWFzWzNdID0gbXB5X21vZF9nZihnYW1tYXNbM10sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTQgKi8KKwkJZ2FtbWFzWzRdID0gbXB5X21vZF9nZihnYW1tYXNbNF0sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTUgKi8KKwkJZ2FtbWFzWzVdID0gbXB5X21vZF9nZihnYW1tYXNbNV0sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTYgKi8KKwkJZ2FtbWFzWzZdID0gbXB5X21vZF9nZihnYW1tYXNbNl0sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTcgKi8KKwkJZ2FtbWFzWzddID0gbXB5X21vZF9nZihnYW1tYXNbN10sIGFscGhhKTsKKworCQlpZiAoZWxwX3N1bSA9PSAwKSB7CisJCQkvKiBjYWxjdWxhdGUgbG9jYXRpb24gKi8KKwkJCWJpdCA9ICgoaS0xKSAmIH43KXwoNy0oKGktMSkgJiA3KSk7CisJCQlsb2NhdGlvbltjb3VudCsrXSA9IGtrX3Nob3J0ZW4gLSAoYml0IC0gMiAqIGVjY19iaXRzKSAtIDE7CisJCX0KKwl9CisKKwkvKiBGYWlsdXJlOiBOby4gb2YgZGV0ZWN0ZWQgZXJyb3JzICE9IE5vLiBvciBjb3JyZWN0ZWQgZXJyb3JzICovCisJaWYgKGNvdW50ICE9IGVycl9udW1zKSB7CisJCWNvdW50ID0gLTE7CisJCS8qCXByaW50ayhLRVJOX0lORk8gIkJDSCBkZWNvZGluZyBmYWlsZWRcbiIpOyovCisJfQorCS8qCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXByaW50ayhLRVJOX0lORk8gIiVkICIsIGxvY2F0aW9uW2ldKTsKKwkqLworCXJldHVybiBjb3VudDsKK30KKworLyogc3luZCA6IDE2IFN5bmRyb21lcworICogcmV0dXJuOiBnYW1hYXMgLSBDb2VmZmljaWVudHMgdG8gdGhlIGVycm9yIHBvbHlub21pYWwKKyAqIHJldHVybjogOiBOdW1iZXIgb2YgZGV0ZWN0ZWQgZXJyb3JzCisqLworc3RhdGljIHVuc2lnbmVkIGludCBiZXJsZWthbXAodW5zaWduZWQgaW50IHNlbGVjdF80XzgsCisJCQl1bnNpZ25lZCBpbnQgc3luZFtdLCB1bnNpZ25lZCBpbnQgZXJyW10pCit7CisJaW50IGxvb3AsIGl0ZXJhdGlvbjsKKwl1bnNpZ25lZCBpbnQgTEwgPSAwOwkJLyogRGV0ZWN0ZWQgZXJyb3JzICovCisJdW5zaWduZWQgaW50IGQgPSAwOwkvKiBEaXN0YW5jZSBiZXR3ZWVuIFN5bmRyb21lcyBhbmQgRUxQW25dKHopICovCisJdW5zaWduZWQgaW50IGludmQgPSAwOwkJLyogSW52ZXJzZSBvZiBkICovCisJLyogSW50ZXJtZWRpYXRlIEVMUFtuXSh6KS4KKwkgKiBGaW5hbCBFTFBbbl0oeikgaXMgRXJyb3IgTG9jYXRpb24gUG9seW5vbWlhbAorCSAqLworCXVuc2lnbmVkIGludCBnYW1tYXNbMTZdOworCS8qIEludGVybWVkaWF0ZSBub3JtYWxpemVkIEVMUFtuXSh6KSA6IERbbl0oeikgKi8KKwl1bnNpZ25lZCBpbnQgRFsxNl07CisJLyogVGVtcG9yYXJ5IHZhbHVlIHRoYXQgaG9sZHMgYW4gRUxQW25dKHopIGNvZWZmaWNpZW50ICovCisJdW5zaWduZWQgaW50IG5leHRfZ2FtbWEgPSAwOworCisJaW50IGUgPSAwOworCXVuc2lnbmVkIGludCBzaWduID0gMDsKKwl1bnNpZ25lZCBpbnQgdSA9IDA7CisJdW5zaWduZWQgaW50IHYgPSAwOworCXVuc2lnbmVkIGludCBDMSA9IDAsIEMyID0gMDsKKwl1bnNpZ25lZCBpbnQgc3MgPSAwOworCXVuc2lnbmVkIGludCB0bXBfdiA9IDAsIHRtcF9zID0gMDsKKwl1bnNpZ25lZCBpbnQgdG1wX3BvbHk7CisKKwkvKi0tLS0tLS0tLS0tLS0tIFN0ZXAgMCAtLS0tLS0tLS0tLS0tLS0tLS0qLworCWZvciAobG9vcCA9IDA7IGxvb3AgPCAxNjsgbG9vcCsrKSB7CisJCWdhbW1hc1tsb29wXSA9IDA7CisJCURbbG9vcF0gPSAwOworCX0KKworCWdhbW1hc1swXSA9IDE7CisJRFsxXSA9IDE7CisKKwlpdGVyYXRpb24gPSAwOworCUxMID0gMDsKKwl3aGlsZSAoKGl0ZXJhdGlvbiA8ICgoc2VsZWN0XzRfOCsxKSoyKjQpKSAmJgorCQkJKExMIDw9ICgoc2VsZWN0XzRfOCsxKSo0KSkpIHsKKworCSAgLypwcmludGsoS0VSTl9JTkZPICJcbkl0ZXJhdGlvbi4uLi4uLi4uLi4uLi4lZFxuIiwgaXRlcmF0aW9uKTsqLworCQlkID0gMDsKKwkJLyogU3RlcDogMCAqLworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDw9IExMOyBsb29wKyspIHsKKwkJCXRtcF9wb2x5ID0gbXB5X21vZF9nZigKKwkJCQkJZ2FtbWFzW2xvb3BdLCBzeW5kW2l0ZXJhdGlvbiAtIGxvb3BdKTsKKwkJCWQgXj0gdG1wX3BvbHk7CisJCQkvKnByaW50ayhLRVJOX0lORk8gIiUwMmQuIHM9MCBMTD0leCBwb2x5ICV4XG4iLAorCQkJICBsb29wLCBMTCwgdG1wX3BvbHkpOyovCisJCX0KKworCQkvKiBTdGVwIDE6IDEgY3ljbGUgb25seSB0byBwZXJmb3JtIGludmVyc2lvbiAqLworCQl2ID0gZCA8PCAxOworCQllID0gLTE7CisJCXNpZ24gPSAxOworCQlzcyA9IDB4MjAwMDsKKwkJaW52ZCA9IDA7CisJCXUgPSBQUFA7CisJCWZvciAobG9vcCA9IDA7IChkICE9IDApICYmIChsb29wIDw9ICgyICogUE9MWSkpOyBsb29wKyspIHsKKwkJICAvKnByaW50ayhLRVJOX0lORk8gIiUwMmQuIHM9MSBMTD0leCBwb2x5IE5VTExcbiIsCisJCSAgICBsb29wLCBMTCk7Ki8KKwkJCUMxID0gKHYgPj4gMTMpICYgMTsKKwkJCUMyID0gQzEgJiBzaWduOworCisJCQlzaWduIF49IEMyIF4gKGUgPT0gMCk7CisKKwkJCXRtcF92ID0gdjsKKwkJCXRtcF9zID0gc3M7CisKKwkJCWlmIChDMSA9PSAxKSB7CisJCQkJdiBePSB1OworCQkJCXNzIF49IGludmQ7CisJCQl9CisJCQl2ID0gKHYgPDwgMSkgJiAweDNGRkY7CisJCQlpZiAoQzIgPT0gMSkgeworCQkJCXUgPSB0bXBfdjsKKwkJCQlpbnZkID0gdG1wX3M7CisJCQkJZSA9IC1lOworCQkJfQorCQkJaW52ZCA+Pj0gMTsKKwkJCWUtLTsKKwkJfQorCisJCWZvciAobG9vcCA9IDA7IChkICE9IDApICYmIChsb29wIDw9IChpdGVyYXRpb24gKyAxKSk7IGxvb3ArKykgeworCQkJLyogU3RlcCAyCisJCQkgKiBJbnRlcmxlYXZlZCB3aXRoIFN0ZXAgMywgaWYgTDwobi1rKQorCQkJICogaW52ZDogVXBkYXRlIG9mIEVMUFtuXSh6KSA9IEVMUFtuLTFdKHopIC0gZC5EW24tMV0oeikKKwkJCSAqLworCisJCQkvKiBIb2xkcyB2YWx1ZSBvZiBFTFAgY29lZmZpY2llbnQgdW50aWwgcHJlY2VkZW50CisJCQkgKiB2YWx1ZSBkb2VzIG5vdCBoYXZlIHRvIGJlIHVzZWQgYW55bW9yZQorCQkJICovCisJCQl0bXBfcG9seSA9IG1weV9tb2RfZ2YoZCwgRFtsb29wXSk7CisJCQkvKnByaW50ayhLRVJOX0lORk8gIiUwMmQuIHM9MiBMTD0leCBwb2x5ICV4XG4iLAorCQkJICBsb29wLCBMTCwgdG1wX3BvbHkpOyovCisKKwkJCW5leHRfZ2FtbWEgPSBnYW1tYXNbbG9vcF0gXiB0bXBfcG9seTsKKwkJCWlmICgoMiAqIExMKSA8IChpdGVyYXRpb24gKyAxKSkgeworCQkJCS8qIEludGVybGVhdmluZyB3aXRoIFN0ZXAgMworCQkJCSAqIGZvciBwYXJhbGxlbGl6ZWQgdXBkYXRlIG9mIEVMUCh6KSBhbmQgRCh6KQorCQkJCSAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiBVcGRhdGUgb2YgRUxQKHopIG9ubHkgLT4gc3RheSBpbiBTdGVwIDIgKi8KKwkJCQlnYW1tYXNbbG9vcF0gPSBuZXh0X2dhbW1hOworCQkJCWlmIChsb29wID09IChpdGVyYXRpb24gKyAxKSkgeworCQkJCQkvKiB0byBzdGVwIDQgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvKiBTdGVwIDMKKwkJCSAqIEFsd2F5cyBpbnRlcmxlYXZlZCB3aXRoIFN0ZXAgMiAoY2FzZSB3aGVuIEw8KG4taykpCisJCQkgKiBVcGRhdGUgb2YgRFtuLTFdKHopID0gRUxQW24tMV0oeikvZAorCQkJICovCisJCQlEW2xvb3BdID0gbXB5X21vZF9nZihnYW1tYXNbbG9vcF0sIGludmQpOworCQkJLypwcmludGsoS0VSTl9JTkZPICIlMDJkLiBzPTMgTEw9JXggcG9seSAleFxuIiwKKwkJCSAgbG9vcCwgTEwsIERbbG9vcF0pOyovCisKKwkJCS8qIENhbiBzYWZlbHkgdXBkYXRlIEVMUFtuXSh6KSAqLworCQkJZ2FtbWFzW2xvb3BdID0gbmV4dF9nYW1tYTsKKworCQkJaWYgKGxvb3AgPT0gKGl0ZXJhdGlvbiArIDEpKSB7CisJCQkJLyogSWYgdXBkYXRlIGZpbmlzaGVkICovCisJCQkJTEwgPSBpdGVyYXRpb24gLSBMTCArIDE7CisJCQkJLyogdG8gc3RlcCA0ICovCisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBFbHNlLCBpbnRlcmxlYXZpbmcgdG8gc3RlcCAyKi8KKwkJfQorCisJCS8qIFN0ZXAgNDogVXBkYXRlIEQoeik6IGk6MC0+TCAqLworCQkvKiBGaW5hbCB1cGRhdGUgb2YgRFtuXSh6KSA9IERbbl0oeikueiovCisJCWZvciAobG9vcCA9IDA7IGxvb3AgPCAxNTsgbG9vcCsrKSAvKiBMZWZ0IFNoaWZ0ICovCisJCQlEWzE1IC0gbG9vcF0gPSBEWzE0IC0gbG9vcF07CisKKwkJRFswXSA9IDA7CisKKwkJaXRlcmF0aW9uKys7CisJfSAvKiB3aGlsZSAqLworCisJLyogUHJvY2Vzc2luZyBmaW5pc2hlZCwgY29weSBFTFAgdG8gZmluYWwgcmVnaXN0ZXJzIDogMC0+MnQtMSovCisJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKKwkJZXJyW2xvb3BdID0gZ2FtbWFzW2xvb3ArMV07CisKKwkvKnByaW50ayhLRVJOX0lORk8gIlxuIEVyciBwb2x5OiIpOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCisJCXByaW50ayhLRVJOX0lORk8gIjB4JXggIiwgZXJyW2xvb3BdKTsKKwkqLworCXJldHVybiBMTDsKK30KKworLyoKKyAqIHN5bmRyb21lIC0gR2VuZXJhdGUgc3luZHJvbWUgY29tcG9uZW50cyBmcm9tIGh3IGdlbmVyYXRlIHN5bmRyb21lCisgKiByKHgpID0gYyh4KSArIGUoeCkKKyAqIHMoeCkgPSBjKHgpIG1vZCBnKHgpICsgZSh4KSBtb2QgZyh4KSA9ICBlKHgpIG1vZCBnKHgpCisgKiBzbyByZWNlaXZlciBjaGVja3MgaWYgdGhlIHN5bmRyb21lIHMoeCkgPSByKHgpIG1vZCBnKHgpIGlzIGVxdWFsIHRvIHplcm8uCisgKiB1bnNpZ25lZCBpbnQgc1sxNl07IC0gU3luZHJvbWVzCisgKi8KK3N0YXRpYyB2b2lkIHN5bmRyb21lKHVuc2lnbmVkIGludCBzZWxlY3RfNF84LAorCQkJCQl1bnNpZ25lZCBjaGFyICplY2MsIHVuc2lnbmVkIGludCBzeW5bXSkKK3sKKwl1bnNpZ25lZCBpbnQgaywgbCwgdDsKKwl1bnNpZ25lZCBpbnQgYWxwaGFfYml0LCBSX2JpdDsKKwlpbnQgZWNjX3BvcywgZWNjX21pbjsKKworCS8qIDJ0LTEgPSAxNSAoZm9yIHQ9OCkgbWluaW1hbCBwb2x5bm9taWFscyBvZiB0aGUgZmlyc3QgMTUgcG93ZXJzIG9mIGEKKwkgKiBwcmltaXRpdmUgZWxlbW1hbnRzIG9mIEdGKG0pOyBFdmVuIHBvd2VycyBtaW5pbWFsIHBvbHlub21pYWxzIGFyZQorCSAqIGR1cGxpY2F0ZSBvZiBvZGQgcG93ZXJzJyBtaW5pbWFsIHBvbHlub21pYWxzLgorCSAqIE9kZCBwb3dlcnMgb2YgYWxwaGEgKDEgdG8gMTUpCisJICovCisJdW5zaWduZWQgaW50IHBvd19hbHBoYVs4XSA9IHsweDAwMDIsIDB4MDAwOCwgMHgwMDIwLCAweDAwODAsCisJCQkJIDB4MDIwMCwgMHgwODAwLCAweDAwMUIsIDB4MDA2Q307CisKKwkvKnByaW50ayhLRVJOX0lORk8gIlxuIEVDQ1swLi5uXTogIik7CisJZm9yIChrID0gMDsgayA8IDEzOyBrKyspCisJCXByaW50ayhLRVJOX0lORk8gIjB4JXggIiwgZWNjW2tdKTsKKwkqLworCisJaWYgKHNlbGVjdF80XzggPT0gMCkgeworCQl0ID0gNDsKKwkJZWNjX3BvcyA9IDU1OyAvKiBiaXRzKDUyLWJpdHMpOiA1NS0+NCAqLworCQllY2NfbWluID0gNDsKKwl9IGVsc2UgeworCQl0ID0gODsKKwkJZWNjX3BvcyA9IDEwMzsgLyogYml0czogMTAzLT4wICovCisJCWVjY19taW4gPSAwOworCX0KKworCS8qIHRvdGFsIG51bWJiZXIgb2Ygc3luZHJvbSB0byBiZSB1c2VkIGlzIDJ0ICovCisJLyogU3RlcDE6IGNhbGN1bGF0ZSB0aGUgb2RkIHN5bmRyb21lKHMpICovCisJUl9iaXQgPSAoKGVjY1tlY2NfcG9zLzhdID4+ICg3IC0gZWNjX3BvcyU4KSkgJiAxKTsKKwllY2NfcG9zLS07CisJZm9yIChrID0gMDsgayA8IHQ7IGsrKykKKwkJc3luWzIgKiBrXSA9IFJfYml0OworCisJd2hpbGUgKGVjY19wb3MgPj0gZWNjX21pbikgeworCQlSX2JpdCA9ICgoZWNjW2VjY19wb3MvOF0gPj4gKDcgLSBlY2NfcG9zJTgpKSAmIDEpOworCQllY2NfcG9zLS07CisKKwkJZm9yIChrID0gMDsgayA8IHQ7IGsrKykgeworCQkJLyogQWNjdW11bGF0ZSB2YWx1ZSBvZiB4XmkgYXQgYWxwaGFeKDJrKzEpICovCisJCQlpZiAoUl9iaXQgPT0gMSkKKwkJCQlzeW5bMiprXSBePSBwb3dfYWxwaGFba107CisKKwkJCS8qIENvbXB1dGUgYSoqKDJrKzEpLCB1c2luZyBMU0ZSICovCisJCQlmb3IgKGwgPSAwOyBsIDwgKDIgKiBrICsgMSk7IGwrKykgeworCQkJCWFscGhhX2JpdCA9IChwb3dfYWxwaGFba10gPj4gUE9MWSkgJiAxOworCQkJCXBvd19hbHBoYVtrXSA9IChwb3dfYWxwaGFba10gPDwgMSkgJiAweDFGRkY7CisJCQkJaWYgKGFscGhhX2JpdCA9PSAxKQorCQkJCQlwb3dfYWxwaGFba10gXj0gUDsKKwkJCX0KKwkJfQorCX0KKworCS8qIFN0ZXAyOiBjYWxjdWxhdGUgdGhlIGV2ZW4gc3luZHJvbWUocykKKwkgKiBDb21wdXRlIFMoYSksIHdoZXJlIGEgaXMgYW4gZXZlbiBwb3dlciBvZiBhbHBoYQorCSAqIEV2ZW5yeSBldmVuIHBvd2VyIG9mIHByaW1pdGl2ZSBlbGVtZW50IGhhcyB0aGUgc2FtZSBtaW5pbWFsCisJICogcG9seW5vbWlhbCBhcyBzb21lIG9kZCBwb3dlciBvZiBlbGVtZXRzLgorCSAqIEFuZCBiYXNlZCBvbiBTKGFeMikgPSBTXjIoYSkKKwkgKi8KKwlmb3IgKGsgPSAwOyBrIDwgdDsgaysrKQorCQlzeW5bMiprKzFdID0gbXB5X21vZF9nZihzeW5ba10sIHN5bltrXSk7CisKKwkvKnByaW50ayhLRVJOX0lORk8gIlxuIFN5bmRyb21lczogIik7CisJZm9yIChrID0gMDsgayA8IDE2OyBrKyspCisJcHJpbnRrKEtFUk5fSU5GTyAiMHgleCAiLCBzeW5ba10pOyovCit9CisKKy8qKgorICogZGVjb2RlX2JjaCAtIEJDSCBkZWNvZGVyIGZvciA0LSBhbmQgOC1iaXQgZXJyb3IgY29ycmVjdGlvbgorICoKKyAqIEBlY2MgLSBFQ0Mgc3luZHJvbWUgZ2VuZXJhdGVkIGJ5IGh3IEJDSCBlbmdpbmUKKyAqIEBlcnJfbG9jIC0gcG9pbnRlciB0byBlcnJvciBsb2NhdGlvbiBhcnJheQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBwb3N0IHN5ZHJvbWUgZ2VuZXJhdGlvbiAoaHcgZ2VuZXJhdGVkKSBkZWNvZGluZworICogZm9yOi0KKyAqIERpbWVuc2lvbiBvZiBHYWxvaXNlIEZpZWxkOiBtID0gMTMKKyAqIExlbmd0aCBvZiBjb2Rld29yZDogbiA9IDIqKm0gLSAxCisgKiBOdW1iZXIgb2YgZXJyb3JzIHRoYXQgY2FuIGJlIGNvcnJlY3RlZDogNC0gb3IgOC1iaXRzCisgKiBMZW5ndGggb2YgaW5mb3JtYXRpb24gYml0OiBrayA9IG5uIC0gcnIKKyAqLworaW50IGRlY29kZV9iY2goaW50IHNlbGVjdF80XzgsIHVuc2lnbmVkIGNoYXIgKmVjYywgdW5zaWduZWQgaW50ICplcnJfbG9jKQoreworICAgICAgICBpbnQgbm9fb2ZfZXJyLCBpOworCXVuc2lnbmVkIGludCBzeW5bMTZdOwkvKiAxNiBTeW5kcm9tZXMgKi8KKwl1bnNpZ25lZCBpbnQgZXJyX3BvbHlbOF07CisJLyogQ29lZmZpY2llbnRzIHRvIHRoZSBlcnJvciBwb2x5bm9taWFsCisJICogRUxQKHgpID0gMSArIGVycjAueCArIGVycjEueF4yICsgLi4uICsgZXJyNy54XjgKKwkgKi8KKworCS8qIHBlcmZvcm0gbWFudWFsIGluaXRpYWxpemF0aW9uIHRvIGF2b2lkIG1lbXNldCAqLworCWZvciAoaT0wOyBpPDE2OyBpKyspIHsKKwkgIHN5bltpXSA9IDA7CisJICBpZiAoaTw4KQorCSAgICBlcnJfcG9seVtpXSA9IDA7CisJfQorCisJLyogRGVjb3RpbmcgaW52b2xlcyB0aHJlZSBzdGVwcworCSAqIDEuIENvbXB1dGUgdGhlIHN5bmRyb20gZnJvbSB0ZWggcmVjZWl2ZWQgY29kZXdvcmQsCisJICogMi4gRmluZCB0aGUgZXJyb3IgbG9jYXRpb24gcG9seW5vbWlhbCBmcm9tIGEgc2V0IG9mIGVxdWF0aW9ucworCSAqICAgICBkZXJpdmVkIGZyb20gdGhlIHN5bmRyb21lLAorCSAqIDMuIFVzZSB0aGUgZXJyb3IgbG9jYXRpb24gcG9seW5vbWlhbCB0byBpZGVudGlmeSBlcnJhbnRzIGJpdHMsCisJICoKKwkgKiBBbmQgY29ycmVjdHRpb24gZG9uZSBieSBiaXQgZmxpcHMgdXNpbmcgZXJyb3IgbG9jYWl0b24gYW5kIGV4cGVjdGVkCisJICogdG8gYmUgb3V0c2VpZGUgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKwkgKi8KKwlzeW5kcm9tZShzZWxlY3RfNF84LCBlY2MsIHN5bik7CisJbm9fb2ZfZXJyID0gYmVybGVrYW1wKHNlbGVjdF80XzgsIHN5biwgZXJyX3BvbHkpOworCWlmIChub19vZl9lcnIgPD0gKDQgPDwgc2VsZWN0XzRfOCkpCisJCW5vX29mX2VyciA9IGNoaWVuKHNlbGVjdF80XzgsIG5vX29mX2VyciwgZXJyX3BvbHksIGVycl9sb2MpOworCisJcmV0dXJuIG5vX29mX2VycjsKK30KK0VYUE9SVF9TWU1CT0woZGVjb2RlX2JjaCk7CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvcHJpbnRmLmMgYi94LWxvYWRlci9saWIvcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkMjJmYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9wcmludGYuYwpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIEJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgZmlsZToKKyAqICBsaW51eC9saWIvdnNwcmludGYuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworLyogdnNwcmludGYuYyAtLSBMYXJzIFdpcnplbml1cyAmIExpbnVzIFRvcnZhbGRzLiAqLworLyoKKyAqIFdpcnplbml1cyB3cm90ZSB0aGlzIHBvcnRhYmx5LCBUb3J2YWxkcyBmdWNrZWQgaXQgdXAgOi0pCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ0ZHX1BSSU5URgorIAorLyogd2UgdXNlIHRoaXMgc28gdGhhdCB3ZSBjYW4gZG8gd2l0aG91dCB0aGUgY3R5cGUgbGlicmFyeSAqLworI2RlZmluZSBpc19kaWdpdChjKQkoKGMpID49ICcwJyAmJiAoYykgPD0gJzknKQorCitzaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICogcywgc2l6ZV90IGNvdW50KQoreworCWNvbnN0IGNoYXIgKnNjOworCisJZm9yIChzYyA9IHM7IGNvdW50LS0gJiYgKnNjICE9ICdcMCc7ICsrc2MpCisJCS8qIG5vdGhpbmcgKi87CisJcmV0dXJuIHNjIC0gczsKK30KKworc3RhdGljIGludCBza2lwX2F0b2koY29uc3QgY2hhciAqKnMpCit7CisJaW50IGk9MDsKKworCXdoaWxlIChpc19kaWdpdCgqKnMpKQorCQlpID0gaSoxMCArICooKCpzKSsrKSAtICcwJzsKKwlyZXR1cm4gaTsKK30KKworI2RlZmluZSBaRVJPUEFECTEJCS8qIHBhZCB3aXRoIHplcm8gKi8KKyNkZWZpbmUgU0lHTgkyCQkvKiB1bnNpZ25lZC9zaWduZWQgbG9uZyAqLworI2RlZmluZSBQTFVTCTQJCS8qIHNob3cgcGx1cyAqLworI2RlZmluZSBTUEFDRQk4CQkvKiBzcGFjZSBpZiBwbHVzICovCisjZGVmaW5lIExFRlQJMTYJCS8qIGxlZnQganVzdGlmaWVkICovCisjZGVmaW5lIFNQRUNJQUwJMzIJCS8qIDB4ICovCisjZGVmaW5lIExBUkdFCTY0CQkvKiB1c2UgJ0FCQ0RFRicgaW5zdGVhZCBvZiAnYWJjZGVmJyAqLworCisjZGVmaW5lIGRvX2RpdihuLGJhc2UpICh7IFwKK2ludCBfX3JlczsgXAorX19yZXMgPSAoKHVuc2lnbmVkIGxvbmcpIG4pICUgKHVuc2lnbmVkKSBiYXNlOyBcCituID0gKCh1bnNpZ25lZCBsb25nKSBuKSAvICh1bnNpZ25lZCkgYmFzZTsgXAorX19yZXM7IH0pCisKK3N0YXRpYyBjaGFyICogbnVtYmVyKGNoYXIgKiBzdHIsIGxvbmcgbnVtLCBpbnQgYmFzZSwgaW50IHNpemUsIGludCBwcmVjaXNpb24KKwksaW50IHR5cGUpCit7CisJY2hhciBjLHNpZ24sdG1wWzY2XTsKKwljb25zdCBjaGFyICpkaWdpdHM9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisJaW50IGk7CisKKwlpZiAodHlwZSAmIExBUkdFKQorCQlkaWdpdHMgPSAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKKwlpZiAodHlwZSAmIExFRlQpCisJCXR5cGUgJj0gflpFUk9QQUQ7CisJaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikKKwkJcmV0dXJuIDA7CisJYyA9ICh0eXBlICYgWkVST1BBRCkgPyAnMCcgOiAnICc7CisJc2lnbiA9IDA7CisJaWYgKHR5cGUgJiBTSUdOKSB7CisJCWlmIChudW0gPCAwKSB7CisJCQlzaWduID0gJy0nOworCQkJbnVtID0gLW51bTsKKwkJCXNpemUtLTsKKwkJfSBlbHNlIGlmICh0eXBlICYgUExVUykgeworCQkJc2lnbiA9ICcrJzsKKwkJCXNpemUtLTsKKwkJfSBlbHNlIGlmICh0eXBlICYgU1BBQ0UpIHsKKwkJCXNpZ24gPSAnICc7CisJCQlzaXplLS07CisJCX0KKwl9CisJaWYgKHR5cGUgJiBTUEVDSUFMKSB7CisJCWlmIChiYXNlID09IDE2KQorCQkJc2l6ZSAtPSAyOworCQllbHNlIGlmIChiYXNlID09IDgpCisJCQlzaXplLS07CisJfQorCWkgPSAwOworCWlmIChudW0gPT0gMCkKKwkJdG1wW2krK109JzAnOworCWVsc2Ugd2hpbGUgKG51bSAhPSAwKQorCQl0bXBbaSsrXSA9IGRpZ2l0c1tkb19kaXYobnVtLGJhc2UpXTsKKwlpZiAoaSA+IHByZWNpc2lvbikKKwkJcHJlY2lzaW9uID0gaTsKKwlzaXplIC09IHByZWNpc2lvbjsKKwlpZiAoISh0eXBlJihaRVJPUEFEK0xFRlQpKSkKKwkJd2hpbGUoc2l6ZS0tPjApCisJCQkqc3RyKysgPSAnICc7CisJaWYgKHNpZ24pCisJCSpzdHIrKyA9IHNpZ247CisJaWYgKHR5cGUgJiBTUEVDSUFMKSB7CisJCWlmIChiYXNlPT04KQorCQkJKnN0cisrID0gJzAnOworCQllbHNlIGlmIChiYXNlPT0xNikgeworCQkJKnN0cisrID0gJzAnOworCQkJKnN0cisrID0gZGlnaXRzWzMzXTsKKwkJfQorCX0KKwlpZiAoISh0eXBlICYgTEVGVCkpCisJCXdoaWxlIChzaXplLS0gPiAwKQorCQkJKnN0cisrID0gYzsKKwl3aGlsZSAoaSA8IHByZWNpc2lvbi0tKQorCQkqc3RyKysgPSAnMCc7CisJd2hpbGUgKGktLSA+IDApCisJCSpzdHIrKyA9IHRtcFtpXTsKKwl3aGlsZSAoc2l6ZS0tID4gMCkKKwkJKnN0cisrID0gJyAnOworCXJldHVybiBzdHI7Cit9CisKKyAKK3N0YXRpYyBpbnQgdnNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3sKKwlpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgbnVtOworCWludCBpLCBiYXNlOworCWNoYXIgKiBzdHI7CisJY29uc3QgY2hhciAqczsKKworCWludCBmbGFnczsJCS8qIGZsYWdzIHRvIG51bWJlcigpICovCisKKwlpbnQgZmllbGRfd2lkdGg7CS8qIHdpZHRoIG9mIG91dHB1dCBmaWVsZCAqLworCWludCBwcmVjaXNpb247CQkvKiBtaW4uICMgb2YgZGlnaXRzIGZvciBpbnRlZ2VyczsgbWF4CisJCQkJICAgbnVtYmVyIG9mIGNoYXJzIGZvciBmcm9tIHN0cmluZyAqLworCWludCBxdWFsaWZpZXI7CQkvKiAnaCcsICdsJywgb3IgJ0wnIGZvciBpbnRlZ2VyIGZpZWxkcyAqLworCisJZm9yIChzdHI9YnVmIDsgKmZtdCA7ICsrZm10KSB7CisJCWlmICgqZm10ICE9ICclJykgeworCQkJKnN0cisrID0gKmZtdDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogcHJvY2VzcyBmbGFncyAqLworCQlmbGFncyA9IDA7CisJCXJlcGVhdDoKKwkJCSsrZm10OwkJLyogdGhpcyBhbHNvIHNraXBzIGZpcnN0ICclJyAqLworCQkJc3dpdGNoICgqZm10KSB7CisJCQkJY2FzZSAnLSc6IGZsYWdzIHw9IExFRlQ7IGdvdG8gcmVwZWF0OworCQkJCWNhc2UgJysnOiBmbGFncyB8PSBQTFVTOyBnb3RvIHJlcGVhdDsKKwkJCQljYXNlICcgJzogZmxhZ3MgfD0gU1BBQ0U7IGdvdG8gcmVwZWF0OworCQkJCWNhc2UgJyMnOiBmbGFncyB8PSBTUEVDSUFMOyBnb3RvIHJlcGVhdDsKKwkJCQljYXNlICcwJzogZmxhZ3MgfD0gWkVST1BBRDsgZ290byByZXBlYXQ7CisJCQkJfQorCisJCS8qIGdldCBmaWVsZCB3aWR0aCAqLworCQlmaWVsZF93aWR0aCA9IC0xOworCQlpZiAoaXNfZGlnaXQoKmZtdCkpCisJCQlmaWVsZF93aWR0aCA9IHNraXBfYXRvaSgmZm10KTsKKwkJZWxzZSBpZiAoKmZtdCA9PSAnKicpIHsKKwkJCSsrZm10OworCQkJLyogaXQncyB0aGUgbmV4dCBhcmd1bWVudCAqLworCQkJZmllbGRfd2lkdGggPSB2YV9hcmcoYXJncywgaW50KTsKKwkJCWlmIChmaWVsZF93aWR0aCA8IDApIHsKKwkJCQlmaWVsZF93aWR0aCA9IC1maWVsZF93aWR0aDsKKwkJCQlmbGFncyB8PSBMRUZUOworCQkJfQorCQl9CisKKwkJLyogZ2V0IHRoZSBwcmVjaXNpb24gKi8KKwkJcHJlY2lzaW9uID0gLTE7CisJCWlmICgqZm10ID09ICcuJykgeworCQkJKytmbXQ7CisJCQlpZiAoaXNfZGlnaXQoKmZtdCkpCisJCQkJcHJlY2lzaW9uID0gc2tpcF9hdG9pKCZmbXQpOworCQkJZWxzZSBpZiAoKmZtdCA9PSAnKicpIHsKKwkJCQkrK2ZtdDsKKwkJCQkvKiBpdCdzIHRoZSBuZXh0IGFyZ3VtZW50ICovCisJCQkJcHJlY2lzaW9uID0gdmFfYXJnKGFyZ3MsIGludCk7CisJCQl9CisJCQlpZiAocHJlY2lzaW9uIDwgMCkKKwkJCQlwcmVjaXNpb24gPSAwOworCQl9CisKKwkJLyogZ2V0IHRoZSBjb252ZXJzaW9uIHF1YWxpZmllciAqLworCQlxdWFsaWZpZXIgPSAtMTsKKwkJaWYgKCpmbXQgPT0gJ2gnIHx8ICpmbXQgPT0gJ2wnIHx8ICpmbXQgPT0gJ0wnKSB7CisJCQlxdWFsaWZpZXIgPSAqZm10OworCQkJKytmbXQ7CisJCX0KKworCQkvKiBkZWZhdWx0IGJhc2UgKi8KKwkJYmFzZSA9IDEwOworCisJCXN3aXRjaCAoKmZtdCkgeworCQljYXNlICdjJzoKKwkJCWlmICghKGZsYWdzICYgTEVGVCkpCisJCQkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQorCQkJCQkqc3RyKysgPSAnICc7CisJCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikgdmFfYXJnKGFyZ3MsIGludCk7CisJCQl3aGlsZSAoLS1maWVsZF93aWR0aCA+IDApCisJCQkJKnN0cisrID0gJyAnOworCQkJY29udGludWU7CisKKwkJY2FzZSAncyc6CisJCQlzID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7CisJCQlpZiAoIXMpCisJCQkJcyA9ICI8TlVMTD4iOworCisJCQlsZW4gPSBzdHJubGVuKHMsIHByZWNpc2lvbik7CisKKwkJCWlmICghKGZsYWdzICYgTEVGVCkpCisJCQkJd2hpbGUgKGxlbiA8IGZpZWxkX3dpZHRoLS0pCisJCQkJCSpzdHIrKyA9ICcgJzsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwkJCQkqc3RyKysgPSAqcysrOworCQkJd2hpbGUgKGxlbiA8IGZpZWxkX3dpZHRoLS0pCisJCQkJKnN0cisrID0gJyAnOworCQkJY29udGludWU7CisKKwkJY2FzZSAncCc6CisJCQlpZiAoZmllbGRfd2lkdGggPT0gLTEpIHsKKwkJCQlmaWVsZF93aWR0aCA9IDIqc2l6ZW9mKHZvaWQgKik7CisJCQkJZmxhZ3MgfD0gWkVST1BBRDsKKwkJCX0KKwkJCXN0ciA9IG51bWJlcihzdHIsCisJCQkJKHVuc2lnbmVkIGxvbmcpIHZhX2FyZyhhcmdzLCB2b2lkICopLCAxNiwKKwkJCQlmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7CisJCQljb250aW51ZTsKKworCisJCWNhc2UgJ24nOgorCQkJaWYgKHF1YWxpZmllciA9PSAnbCcpIHsKKwkJCQlsb25nICogaXAgPSB2YV9hcmcoYXJncywgbG9uZyAqKTsKKwkJCQkqaXAgPSAoc3RyIC0gYnVmKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50ICogaXAgPSB2YV9hcmcoYXJncywgaW50ICopOworCQkJCSppcCA9IChzdHIgLSBidWYpOworCQkJfQorCQkJY29udGludWU7CisKKwkJY2FzZSAnJSc6CisJCQkqc3RyKysgPSAnJSc7CisJCQljb250aW51ZTsKKworCQkvKiBpbnRlZ2VyIG51bWJlciBmb3JtYXRzIC0gc2V0IHVwIHRoZSBmbGFncyBhbmQgImJyZWFrIiAqLworCQljYXNlICdvJzoKKwkJCWJhc2UgPSA4OworCQkJYnJlYWs7CisKKwkJY2FzZSAnWCc6CisJCQlmbGFncyB8PSBMQVJHRTsKKwkJY2FzZSAneCc6CisJCQliYXNlID0gMTY7CisJCQlicmVhazsKKworCQljYXNlICdkJzoKKwkJY2FzZSAnaSc6CisJCQlmbGFncyB8PSBTSUdOOworCQljYXNlICd1JzoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkqc3RyKysgPSAnJSc7CisJCQlpZiAoKmZtdCkKKwkJCQkqc3RyKysgPSAqZm10OworCQkJZWxzZQorCQkJCS0tZm10OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHF1YWxpZmllciA9PSAnbCcpCisJCQludW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgbG9uZyk7CisJCWVsc2UgaWYgKHF1YWxpZmllciA9PSAnaCcpIHsKKwkJCW51bSA9ICh1bnNpZ25lZCBzaG9ydCkgdmFfYXJnKGFyZ3MsIGludCk7CisJCQlpZiAoZmxhZ3MgJiBTSUdOKQorCQkJCW51bSA9IChzaG9ydCkgbnVtOworCQl9IGVsc2UgaWYgKGZsYWdzICYgU0lHTikKKwkJCW51bSA9IHZhX2FyZyhhcmdzLCBpbnQpOworCQllbHNlCisJCQludW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgaW50KTsKKwkJc3RyID0gbnVtYmVyKHN0ciwgbnVtLCBiYXNlLCBmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7CisJfQorCSpzdHIgPSAnXDAnOworCXJldHVybiBzdHItYnVmOworfQorCit2b2lkIHNlcmlhbF9wcmludGYgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwl1aW50IGk7CisJY2hhciBwcmludGJ1ZmZlcltDRkdfUEJTSVpFXTsKKworCXZhX3N0YXJ0IChhcmdzLCBmbXQpOworCisJLyogRm9yIHRoaXMgdG8gd29yaywgcHJpbnRidWZmZXIgbXVzdCBiZSBsYXJnZXIgdGhhbgorCSAqIGFueXRoaW5nIHdlIGV2ZXIgd2FudCB0byBwcmludC4KKwkgKi8KKwlpID0gdnNwcmludGYgKHByaW50YnVmZmVyLCBmbXQsIGFyZ3MpOworCXZhX2VuZCAoYXJncyk7CisKKwkvKiBQcmludCB0aGUgc3RyaW5nICovCisJc2VyaWFsX3B1dHMgKHByaW50YnVmZmVyKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL3N0cmluZy5jIGIveC1sb2FkZXIvbGliL3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDg2NzUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvc3RyaW5nLmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICBsaW51eC9saWIvc3RyaW5nLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiBzdHVwaWQgbGlicmFyeSByb3V0aW5lcy4uIFRoZSBvcHRpbWl6ZWQgdmVyc2lvbnMgc2hvdWxkIGdlbmVyYWxseSBiZSBmb3VuZAorICogYXMgaW5saW5lIGNvZGUgaW4gPGFzbS14eC9zdHJpbmcuaD4KKyAqCisgKiBUaGVzZSBhcmUgYnVnZ3kgYXMgd2VsbC4uCisgKgorICogKiBGcmkgSnVuIDI1IDE5OTksIEluZ28gT2VzZXIgPGlvZUBpbmZvcm1hdGlrLnR1LWNoZW1uaXR6LmRlPgorICogLSAgQWRkZWQgc3Ryc2VwKCkgd2hpY2ggd2lsbCByZXBsYWNlIHN0cnRvaygpIHNvb24gKGJlY2F1c2Ugc3Ryc2VwKCkgaXMKKyAqICAgIHJlZW50cmFudCBhbmQgc2hvdWxkIGJlIGZhc3RlcikuIFVzZSBvbmx5IHN0cnNlcCgpIGluIG5ldyBjb2RlLCBwbGVhc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTU1PVkUKKy8qKgorICogbWVtbW92ZSAtIENvcHkgb25lIGFyZWEgb2YgbWVtb3J5IHRvIGFub3RoZXIKKyAqIEBkZXN0OiBXaGVyZSB0byBjb3B5IHRvCisgKiBAc3JjOiBXaGVyZSB0byBjb3B5IGZyb20KKyAqIEBjb3VudDogVGhlIHNpemUgb2YgdGhlIGFyZWEuCisgKgorICogVW5saWtlIG1lbWNweSgpLCBtZW1tb3ZlKCkgY29wZXMgd2l0aCBvdmVybGFwcGluZyBhcmVhcy4KKyAqLwordm9pZCAqIG1lbW1vdmUodm9pZCAqIGRlc3QsY29uc3Qgdm9pZCAqc3JjLHNpemVfdCBjb3VudCkKK3sKKwljaGFyICp0bXAsICpzOworCisJaWYgKGRlc3QgPD0gc3JjKSB7CisJCXRtcCA9IChjaGFyICopIGRlc3Q7CisJCXMgPSAoY2hhciAqKSBzcmM7CisJCXdoaWxlIChjb3VudC0tKQorCQkJKnRtcCsrID0gKnMrKzsKKwkJfQorCWVsc2UgeworCQl0bXAgPSAoY2hhciAqKSBkZXN0ICsgY291bnQ7CisJCXMgPSAoY2hhciAqKSBzcmMgKyBjb3VudDsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqLS10bXAgPSAqLS1zOworCQl9CisKKwlyZXR1cm4gZGVzdDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbWtjb25maWcgYi94LWxvYWRlci9ta2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYTVhNjhjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbWtjb25maWcKQEAgLTAsMCArMSwxMzggQEAKKyMhL2Jpbi9zaCAtZQorCisjIFNjcmlwdCB0byBjcmVhdGUgaGVhZGVyIGZpbGVzIGFuZCBsaW5rcyB0byBjb25maWd1cmUKKyMgWC1Mb2FkZXIgZm9yIGEgc3BlY2lmaWMgYm9hcmQuCisjCisjIFBhcmFtZXRlcnM6ICBUYXJnZXQgIEFyY2hpdGVjdHVyZSAgQ1BVICBCb2FyZCBbVkVORE9SXSBbU09DXQorIworIyAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworIyAoQykgMjAwMi0yMDA2IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisjCisKK0FQUEVORD1ubwkjIERlZmF1bHQ6IENyZWF0ZSBuZXcgY29uZmlnIGZpbGUKK0JPQVJEX05BTUU9IiIJIyBOYW1lIHRvIHByaW50IGluIG1ha2Ugb3V0cHV0CitUQVJHRVRTPSIiCisKK2FyY2g9IiIKK2NwdT0iIgorYm9hcmQ9IiIKK3ZlbmRvcj0iIgorc29jPSIiCisKK2lmIFsgXCggJCMgLWVxIDIgXCkgLWEgXCggIiQxIiA9ICItQSIgXCkgXSA7IHRoZW4KKwkjIEF1dG9tYXRpYyBtb2RlCisJbGluZT1gZWdyZXAgLWkgIl5bWzpzcGFjZTpdXSokezJ9W1s6c3BhY2U6XV0iIGJvYXJkcy5jZmdgIHx8IHsKKwkJZWNobyAibWFrZTogKioqIE5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQgXGAkMl9jb25maWcnLiAgU3RvcC4iID4mMgorCQlleGl0IDEKKwl9CisKKwlzZXQgJHtsaW5lfQorCSMgYWRkIGRlZmF1bHQgYm9hcmQgbmFtZSBpZiBuZWVkZWQKKwlbICQjID0gMyBdICYmIHNldCAke2xpbmV9ICR7MX0KK2ZpCisKK3doaWxlIFsgJCMgLWd0IDAgXSA7IGRvCisJY2FzZSAiJDEiIGluCisJLS0pIHNoaWZ0IDsgYnJlYWsgOzsKKwktYSkgc2hpZnQgOyBBUFBFTkQ9eWVzIDs7CisJLW4pIHNoaWZ0IDsgQk9BUkRfTkFNRT0iJHsxJV9jb25maWd9IiA7IHNoaWZ0IDs7CisJLXQpIHNoaWZ0IDsgVEFSR0VUUz0iYGVjaG8gJDEgfCBzZWQgJ3M6XzogOmcnYCAke1RBUkdFVFN9IiA7IHNoaWZ0IDs7CisJKikgIGJyZWFrIDs7CisJZXNhYworZG9uZQorCitbICQjIC1sdCA0IF0gJiYgZXhpdCAxCitbICQjIC1ndCA2IF0gJiYgZXhpdCAxCisKK0NPTkZJR19OQU1FPSIkezElX2NvbmZpZ30iCisKK1sgIiR7Qk9BUkRfTkFNRX0iIF0gfHwgQk9BUkRfTkFNRT0iJHtDT05GSUdfTkFNRX0iCisKK2FyY2g9IiQyIgorY3B1PSIkMyIKK2lmIFsgIiQ0IiA9ICItIiBdIDsgdGhlbgorCWJvYXJkPSR7Qk9BUkRfTkFNRX0KK2Vsc2UKKwlib2FyZD0iJDQiCitmaQorWyAkIyAtZ3QgNCBdICYmIFsgIiQ1IiAhPSAiLSIgXSAmJiB2ZW5kb3I9IiQ1IgorWyAkIyAtZ3QgNSBdICYmIFsgIiQ2IiAhPSAiLSIgXSAmJiBzb2M9IiQ2IgorCitpZiBbICIke0FSQ0h9IiAtYSAiJHtBUkNIfSIgIT0gIiR7YXJjaH0iIF07IHRoZW4KKwllY2hvICJGYWlsZWQ6IFwkQVJDSD0ke0FSQ0h9LCBzaG91bGQgYmUgJyR7YXJjaH0nIGZvciAke0JPQVJEX05BTUV9IiAxPiYyCisJZXhpdCAxCitmaQorCitlY2hvICJDb25maWd1cmluZyBmb3IgJHtCT0FSRF9OQU1FfSBib2FyZC4uLiIKKworIworIyBDcmVhdGUgbGluayB0byBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaGVhZGVycworIworaWYgWyAiJFNSQ1RSRUUiICE9ICIkT0JKVFJFRSIgXSA7IHRoZW4KKwlta2RpciAtcCAke09CSlRSRUV9L2luY2x1ZGUKKwlta2RpciAtcCAke09CSlRSRUV9L2luY2x1ZGUyCisJY2QgJHtPQkpUUkVFfS9pbmNsdWRlMgorCXJtIC1mIGFzbQorCWxuIC1zICR7U1JDVFJFRX0vaW5jbHVkZS9hc20gYXNtCisJTE5QUkVGSVg9JHtTUkNUUkVFfS9pbmNsdWRlL2FzbS8KKwljZCAuLi9pbmNsdWRlCisJcm0gLWYgYXNtCisJbG4gLXMgJHtTUkNUUkVFfS9pbmNsdWRlL2FzbSBhc20KK2Vsc2UKKwljZCAuL2luY2x1ZGUKK2ZpCisKK3JtIC1mIGFzbS9hcmNoCisKK2lmIFsgLXogIiR7c29jfSIgXSA7IHRoZW4KKwlsbiAtcyAke0xOUFJFRklYfWFyY2gtJHtjcHV9IGFzbS9hcmNoCitlbHNlCisJbG4gLXMgJHtMTlBSRUZJWH1hcmNoLSR7c29jfSBhc20vYXJjaAorZmkKKworaWYgWyAiJHthcmNofSIgPSAiYXJtIiBdIDsgdGhlbgorCXJtIC1mIGFzbS9wcm9jCisJbG4gLXMgJHtMTlBSRUZJWH1wcm9jLWFybXYgYXNtL3Byb2MKK2ZpCisKKyMKKyMgQ3JlYXRlIGluY2x1ZGUgZmlsZSBmb3IgTWFrZQorIworZWNobyAiQVJDSCAgID0gJHthcmNofSIgID4gIGNvbmZpZy5taworZWNobyAiQ1BVICAgID0gJHtjcHV9IiAgID4+IGNvbmZpZy5taworZWNobyAiQk9BUkQgID0gJHtib2FyZH0iID4+IGNvbmZpZy5taworCitbICIke3ZlbmRvcn0iIF0gJiYgZWNobyAiVkVORE9SID0gJHt2ZW5kb3J9IiA+PiBjb25maWcubWsKKworWyAiJHtzb2N9IiAgICBdICYmIGVjaG8gIlNPQyAgICA9ICR7c29jfSIgICAgPj4gY29uZmlnLm1rCisKKyMgQXNzaWduIGJvYXJkIGRpcmVjdG9yeSB0byBCT0FSRElSIHZhcmlhYmxlCitpZiBbIC16ICIke3ZlbmRvcn0iIF0gOyB0aGVuCisgICAgQk9BUkRESVI9JHtib2FyZH0KK2Vsc2UKKyAgICBCT0FSRERJUj0ke3ZlbmRvcn0vJHtib2FyZH0KK2ZpCisKKyMKKyMgQ3JlYXRlIGJvYXJkIHNwZWNpZmljIGhlYWRlciBmaWxlCisjCitpZiBbICIkQVBQRU5EIiA9ICJ5ZXMiIF0JIyBBcHBlbmQgdG8gZXhpc3RpbmcgY29uZmlnIGZpbGUKK3RoZW4KKwllY2hvID4+IGNvbmZpZy5oCitlbHNlCisJPiBjb25maWcuaAkJIyBDcmVhdGUgbmV3IGNvbmZpZyBmaWxlCitmaQorZWNobyAiLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgLSBkbyBub3QgZWRpdCAqLyIgPj5jb25maWcuaAorCitmb3IgaSBpbiAke1RBUkdFVFN9IDsgZG8KKwllY2hvICIjZGVmaW5lIENPTkZJR19NS18ke2l9IDEiID4+Y29uZmlnLmggOworZG9uZQorCitjYXQgPDwgRU9GID4+IGNvbmZpZy5oCisjZGVmaW5lIENPTkZJR19CT0FSRERJUiBib2FyZC8kQk9BUkRESVIKKyNpbmNsdWRlIDxjb25maWdfZGVmYXVsdHMuaD4KKyNpbmNsdWRlIDxjb25maWdzLyR7Q09ORklHX05BTUV9Lmg+CisjaW5jbHVkZSA8YXNtL2NvbmZpZy5oPgorRU9GCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvcnVsZXMubWsgYi94LWxvYWRlci9ydWxlcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTY3MGFjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvcnVsZXMubWsKQEAgLTAsMCArMSw0NCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitfZGVwZW5kOgkkKG9iaikuZGVwZW5kCisKKyQob2JqKS5kZXBlbmQ6CSQoc3JjKU1ha2VmaWxlICQoVE9QRElSKS9jb25maWcubWsgJChTUkNTKSAkKEhPU1RTUkNTKQorCQlAcm0gLWYgJEAKKwkJQGZvciBmIGluICQoU1JDUyk7IGRvIFwKKwkJCWc9YGJhc2VuYW1lICQkZiB8IHNlZCAtZSAncy9cKC4qXClcLlx3L1wxLm8vJ2A7IFwKKwkJCSQoQ0MpIC1NICQoQ1BQRkxBR1MpIC1NUSAkKG9iaikkJGcgJCRmID4+ICRAIDsgXAorCQlkb25lCisJCUBmb3IgZiBpbiAkKEhPU1RTUkNTKTsgZG8gXAorCQkJZz1gYmFzZW5hbWUgJCRmIHwgc2VkIC1lICdzL1woLipcKVwuXHcvXDEuby8nYDsgXAorCQkJJChIT1NUQ0MpIC1NICQoSE9TVENQUEZMQUdTKSAtTVEgJChvYmopJCRnICQkZiA+PiAkQCA7IFwKKwkJZG9uZQorCiskKEhPU1RPQkpTKTogJChvYmopJS5vOiAlLmMKKwkkKEhPU1RDQykgJChIT1NUQ0ZMQUdTKSAkKEhPU1RDRkxBR1NfJChARikpICQoSE9TVENGTEFHU18kKEJDVVJESVIpKSAtbyAkQCAkPCAtYworJChOT1BFRE9CSlMpOiAkKG9iaiklLm86ICUuYworCSQoSE9TVENDKSAkKEhPU1RDRkxBR1NfTk9QRUQpICQoSE9TVENGTEFHU18kKEBGKSkgJChIT1NUQ0ZMQUdTXyQoQkNVUkRJUikpIC1vICRAICQ8IC1jCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL3NjcmlwdHMvbWtvbmVib290LnNoIGIveC1sb2FkZXIvc2NyaXB0cy9ta29uZWJvb3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4NjJhNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL3NjcmlwdHMvbWtvbmVib290LnNoCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAorCitJTUFHRTE9eC1sb2FkLmJpbi5pZnQKK0lNQUdFMj14LWxvYWQtc2lnbmVkLmlmdAorVE1QPW9uZWxvYWRlcgorUEFHRVNJWkU9MjA0OAorCitzaXplPWBscyAtbGEgJElNQUdFMSB8IGF3ayAtRicgJyAneyBwcmludGYgJDV9J2AKK2xldCByZW1haW49JFBBR0VTSVpFLSRzaXplCitkZCBpZj0vZGV2L3plcm8gb2Y9JElNQUdFMiBicz0xIGNvdW50PTUxMgorI2RkIGlmPS9kZXYvemVybyBvZj16ZXJvZmlsZSBicz0kcmVtYWluIGNvdW50PTEgPiAvZGV2L251bGwgMj4gL2Rldi9udWxsCitjYXQgJElNQUdFMT4+JElNQUdFMgorCitybSAtZiAkSU1BR0UxCisKK2VjaG8gIkNyZWF0ZSAkSU1BR0UyIGNvbXBsZXRlZC4uLiIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL3Rvb2xzL01ha2VmaWxlIGIveC1sb2FkZXIvdG9vbHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0NWIyYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL3Rvb2xzL01ha2VmaWxlCkBAIC0wLDAgKzEsODkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworVE9PTFNVQkRJUlMgPQorCisjCisjIHRvb2xjaGFpbnMgdGFyZ2V0aW5nIHdpbjMyIGdlbmVyYXRlIC5leGUgZmlsZXMKKyMKK2lmbmVxICgsJChmaW5kc3RyaW5nIFdJTjMyICwkKHNoZWxsICQoSE9TVENDKSAtRSAtZE0gLXhjIC9kZXYvbnVsbCkpKQorU0ZYID0gLmV4ZQorZWxzZQorU0ZYID0KK2VuZGlmCisKKyMKKyMgSW5jbHVkZSB0aGlzIGFmdGVyIEhPU1RPUyBIT1NUQVJDSCBjaGVjaworIyBzbyB0aGF0IHdlIGNhbiBhY3QgaW50ZWxsaWdlbnRseS4KKyMKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCisjIEdlbmVyYXRlZCBleGVjdXRhYmxlIGZpbGVzCitCSU5fRklMRVMteSArPSBzaWduR1AkKFNGWCkKK09CSl9GSUxFUy15ICs9IHNpZ25HUC5vCisKKyMgbm93ICQob2JqKSBpcyBkZWZpbmVkCitIT1NUU1JDUyArPSAkKGFkZHByZWZpeCAkKFNSQ1RSRUUpL3Rvb2xzLywkKE9CSl9GSUxFUy15Oi5vPS5jKSkKK0JJTlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoc29ydCAkKEJJTl9GSUxFUy15KSkpCitIT1NUT0JKUyA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChPQkpfRklMRVMteSkpCitOT1BFRE9CSlMgOj0gJChhZGRwcmVmaXggJChvYmopLCQoTk9QRURfT0JKX0ZJTEVTLXkpKQorCisjCisjIFVzZSBuYXRpdmUgdG9vbHMgYW5kIG9wdGlvbnMKKyMgRGVmaW5lIF9fS0VSTkVMX1NUUklDVF9OQU1FUyB0byBwcmV2ZW50IHR5cGVkZWYgb3ZlcmxhcHMKKyMKK0hPU1RDUFBGTEFHUyA9CS1pZGlyYWZ0ZXIgJChTUkNUUkVFKS9pbmNsdWRlIFwKKwkJLWlkaXJhZnRlciAkKE9CSlRSRUUpL2luY2x1ZGUyIFwKKwkJLWlkaXJhZnRlciAkKE9CSlRSRUUpL2luY2x1ZGUgXAorCSAgICAgICAgLUkgJChTUkNUUkVFKS9saWIvbGliZmR0IFwKKwkJLUkgJChTUkNUUkVFKS90b29scyBcCisJCS1EVEVYVF9CQVNFPSQoVEVYVF9CQVNFKSAtRFVTRV9IT1NUQ0MgXAorCQktRF9fS0VSTkVMX1NUUklDVF9OQU1FUworCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKEJJTlMpICQoTE9HTy15KSBzdWJkaXJzCisKKyQob2JqKXNpZ25HUCQoU0ZYKToJJChvYmopc2lnbkdQLm8KKwkkKEhPU1RDQykgJChIT1NUQ0ZMQUdTKSAkKEhPU1RMREZMQUdTKSAtbyAkQCAkXgorCSQoSE9TVFNUUklQKSAkQAorCitzdWJkaXJzOgoraWZlcSAoJChUT09MU1VCRElSUyksKQorCUA6CitlbHNlCisJQGZvciBkaXIgaW4gJChUT09MU1VCRElSUykgOyBkbyBcCisJICAgICQoTUFLRSkgXAorCQlIT1NUT1M9JChIT1NUT1MpIFwKKwkJSE9TVEFSQ0g9JChIT1NUQVJDSCkgXAorCQktQyAkJGRpciB8fCBleGl0IDEgOyBcCisJZG9uZQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL3Rvb2xzL3NldGxvY2FsdmVyc2lvbiBiL3gtbG9hZGVyL3Rvb2xzL3NldGxvY2FsdmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMTFmNTRmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvdG9vbHMvc2V0bG9jYWx2ZXJzaW9uCkBAIC0wLDAgKzEsNDAgQEAKKyMhL2Jpbi9zaAorIyBQcmludCBhZGRpdGlvbmFsIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIG5vbi1yZWxlYXNlIHRyZWVzLgorCit1c2FnZSgpIHsKKwllY2hvICJVc2FnZTogJDAgW3NyY3RyZWVdIiA+JjIKKwlleGl0IDEKK30KKworY2QgIiR7MTotLn0iIHx8IHVzYWdlCisKKyMgQ2hlY2sgZm9yIGdpdCBhbmQgYSBnaXQgcmVwby4KK2lmIGhlYWQ9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCAyPi9kZXYvbnVsbGA7IHRoZW4KKwkjIERvIHdlIGhhdmUgYW4gdW50YWdnZWQgdmVyc2lvbj8KKwlpZiBnaXQgbmFtZS1yZXYgLS10YWdzIEhFQUQgfCBcCisJICAgZ3JlcCAtRSAnXkhFQURbWzpzcGFjZTpdXSsoLip+WzAtOV0qfHVuZGVmaW5lZCkkJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICAgICAgKGdpdCBkZXNjcmliZSB8fCBnaXQgZGVzY3JpYmUgLS10YWdzIHx8IGdpdCBkZXNjcmliZSAtLWFsbCAtLWxvbmcpIFwKKwkJCQkyPi9kZXYvbnVsbCB8IGF3ayAtRi0gJ3twcmludGYoIi0lMDVkLSVzIiwgJChORi0xKSwkKE5GKSl9JworCWZpCisKKwkjIEFyZSB0aGVyZSB1bmNvbW1pdHRlZCBjaGFuZ2VzPworCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoIC0tdW5tZXJnZWQgPiAvZGV2L251bGwKKwlpZiBnaXQgZGlmZi1pbmRleCAtLW5hbWUtb25seSBIRUFEIHwgZ3JlcCAtdiAiXnNjcmlwdHMvcGFja2FnZSIgXAorCSAgICB8IHJlYWQgZHVtbXk7IHRoZW4KKwkJcHJpbnRmICclcycgLWRpcnR5CisJZmkKKworCSMgSXMgdGhpcyBnaXQgb24gc3ZuPworCWlmIGdpdCBjb25maWcgLS1nZXQgc3ZuLXJlbW90ZS5zdm4udXJsID4vZGV2L251bGw7IHRoZW4KKwkJcHJpbnRmIC0tICctc3ZuJXMnICJgZ2l0IHN2biBmaW5kLXJldiAkaGVhZGAiCisJZmkKK2ZpCisKKyMgQ2hlY2sgZm9yIHN2biBhbmQgYSBzdm4gcmVwby4KK2lmIHJldj1gc3ZuIGluZm8gMj4vZGV2L251bGxgIDsgdGhlbgorCXJldj1gZWNobyAiJHtyZXZ9IiB8IGdyZXAgJ15SZXZpc2lvbicgfCBhd2sgJ3twcmludCAkTkZ9J2AKKwlwcmludGYgLS0gJy1zdm4lcycgJHJldgorZmkKKworIyBDaGVjayBmb3IgYW55IGxvY2FsdmVyc2lvbi0qIGZpbGVzCitwcmludGYgJyVzJyAiYGNhdCBsb2NhbHZlcnNpb24tKiAyPi9kZXYvbnVsbGAiCmRpZmYgLS1naXQgYS94LWxvYWRlci90b29scy9zaWduR1AuYyBiL3gtbG9hZGVyL3Rvb2xzL3NpZ25HUC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOGVkMDcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci90b29scy9zaWduR1AuYwpAQCAtMCwwICsxLDczIEBACisvLworLy8gc2lnbkdQLmMKKy8vIFJlYWQgdGhlIHgtbG9hZC5iaW4gZmlsZSBhbmQgd3JpdGUgb3V0IHRoZSB4LWxvYWQuYmluLmlmdCBmaWxlLgorLy8gVGhlIHNpZ25lZCBpbWFnZSBpcyB0aGUgb3JpZ2luYWwgcHJlLXBlbmRlZCB3aXRoIHRoZSBzaXplIG9mIHRoZSBpbWFnZQorLy8gYW5kIHRoZSBsb2FkIGFkZHJlc3MuICBJZiBub3QgZW50ZXJlZCBvbiBjb21tYW5kIGxpbmUsIGZpbGUgbmFtZSBpcworLy8gYXNzdW1lZCB0byBiZSB4LWxvYWQuYmluIGluIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBsb2FkIGFkZHJlc3MgaXMKKy8vIDB4NDAyMDA4MDAuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKworCittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50CWk7CisJY2hhcglpZm5hbWVbRklMRU5BTUVfTUFYXSwgb2ZuYW1lW0ZJTEVOQU1FX01BWF0sIGNoOworCUZJTEUJKmlmaWxlLCAqb2ZpbGU7CisJdW5zaWduZWQgbG9uZwlsb2FkYWRkciwgbGVuOworCXN0cnVjdCBzdGF0CXNpbmZvOworCisKKwkvLyBEZWZhdWx0IHRvIHgtbG9hZC5iaW4gYW5kIDB4NDAyMDA4MDAuCisJc3RyY3B5KGlmbmFtZSwgIngtbG9hZC5iaW4iKTsKKwlsb2FkYWRkciA9IDB4NDAyMDA4MDA7CisKKwlpZiAoKGFyZ2MgPT0gMikgfHwgKGFyZ2MgPT0gMykpCisJCXN0cmNweShpZm5hbWUsIGFyZ3ZbMV0pOworCisJaWYgKGFyZ2MgPT0gMykKKwkJbG9hZGFkZHIgPSBzdHJ0b2woYXJndlsyXSwgTlVMTCwgMTYpOworCisJLy8gRm9ybSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KKwlzdHJjcHkob2ZuYW1lLCBpZm5hbWUpOworCXN0cmNhdChvZm5hbWUsICIuaWZ0Iik7CisKKwkvLyBPcGVuIHRoZSBpbnB1dCBmaWxlLgorCWlmaWxlID0gZm9wZW4oaWZuYW1lLCAicmIiKTsKKwlpZiAoaWZpbGUgPT0gTlVMTCkgeworCQlwcmludGYoIkNhbm5vdCBvcGVuICVzXG4iLCBpZm5hbWUpOworCQlleGl0KDApOworCX0KKworCS8vIEdldCBmaWxlIGxlbmd0aC4KKwlzdGF0KGlmbmFtZSwgJnNpbmZvKTsKKwlsZW4gPSBzaW5mby5zdF9zaXplOworCisJLy8gT3BlbiB0aGUgb3V0cHV0IGZpbGUgYW5kIHdyaXRlIGl0LgorCW9maWxlID0gZm9wZW4ob2ZuYW1lLCAid2IiKTsKKwlpZiAob2ZpbGUgPT0gTlVMTCkgeworCQlwcmludGYoIkNhbm5vdCBvcGVuICVzXG4iLCBvZm5hbWUpOworCQlmY2xvc2UoaWZpbGUpOworCQlleGl0KDApOworCX0KKworCS8vIFBhZCAxIHNlY3RvciBvZiB6ZXJvZXMuCisJLy9jaCA9IDB4MDA7CisJLy9mb3IgKGk9MDsgaTwweDIwMDsgaSsrKQorCS8vCWZ3cml0ZSgmY2gsIDEsIDEsIG9maWxlKTsKKworCWZ3cml0ZSgmbGVuLCAxLCA0LCBvZmlsZSk7CisJZndyaXRlKCZsb2FkYWRkciwgMSwgNCwgb2ZpbGUpOworCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJCWZyZWFkKCZjaCwgMSwgMSwgaWZpbGUpOworCQlmd3JpdGUoJmNoLCAxLCAxLCBvZmlsZSk7CisJfQorCisJZmNsb3NlKGlmaWxlKTsKKwlmY2xvc2Uob2ZpbGUpOworfQo=