ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvZ292ZXJub3JzLnR4dCBiL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvZ292ZXJub3JzLnR4dAppbmRleCA1YjBjZmE2Li5jZTczZjNlYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9nb3Zlcm5vcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvZ292ZXJub3JzLnR4dApAQCAtMTE3LDEwICsxMTcsMjggQEAKIHNhbXBsaW5nX3JhdGU6IG1lYXN1cmVkIGluIHVTICgxMF4tNiBzZWNvbmRzKSwgdGhpcyBpcyBob3cgb2Z0ZW4geW91CiB3YW50IHRoZSBrZXJuZWwgdG8gbG9vayBhdCB0aGUgQ1BVIHVzYWdlIGFuZCB0byBtYWtlIGRlY2lzaW9ucyBvbgogd2hhdCB0byBkbyBhYm91dCB0aGUgZnJlcXVlbmN5LiAgVHlwaWNhbGx5IHRoaXMgaXMgc2V0IHRvIHZhbHVlcyBvZgotYXJvdW5kICcxMDAwMCcgb3IgbW9yZS4KK2Fyb3VuZCAnMTAwMDAnIG9yIG1vcmUuIEl0J3MgZGVmYXVsdCB2YWx1ZSBpcyAoY21wLiB3aXRoIHVzZXJzLWd1aWRlLnR4dCk6Cit0cmFuc2l0aW9uX2xhdGVuY3kgKiAxMDAwCitUaGUgbG93ZXN0IHZhbHVlIHlvdSBjYW4gc2V0IGlzOgordHJhbnNpdGlvbl9sYXRlbmN5ICogMTAwIG9yIGl0IG1heSBnZXQgcmVzdHJpY3RlZCB0byBhIHZhbHVlIHdoZXJlIGl0CittYWtlcyBub3Qgc2Vuc2UgZm9yIHRoZSBrZXJuZWwgYW55bW9yZSB0byBwb2xsIHRoYXQgb2Z0ZW4gd2hpY2ggZGVwZW5kcworb24geW91ciBIWiBjb25maWcgdmFyaWFibGUgKEhaPTEwMDA6IG1heD0yMDAwMHVzLCBIWj0yNTA6IG1heD01MDAwKS4KK0JlIGF3YXJlIHRoYXQgdHJhbnNpdGlvbiBsYXRlbmN5IGlzIGluIG5zIGFuZCBzYW1wbGluZ19yYXRlIGlzIGluIHVzLCBzbyB5b3UKK2dldCB0aGUgc2FtZSBzeXNmcyB2YWx1ZSBieSBkZWZhdWx0LgorU2FtcGxpbmcgcmF0ZSBzaG91bGQgYWx3YXlzIGdldCBhZGp1c3RlZCBjb25zaWRlcmluZyB0aGUgdHJhbnNpdGlvbiBsYXRlbmN5CitUbyBzZXQgdGhlIHNhbXBsaW5nIHJhdGUgNzUwIHRpbWVzIGFzIGhpZ2ggYXMgdGhlIHRyYW5zaXRpb24gbGF0ZW5jeQoraW4gdGhlIGJhc2ggKGFzIHNhaWQsIDEwMDAgaXMgZGVmYXVsdCksIGRvOgorZWNobyBgJCgoJChjYXQgY3B1aW5mb190cmFuc2l0aW9uX2xhdGVuY3kpICogNzUwIC8gMTAwMCkpIFwKKyAgICA+b25kZW1hbmQvc2FtcGxpbmdfcmF0ZQogCi1zaG93X3NhbXBsaW5nX3JhdGVfKG1pbnxtYXgpOiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBzYW1wbGluZyByYXRlcwotYXZhaWxhYmxlIHRoYXQgeW91IG1heSBzZXQgJ3NhbXBsaW5nX3JhdGUnIHRvLgorc2hvd19zYW1wbGluZ19yYXRlXyhtaW58bWF4KTogVEhJUyBJTlRFUkZBQ0UgSVMgREVQUkVDQVRFRCwgRE9OJ1QgVVNFIElULgorWW91IGNhbiB1c2Ugd2lkZXIgcmFuZ2VzIG5vdyBhbmQgdGhlIGdlbmVyYWwKK2NwdWluZm9fdHJhbnNpdGlvbl9sYXRlbmN5IHZhcmlhYmxlIChjbXAuIHdpdGggdXNlci1ndWlkZS50eHQpIGNhbiBiZQordXNlZCB0byBvYnRhaW4gZXhhY3RseSB0aGUgc2FtZSBpbmZvOgorc2hvd19zYW1wbGluZ19yYXRlX21pbiA9IHRyYW5zdGl0aW9uX2xhdGVuY3kgKiA1MDAgICAgLyAxMDAwCitzaG93X3NhbXBsaW5nX3JhdGVfbWF4ID0gdHJhbnN0aXRpb25fbGF0ZW5jeSAqIDUwMDAwMCAvIDEwMDAKKyhkaXZpZGVkIGJ5IDEwMDAgaXMgdG8gaWxsdXN0cmF0ZSB0aGF0IHNhbXBsaW5nIHJhdGUgaXMgaW4gdXMgYW5kCit0cmFuc2l0aW9uIGxhdGVuY3kgaXMgZXhwb3J0ZWQgbnMpLgogCiB1cF90aHJlc2hvbGQ6IGRlZmluZXMgd2hhdCB0aGUgYXZlcmFnZSBDUFUgdXNhZ2UgYmV0d2VlbiB0aGUgc2FtcGxpbmdzCiBvZiAnc2FtcGxpbmdfcmF0ZScgbmVlZHMgdG8gYmUgZm9yIHRoZSBrZXJuZWwgdG8gbWFrZSBhIGRlY2lzaW9uIG9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL3VzZXItZ3VpZGUudHh0IGIvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS91c2VyLWd1aWRlLnR4dAppbmRleCA5MTc5MThmLi43NWY0MTE5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL3VzZXItZ3VpZGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvdXNlci1ndWlkZS50eHQKQEAgLTE1Miw2ICsxNTIsMTggQEAKIAkJCQlmcmVxdWVuY3kgdGhlIHByb2Nlc3NvciBjYW4gcnVuIGF0KGluIGtIeikgCiBjcHVpbmZvX21heF9mcmVxIDoJCXRoaXMgZmlsZSBzaG93cyB0aGUgbWF4aW11bSBvcGVyYXRpbmcKIAkJCQlmcmVxdWVuY3kgdGhlIHByb2Nlc3NvciBjYW4gcnVuIGF0KGluIGtIeikgCitjcHVpbmZvX3RyYW5zaXRpb25fbGF0ZW5jeQlUaGUgdGltZSBpdCB0YWtlcyBvbiB0aGlzIENQVSB0bworCQkJCXN3aXRjaCBiZXR3ZWVuIHR3byBmcmVxdWVuY2llcyBpbiBuYW5vCisJCQkJc2Vjb25kcy4gSWYgdW5rbm93biBvciBrbm93biB0byBiZQorCQkJCXRoYXQgaGlnaCB0aGF0IHRoZSBkcml2ZXIgZG9lcyBub3QKKwkJCQl3b3JrIHdpdGggdGhlIG9uZGVtYW5kIGdvdmVybm9yLCAtMQorCQkJCShDUFVGUkVRX0VURVJOQUwpIHdpbGwgYmUgcmV0dXJuZWQuCisJCQkJVXNpbmcgdGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZnVsCisJCQkJdG8gY2hvb3NlIGFuIGFwcHJvcHJpYXRlIHBvbGxpbmcKKwkJCQlmcmVxdWVuY3kgZm9yIGEga2VybmVsIGdvdmVybm9yIG9yCisJCQkJdXNlcnNwYWNlIGRhZW1vbi4gTWFrZSBzdXJlIHRvIG5vdAorCQkJCXN3aXRjaCB0aGUgZnJlcXVlbmN5IHRvbyBvZnRlbgorCQkJCXJlc3VsdGluZyBpbiBwZXJmb3JtYW5jZSBsb3NzLgogc2NhbGluZ19kcml2ZXIgOgkJdGhpcyBmaWxlIHNob3dzIHdoYXQgY3B1ZnJlcSBkcml2ZXIgaXMKIAkJCQl1c2VkIHRvIHNldCB0aGUgZnJlcXVlbmN5IG9uIHRoaXMgQ1BVCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RpbWVyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aW1lci5oCmluZGV4IDJiYjZhODMuLjRmNWMyNDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RpbWVyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdGltZXIuaApAQCAtMTEsOCArMTEsOCBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogZXh0ZXJuIGludCB0aW1lcl9hY2s7CisjZW5kaWYKIGV4dGVybiBpbnQgcmVjYWxpYnJhdGVfY3B1X2toeih2b2lkKTsKLSNlbmRpZiAvKiBDT05GSUdfWDg2XzMyICovCiAKIGV4dGVybiBpbnQgbm9fdGltZXJfY2hlY2s7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKaW5kZXggNjU3OTJjMi4uNTJjODM5OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKQEAgLTg3LDMwICs4NywxNSBAQAogY29uZmlnIFg4Nl9QT1dFUk5PV19LOAogCXRyaXN0YXRlICJBTUQgT3B0ZXJvbi9BdGhsb242NCBQb3dlck5vdyEiCiAJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJZGVwZW5kcyBvbiBBQ1BJICYmIEFDUElfUFJPQ0VTU09SCiAJaGVscAotCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgbW9iaWxlIEFNRCBPcHRlcm9uL0F0aGxvbjY0IHByb2Nlc3NvcnMuCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBLOC9LMTAgT3B0ZXJvbi9BdGhsb242NCBwcm9jZXNzb3JzLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwb3dlcm5vdy1rOC4KIAogCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KIAotCSAgSWYgaW4gZG91YnQsIHNheSBOLgotCi1jb25maWcgWDg2X1BPV0VSTk9XX0s4X0FDUEkKLQlib29sCi0JcHJvbXB0ICJBQ1BJIFN1cHBvcnQiIGlmIFg4Nl8zMgotCWRlcGVuZHMgb24gQUNQSSAmJiBYODZfUE9XRVJOT1dfSzggJiYgQUNQSV9QUk9DRVNTT1IKLQlkZXBlbmRzIG9uICEoWDg2X1BPV0VSTk9XX0s4ID0geSAmJiBBQ1BJX1BST0NFU1NPUiA9IG0pCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIEs4cyBQcm9jZXNzb3IgUGVyZm9ybWFuY2UgU3RhdGVzIHZpYSBBQ1BJLgotCSAgVGhpcyBkcml2ZXIgaXMgcHJvYmFibHkgcmVxdWlyZWQgZm9yIENQVUZyZXEgdG8gd29yayB3aXRoIG11bHRpLXNvY2tldCBhbmQKLQkgIFNNUCBzeXN0ZW1zLiAgSXQgaXMgbm90IHJlcXVpcmVkIG9uIGF0IGxlYXN0IHNvbWUgc2luZ2xlLXNvY2tldCB5ZXQKLQkgIG11bHRpLWNvcmUgc3lzdGVtcywgZXZlbiBpZiBTTVAgaXMgZW5hYmxlZC4KLQotCSAgSXQgaXMgc2FmZSB0byBzYXkgWSBoZXJlLgotCiBjb25maWcgWDg2X0dYX1NVU1BNT0QKIAl0cmlzdGF0ZSAiQ3lyaXggTWVkaWFHWC9OYXRTZW1pIEdlb2RlIFN1c3BlbmQgTW9kdWxhdGlvbiIKIAlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBQQ0kKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9NYWtlZmlsZSBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9NYWtlZmlsZQppbmRleCA1NjBmNzc2Li41MDkyOTZkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlCkBAIC0xLDYgKzEsMTEgQEAKKyMgTGluayBvcmRlciBtYXR0ZXJzLiBLOCBpcyBwcmVmZXJyZWQgdG8gQUNQSSBiZWNhdXNlIG9mIGZpcm13YXJlIGJ1Z3MgaW4gZWFybHkKKyMgSzggc3lzdGVtcy4gQUNQSSBpcyBwcmVmZXJyZWQgdG8gYWxsIG90aGVyIGhhcmR3YXJlLXNwZWNpZmljIGRyaXZlcnMuCisjIHNwZWVkc3RlcC0qIGlzIHByZWZlcnJlZCBvdmVyIHA0LWNsb2NrbW9kLgorCitvYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s4KQkJKz0gcG93ZXJub3ctazgubworb2JqLSQoQ09ORklHX1g4Nl9BQ1BJX0NQVUZSRVEpCQkrPSBhY3BpLWNwdWZyZXEubwogb2JqLSQoQ09ORklHX1g4Nl9QT1dFUk5PV19LNikJCSs9IHBvd2Vybm93LWs2Lm8KIG9iai0kKENPTkZJR19YODZfUE9XRVJOT1dfSzcpCQkrPSBwb3dlcm5vdy1rNy5vCi1vYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s4KQkJKz0gcG93ZXJub3ctazgubwogb2JqLSQoQ09ORklHX1g4Nl9MT05HSEFVTCkJCSs9IGxvbmdoYXVsLm8KIG9iai0kKENPTkZJR19YODZfRV9QT1dFUlNBVkVSKQkJKz0gZV9wb3dlcnNhdmVyLm8KIG9iai0kKENPTkZJR19FTEFOX0NQVUZSRVEpCQkrPSBlbGFuZnJlcS5vCkBAIC0xMCw3ICsxNSw2IEBACiBvYmotJChDT05GSUdfWDg2X1NQRUVEU1RFUF9JQ0gpCQkrPSBzcGVlZHN0ZXAtaWNoLm8KIG9iai0kKENPTkZJR19YODZfU1BFRURTVEVQX0xJQikJCSs9IHNwZWVkc3RlcC1saWIubwogb2JqLSQoQ09ORklHX1g4Nl9TUEVFRFNURVBfU01JKQkJKz0gc3BlZWRzdGVwLXNtaS5vCi1vYmotJChDT05GSUdfWDg2X0FDUElfQ1BVRlJFUSkJCSs9IGFjcGktY3B1ZnJlcS5vCiBvYmotJChDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOTykJKz0gc3BlZWRzdGVwLWNlbnRyaW5vLm8KIG9iai0kKENPTkZJR19YODZfUDRfQ0xPQ0tNT0QpCQkrPSBwNC1jbG9ja21vZC5vCiBvYmotJChDT05GSUdfWDg2X0NQVUZSRVFfTkZPUkNFMikJKz0gY3B1ZnJlcS1uZm9yY2UyLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwppbmRleCA0YjFjMzE5Li4zYmFiZTFmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGFjcGktY3B1ZnJlcS5jIC0gQUNQSSBQcm9jZXNzb3IgUC1TdGF0ZXMgRHJpdmVyICgkUmV2aXNpb246IDEuNCAkKQorICogYWNwaS1jcHVmcmVxLmMgLSBBQ1BJIFByb2Nlc3NvciBQLVN0YXRlcyBEcml2ZXIKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEFuZHkgR3JvdmVyIDxhbmRyZXcuZ3JvdmVyQGludGVsLmNvbT4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUGF1bCBEaWVmZW5iYXVnaCA8cGF1bC5zLmRpZWZlbmJhdWdoQGludGVsLmNvbT4KQEAgLTM2LDE2ICszNiwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogCiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKICNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAiYWNwaS1jcHVmcmVxIiwgbXNnKQorI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsIFwKKwkJImFjcGktY3B1ZnJlcSIsIG1zZykKIAogTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCwgRG9taW5payBCcm9kb3dza2kiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQUNQSSBQcm9jZXNzb3IgUC1TdGF0ZXMgRHJpdmVyIik7CkBAIC05NSw3ICs5Nyw3IEBACiAKIAlwZXJmID0gZGF0YS0+YWNwaV9kYXRhOwogCi0JZm9yIChpPTA7IGk8cGVyZi0+c3RhdGVfY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBwZXJmLT5zdGF0ZV9jb3VudDsgaSsrKSB7CiAJCWlmICh2YWx1ZSA9PSBwZXJmLT5zdGF0ZXNbaV0uc3RhdHVzKQogCQkJcmV0dXJuIGRhdGEtPmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5OwogCX0KQEAgLTExMCw3ICsxMTIsNyBAQAogCW1zciAmPSBJTlRFTF9NU1JfUkFOR0U7CiAJcGVyZiA9IGRhdGEtPmFjcGlfZGF0YTsKIAotCWZvciAoaT0wOyBkYXRhLT5mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORDsgaSsrKSB7CisJZm9yIChpID0gMDsgZGF0YS0+ZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQ7IGkrKykgewogCQlpZiAobXNyID09IHBlcmYtPnN0YXRlc1tkYXRhLT5mcmVxX3RhYmxlW2ldLmluZGV4XS5zdGF0dXMpCiAJCQlyZXR1cm4gZGF0YS0+ZnJlcV90YWJsZVtpXS5mcmVxdWVuY3k7CiAJfQpAQCAtMTM4LDE1ICsxNDAsMTMgQEAKIAl1OCBiaXRfd2lkdGg7CiB9OwogCi10eXBlZGVmIHVuaW9uIHsKLQlzdHJ1Y3QgbXNyX2FkZHIgbXNyOwotCXN0cnVjdCBpb19hZGRyIGlvOwotfSBkcnZfYWRkcl91bmlvbjsKLQogc3RydWN0IGRydl9jbWQgewogCXVuc2lnbmVkIGludCB0eXBlOwogCWNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrOwotCWRydl9hZGRyX3VuaW9uIGFkZHI7CisJdW5pb24geworCQlzdHJ1Y3QgbXNyX2FkZHIgbXNyOworCQlzdHJ1Y3QgaW9fYWRkciBpbzsKKwl9IGFkZHI7CiAJdTMyIHZhbDsKIH07CiAKQEAgLTM2OSw3ICszNjksNyBAQAogCXVuc2lnbmVkIGludCBjdXJfZnJlcTsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWZvciAoaT0wOyBpPDEwMDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAJCWN1cl9mcmVxID0gZXh0cmFjdF9mcmVxKGdldF9jdXJfdmFsKG1hc2spLCBkYXRhKTsKIAkJaWYgKGN1cl9mcmVxID09IGZyZXEpCiAJCQlyZXR1cm4gMTsKQEAgLTQ5NCw3ICs0OTQsNyBAQAogCQl1bnNpZ25lZCBsb25nIGZyZXE7CiAJCXVuc2lnbmVkIGxvbmcgZnJlcW4gPSBwZXJmLT5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOwogCi0JCWZvciAoaT0wOyBpPChwZXJmLT5zdGF0ZV9jb3VudC0xKTsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCAocGVyZi0+c3RhdGVfY291bnQtMSk7IGkrKykgewogCQkJZnJlcSA9IGZyZXFuOwogCQkJZnJlcW4gPSBwZXJmLT5zdGF0ZXNbaSsxXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDA7CiAJCQlpZiAoKDIgKiBjcHVfa2h6KSA+IChmcmVxbiArIGZyZXEpKSB7CkBAIC02NzMsNyArNjczLDcgQEAKIAogCS8qIGRldGVjdCB0cmFuc2l0aW9uIGxhdGVuY3kgKi8KIAlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gMDsKLQlmb3IgKGk9MDsgaTxwZXJmLT5zdGF0ZV9jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHBlcmYtPnN0YXRlX2NvdW50OyBpKyspIHsKIAkJaWYgKChwZXJmLT5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5ICogMTAwMCkgPgogCQkgICAgcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSkKIAkJCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPQpAQCAtNjgyLDggKzY4Miw4IEBACiAKIAlkYXRhLT5tYXhfZnJlcSA9IHBlcmYtPnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDA7CiAJLyogdGFibGUgaW5pdCAqLwotCWZvciAoaT0wOyBpPHBlcmYtPnN0YXRlX2NvdW50OyBpKyspIHsKLQkJaWYgKGk+MCAmJiBwZXJmLT5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgPj0KKwlmb3IgKGkgPSAwOyBpIDwgcGVyZi0+c3RhdGVfY291bnQ7IGkrKykgeworCQlpZiAoaSA+IDAgJiYgcGVyZi0+c3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ID49CiAJCSAgICBkYXRhLT5mcmVxX3RhYmxlW3ZhbGlkX3N0YXRlcy0xXS5mcmVxdWVuY3kgLyAxMDAwKQogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9jcHVmcmVxLW5mb3JjZTIuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9jcHVmcmVxLW5mb3JjZTIuYwppbmRleCA5NjVlYTUyLi43MzMwOTNkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvY3B1ZnJlcS1uZm9yY2UyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2NwdWZyZXEtbmZvcmNlMi5jCkBAIC0zMiw3ICszMiw3IEBACiAgKiBuZm9yY2UyX2NoaXBzZXQ6CiAgKiBGU0IgaXMgY2hhbmdlZCB1c2luZyB0aGUgY2hpcHNldAogICovCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKm5mb3JjZTJfY2hpcHNldF9kZXY7CitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKm5mb3JjZTJfZGV2OwogCiAvKiBmaWQ6CiAgKiBtdWx0aXBsaWVyICogMTAKQEAgLTU2LDcgKzU2LDkgQEAKIE1PRFVMRV9QQVJNX0RFU0MobWluX2ZzYiwKIAkJIk1pbmltdW0gRlNCIHRvIHVzZSwgaWYgbm90IGRlZmluZWQ6IGN1cnJlbnQgRlNCIC0gNTAiKTsKIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJjcHVmcmVxLW5mb3JjZTIiLCBtc2cpCisjZGVmaW5lIFBGWCAiY3B1ZnJlcS1uZm9yY2UyOiAiCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgXAorCQkiY3B1ZnJlcS1uZm9yY2UyIiwgbXNnKQogCiAvKioKICAqIG5mb3JjZTJfY2FsY19mc2IgLSBjYWxjdWxhdGUgRlNCCkBAIC0xMTgsMTEgKzEyMCwxMSBAQAogCWludCB0ZW1wOwogCiAJLyogU2V0IHRoZSBwbGwgYWRkci4gdG8gMHgwMCAqLwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQobmZvcmNlMl9jaGlwc2V0X2RldiwgTkZPUkNFMl9QTExBRFIsIDApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobmZvcmNlMl9kZXYsIE5GT1JDRTJfUExMQURSLCAwKTsKIAogCS8qIE5vdyB3cml0ZSB0aGUgdmFsdWUgaW4gYWxsIDY0IHJlZ2lzdGVycyAqLwogCWZvciAodGVtcCA9IDA7IHRlbXAgPD0gMHgzZjsgdGVtcCsrKQotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG5mb3JjZTJfY2hpcHNldF9kZXYsIE5GT1JDRTJfUExMUkVHLCBwbGwpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG5mb3JjZTJfZGV2LCBORk9SQ0UyX1BMTFJFRywgcGxsKTsKIAogCXJldHVybjsKIH0KQEAgLTEzOSw4ICsxNDEsOCBAQAogCXUzMiBmc2IsIHRlbXAgPSAwOwogCiAJLyogR2V0IGNoaXBzZXQgYm9vdCBGU0IgZnJvbSBzdWJkZXZpY2UgNSAoRlNCIGF0IGJvb3QtdGltZSkgKi8KLQluZm9yY2UyX3N1YjUgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfVkVORE9SX0lEX05WSURJQSwKLQkJCQkJCTB4MDFFRiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7CisJbmZvcmNlMl9zdWI1ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDFFRiwKKwkJCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKIAlpZiAoIW5mb3JjZTJfc3ViNSkKIAkJcmV0dXJuIDA7CiAKQEAgLTE0OCwxMyArMTUwLDEzIEBACiAJZnNiIC89IDEwMDAwMDA7CiAKIAkvKiBDaGVjayBpZiBQTEwgcmVnaXN0ZXIgaXMgYWxyZWFkeSBzZXQgKi8KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShuZm9yY2UyX2NoaXBzZXRfZGV2LCBORk9SQ0UyX1BMTEVOQUJMRSwgKHU4ICopJnRlbXApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG5mb3JjZTJfZGV2LCBORk9SQ0UyX1BMTEVOQUJMRSwgKHU4ICopJnRlbXApOwogCiAJaWYgKGJvb3Rmc2IgfHwgIXRlbXApCiAJCXJldHVybiBmc2I7CiAKIAkvKiBVc2UgUExMIHJlZ2lzdGVyIEZTQiB2YWx1ZSAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZm9yY2UyX2NoaXBzZXRfZGV2LCBORk9SQ0UyX1BMTFJFRywgJnRlbXApOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZm9yY2UyX2RldiwgTkZPUkNFMl9QTExSRUcsICZ0ZW1wKTsKIAlmc2IgPSBuZm9yY2UyX2NhbGNfZnNiKHRlbXApOwogCiAJcmV0dXJuIGZzYjsKQEAgLTE3NCwxOCArMTc2LDE4IEBACiAJaW50IHBsbCA9IDA7CiAKIAlpZiAoKGZzYiA+IG1heF9mc2IpIHx8IChmc2IgPCBORk9SQ0UyX01JTl9GU0IpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogRlNCICVkIGlzIG91dCBvZiByYW5nZSFcbiIsIGZzYik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkZTQiAlZCBpcyBvdXQgb2YgcmFuZ2UhXG4iLCBmc2IpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAl0ZnNiID0gbmZvcmNlMl9mc2JfcmVhZCgwKTsKIAlpZiAoIXRmc2IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBFcnJvciB3aGlsZSByZWFkaW5nIHRoZSBGU0JcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFcnJvciB3aGlsZSByZWFkaW5nIHRoZSBGU0JcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBGaXJzdCB3cml0ZT8gVGhlbiBzZXQgYWN0dWFsIHZhbHVlICovCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUobmZvcmNlMl9jaGlwc2V0X2RldiwgTkZPUkNFMl9QTExFTkFCTEUsICh1OCAqKSZ0ZW1wKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShuZm9yY2UyX2RldiwgTkZPUkNFMl9QTExFTkFCTEUsICh1OCAqKSZ0ZW1wKTsKIAlpZiAoIXRlbXApIHsKIAkJcGxsID0gbmZvcmNlMl9jYWxjX3BsbCh0ZnNiKTsKIApAQCAtMTk3LDcgKzE5OSw3IEBACiAKIAkvKiBFbmFibGUgd3JpdGUgYWNjZXNzICovCiAJdGVtcCA9IDB4MDE7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKG5mb3JjZTJfY2hpcHNldF9kZXYsIE5GT1JDRTJfUExMRU5BQkxFLCAodTgpdGVtcCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKG5mb3JjZTJfZGV2LCBORk9SQ0UyX1BMTEVOQUJMRSwgKHU4KXRlbXApOwogCiAJZGlmZiA9IHRmc2IgLSBmc2I7CiAKQEAgLTIyMiw3ICsyMjQsNyBAQAogCX0KIAogCXRlbXAgPSAweDQwOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShuZm9yY2UyX2NoaXBzZXRfZGV2LCBORk9SQ0UyX1BMTEFEUiwgKHU4KXRlbXApOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShuZm9yY2UyX2RldiwgTkZPUkNFMl9QTExBRFIsICh1OCl0ZW1wKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQ0LDcgKzI0Niw4IEBACiAgKiBuZm9yY2UyX3RhcmdldCAtIHNldCBhIG5ldyBDUFVGcmVxIHBvbGljeQogICogQHBvbGljeTogbmV3IHBvbGljeQogICogQHRhcmdldF9mcmVxOiB0aGUgdGFyZ2V0IGZyZXF1ZW5jeQotICogQHJlbGF0aW9uOiBob3cgdGhhdCBmcmVxdWVuY3kgcmVsYXRlcyB0byBhY2hpZXZlZCBmcmVxdWVuY3kgKENQVUZSRVFfUkVMQVRJT05fTCBvciBDUFVGUkVRX1JFTEFUSU9OX0gpCisgKiBAcmVsYXRpb246IGhvdyB0aGF0IGZyZXF1ZW5jeSByZWxhdGVzIHRvIGFjaGlldmVkIGZyZXF1ZW5jeQorICogIChDUFVGUkVRX1JFTEFUSU9OX0wgb3IgQ1BVRlJFUV9SRUxBVElPTl9IKQogICoKICAqIFNldHMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kuCiAgKi8KQEAgLTI3Niw3ICsyNzksNyBAQAogCS8qIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsgKi8KIAogCWlmIChuZm9yY2UyX3NldF9mc2IodGFyZ2V0X2ZzYikgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IENoYW5naW5nIEZTQiB0byAlZCBmYWlsZWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNoYW5naW5nIEZTQiB0byAlZCBmYWlsZWRcbiIsCiAJCQl0YXJnZXRfZnNiKTsKIAllbHNlCiAJCWRwcmludGsoIkNoYW5nZWQgRlNCIHN1Y2Nlc3NmdWxseSB0byAlZFxuIiwKQEAgLTMyNyw4ICszMzAsOCBAQAogCS8qIEZJWDogR2V0IEZJRCBmcm9tIENQVSAqLwogCWlmICghZmlkKSB7CiAJCWlmICghY3B1X2toeikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJjcHVmcmVxOiBjcHVfa2h6IG5vdCBzZXQsIGNhbid0IGNhbGN1bGF0ZSBtdWx0aXBsaWVyIVxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWAorCQkJImNwdV9raHogbm90IHNldCwgY2FuJ3QgY2FsY3VsYXRlIG11bHRpcGxpZXIhXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKQEAgLTM0Myw3ICszNDYsNyBAQAogCQl9CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiY3B1ZnJlcTogRlNCIGN1cnJlbnRseSBhdCAlaSBNSHosIEZJRCAlZC4lZFxuIiwgZnNiLAorCXByaW50ayhLRVJOX0lORk8gUEZYICJGU0IgY3VycmVudGx5IGF0ICVpIE1IeiwgRklEICVkLiVkXG4iLCBmc2IsCiAJICAgICAgIGZpZCAvIDEwLCBmaWQgJSAxMCk7CiAKIAkvKiBTZXQgbWF4aW11bSBGU0IgdG8gRlNCIGF0IGJvb3QgdGltZSAqLwpAQCAtMzkyLDE3ICszOTUsMTggQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBuZm9yY2UyX2RldGVjdF9jaGlwc2V0KHZvaWQpCiB7Ci0JbmZvcmNlMl9jaGlwc2V0X2RldiA9IHBjaV9nZXRfc3Vic3lzKFBDSV9WRU5ET1JfSURfTlZJRElBLAorCW5mb3JjZTJfZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9OVklESUEsCiAJCQkJCVBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTIsCiAJCQkJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOwogCi0JaWYgKG5mb3JjZTJfY2hpcHNldF9kZXYgPT0gTlVMTCkKKwlpZiAobmZvcmNlMl9kZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwcmludGsoS0VSTl9JTkZPICJjcHVmcmVxOiBEZXRlY3RlZCBuRm9yY2UyIGNoaXBzZXQgcmV2aXNpb24gJVhcbiIsCi0JICAgICAgIG5mb3JjZTJfY2hpcHNldF9kZXYtPnJldmlzaW9uKTsKLQlwcmludGsoS0VSTl9JTkZPCi0JICAgICAgICJjcHVmcmVxOiBGU0IgY2hhbmdpbmcgaXMgbWF5YmUgdW5zdGFibGUgYW5kIGNhbiBsZWFkIHRvIGNyYXNoZXMgYW5kIGRhdGEgbG9zcy5cbiIpOworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBuRm9yY2UyIGNoaXBzZXQgcmV2aXNpb24gJVhcbiIsCisJICAgICAgIG5mb3JjZTJfZGV2LT5yZXZpc2lvbik7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlgKKwkgICAgICAgIkZTQiBjaGFuZ2luZyBpcyBtYXliZSB1bnN0YWJsZSBhbmQgY2FuIGxlYWQgdG8gIgorCSAgICAgICAiY3Jhc2hlcyBhbmQgZGF0YSBsb3NzLlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQyMCw3ICs0MjQsNyBAQAogCiAJLyogZGV0ZWN0IGNoaXBzZXQgKi8KIAlpZiAobmZvcmNlMl9kZXRlY3RfY2hpcHNldCgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogTm8gbkZvcmNlMiBjaGlwc2V0LlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJObyBuRm9yY2UyIGNoaXBzZXQuXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZV9wb3dlcnNhdmVyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZV9wb3dlcnNhdmVyLmMKaW5kZXggYzJmOTMwZC4uM2Y4M2VhMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2VfcG93ZXJzYXZlci5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwpAQCAtMTIsMTIgKzEyLDEyIEBACiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPGFzbS9tc3IuaD4KICNpbmNsdWRlIDxhc20vdHNjLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAKICNkZWZpbmUgRVBTX0JSQU5EX0M3TQkwCiAjZGVmaW5lIEVQU19CUkFORF9DNwkxCkBAIC0xODQsNyArMTg0LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0Jc3dpdGNoKGJyYW5kKSB7CisJc3dpdGNoIChicmFuZCkgewogCWNhc2UgRVBTX0JSQU5EX0M3TToKIAkJcHJpbnRrKEtFUk5fQ09OVCAiQzctTVxuIik7CiAJCWJyZWFrOwpAQCAtMjE4LDE3ICsyMTgsMjAgQEAKIAkvKiBQcmludCB2b2x0YWdlIGFuZCBtdWx0aXBsaWVyICovCiAJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CiAJY3VycmVudF92b2x0YWdlID0gbG8gJiAweGZmOwotCXByaW50ayhLRVJOX0lORk8gImVwczogQ3VycmVudCB2b2x0YWdlID0gJWRtVlxuIiwgY3VycmVudF92b2x0YWdlICogMTYgKyA3MDApOworCXByaW50ayhLRVJOX0lORk8gImVwczogQ3VycmVudCB2b2x0YWdlID0gJWRtVlxuIiwKKwkJCWN1cnJlbnRfdm9sdGFnZSAqIDE2ICsgNzAwKTsKIAljdXJyZW50X211bHRpcGxpZXIgPSAobG8gPj4gOCkgJiAweGZmOwogCXByaW50ayhLRVJOX0lORk8gImVwczogQ3VycmVudCBtdWx0aXBsaWVyID0gJWRcbiIsIGN1cnJlbnRfbXVsdGlwbGllcik7CiAKIAkvKiBQcmludCBsaW1pdHMgKi8KIAltYXhfdm9sdGFnZSA9IGhpICYgMHhmZjsKLQlwcmludGsoS0VSTl9JTkZPICJlcHM6IEhpZ2hlc3Qgdm9sdGFnZSA9ICVkbVZcbiIsIG1heF92b2x0YWdlICogMTYgKyA3MDApOworCXByaW50ayhLRVJOX0lORk8gImVwczogSGlnaGVzdCB2b2x0YWdlID0gJWRtVlxuIiwKKwkJCW1heF92b2x0YWdlICogMTYgKyA3MDApOwogCW1heF9tdWx0aXBsaWVyID0gKGhpID4+IDgpICYgMHhmZjsKIAlwcmludGsoS0VSTl9JTkZPICJlcHM6IEhpZ2hlc3QgbXVsdGlwbGllciA9ICVkXG4iLCBtYXhfbXVsdGlwbGllcik7CiAJbWluX3ZvbHRhZ2UgPSAoaGkgPj4gMTYpICYgMHhmZjsKLQlwcmludGsoS0VSTl9JTkZPICJlcHM6IExvd2VzdCB2b2x0YWdlID0gJWRtVlxuIiwgbWluX3ZvbHRhZ2UgKiAxNiArIDcwMCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiZXBzOiBMb3dlc3Qgdm9sdGFnZSA9ICVkbVZcbiIsCisJCQltaW5fdm9sdGFnZSAqIDE2ICsgNzAwKTsKIAltaW5fbXVsdGlwbGllciA9IChoaSA+PiAyNCkgJiAweGZmOwogCXByaW50ayhLRVJOX0lORk8gImVwczogTG93ZXN0IG11bHRpcGxpZXIgPSAlZFxuIiwgbWluX211bHRpcGxpZXIpOwogCkBAIC0zMTgsNyArMzIxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIGVwc19hdHRyW10gPSB7CitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciAqZXBzX2F0dHJbXSA9IHsKIAkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCiAJTlVMTCwKIH07CkBAIC0zNTYsNyArMzU5LDcgQEAKIAljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZlcHNfZHJpdmVyKTsKIH0KIAotTU9EVUxFX0FVVEhPUigiUmFmYbMgQmlsc2tpIDxyYWZhbGJpbHNraUBpbnRlcmlhLnBsPiIpOworTU9EVUxFX0FVVEhPUigiUmFmYWwgQmlsc2tpIDxyYWZhbGJpbHNraUBpbnRlcmlhLnBsPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJFbmhhbmNlZCBQb3dlclNhdmVyIGRyaXZlciBmb3IgVklBIEM3IENQVSdzLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZWxhbmZyZXEuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lbGFuZnJlcS5jCmluZGV4IGZlNjEzYzkuLjAwNmIyNzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lbGFuZnJlcS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lbGFuZnJlcS5jCkBAIC0xODQsNyArMTg0LDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgbmV3c3RhdGUgPSAwOwogCi0JaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksICZlbGFuZnJlcV90YWJsZVswXSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQorCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmZWxhbmZyZXFfdGFibGVbMF0sCisJCQkJdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWVsYW5mcmVxX3NldF9jcHVfc3RhdGUobmV3c3RhdGUpOwpAQCAtMzAxLDcgKzMwMiw4IEBACiBtb2R1bGVfcGFyYW0obWF4X2ZyZXEsIGludCwgMDQ0NCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIlJvYmVydCBTY2h3ZWJlbCA8ci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZT4sIFN2ZW4gR2VnZ3VzIDxzdmVuQGdlZ2d1cy5uZXQ+Iik7CitNT0RVTEVfQVVUSE9SKCJSb2JlcnQgU2Nod2ViZWwgPHIuc2Nod2ViZWxAcGVuZ3V0cm9uaXguZGU+LCAiCisJCSJTdmVuIEdlZ2d1cyA8c3ZlbkBnZWdndXMubmV0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJjcHVmcmVxIGRyaXZlciBmb3IgQU1EJ3MgRWxhbiBDUFVzIik7CiAKIG1vZHVsZV9pbml0KGVsYW5mcmVxX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2d4LXN1c3Btb2QuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKaW5kZXggOWQ5ZWFlOC4uYWMyN2VjMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2d4LXN1c3Btb2QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZ3gtc3VzcG1vZC5jCkBAIC03OSw4ICs3OSw5IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWN5cml4Lmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKIC8qIFBDSSBjb25maWcgcmVnaXN0ZXJzLCBhbGwgYXQgRjAgKi8KICNkZWZpbmUgUENJX1BNRVIxCTB4ODAJLyogcG93ZXIgbWFuYWdlbWVudCBlbmFibGUgcmVnaXN0ZXIgMSAqLwpAQCAtMTIyLDggKzEyMyw4IEBACiBzdGF0aWMgaW50IHN0b2NrX2ZyZXE7CiAKIC8qIFBDSSBidXMgY2xvY2sgLSBkZWZhdWx0cyB0byAzMC4wMDAgaWYgY3B1X2toeiBpcyBub3QgYXZhaWxhYmxlICovCi1zdGF0aWMgaW50IHBjaV9idXNjbGsgPSAwOwotbW9kdWxlX3BhcmFtIChwY2lfYnVzY2xrLCBpbnQsIDA0NDQpOworc3RhdGljIGludCBwY2lfYnVzY2xrOworbW9kdWxlX3BhcmFtKHBjaV9idXNjbGssIGludCwgMDQ0NCk7CiAKIC8qIG1heGltdW0gZHVyYXRpb24gZm9yIHdoaWNoIHRoZSBjcHUgbWF5IGJlIHN1c3BlbmRlZAogICogKDMydXMgKiBNQVhfRFVSQVRJT04pLiBJZiBubyBwYXJhbWV0ZXIgaXMgZ2l2ZW4sIHRoaXMgZGVmYXVsdHMKQEAgLTEzMiw3ICsxMzMsNyBAQAogICogaXMgc3VzcGVuZGVkIC0tIHByb2Nlc3NpbmcgcG93ZXIgaXMganVzdCAwLjM5JSBvZiB3aGF0IGl0IHVzZWQgdG8gYmUsCiAgKiB0aG91Z2guIDc4MS4yNSBrSHooISkgZm9yIGEgMjAwIE1IeiBwcm9jZXNzb3IgLS0gd293LiAqLwogc3RhdGljIGludCBtYXhfZHVyYXRpb24gPSAyNTU7Ci1tb2R1bGVfcGFyYW0gKG1heF9kdXJhdGlvbiwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShtYXhfZHVyYXRpb24sIGludCwgMDQ0NCk7CiAKIC8qIEZvciB0aGUgZGVmYXVsdCBwb2xpY3ksIHdlIHdhbnQgYXQgbGVhc3Qgc29tZSBwcm9jZXNzaW5nIHBvd2VyCiAgKiAtIGxldCdzIHNheSA1JS4gKG1pbiA9IG1heGZyZXEgLyBQT0xJQ1lfTUlOX0RJVikKQEAgLTE0MCw3ICsxNDEsOCBAQAogI2RlZmluZSBQT0xJQ1lfTUlOX0RJViAyMAogCiAKLSNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAiZ3gtc3VzcG1vZCIsIG1zZykKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCBcCisJCSJneC1zdXNwbW9kIiwgbXNnKQogCiAvKioKICAqIHdlIGNhbiBkZXRlY3QgYSBjb3JlIG11bHRpcGlsZXIgZnJvbSBkaXIwX2xzYgpAQCAtMTY2LDEyICsxNjgsMjAgQEAKICAqCUxvdyBMZXZlbCBjaGlwc2V0IGludGVyZmFjZQkJCQkqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBneF9jaGlwc2V0X3RibFtdIF9faW5pdGRhdGEgPSB7Ci0JeyBQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfTEVHQUNZLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKLQl7IFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUxMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTMwX0xFR0FDWSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTIwLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisJeyBQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MTAsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKIAl7IDAsIH0sCiB9OwogCitzdGF0aWMgdm9pZCBneF93cml0ZV9ieXRlKGludCByZWcsIGludCB2YWx1ZSkKK3sKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZ3hfcGFyYW1zLT5jczU1eDAsIHJlZywgdmFsdWUpOworfQorCiAvKioKICAqIGd4X2RldGVjdF9jaGlwc2V0OgogICoKQEAgLTIwMCw3ICsyMTAsOCBAQAogLyoqCiAgKiBneF9nZXRfY3B1c3BlZWQ6CiAgKgotICogRmluZHMgb3V0IGF0IHdoaWNoIGVmZmljaWVudCBmcmVxdWVuY3kgdGhlIEN5cml4IE1lZGlhR1gvTmF0U2VtaSBHZW9kZSBDUFUgcnVucy4KKyAqIEZpbmRzIG91dCBhdCB3aGljaCBlZmZpY2llbnQgZnJlcXVlbmN5IHRoZSBDeXJpeCBNZWRpYUdYL05hdFNlbWkKKyAqIEdlb2RlIENQVSBydW5zLgogICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGd4X2dldF9jcHVzcGVlZCh1bnNpZ25lZCBpbnQgY3B1KQogewpAQCAtMjE3LDE3ICsyMjgsMTggQEAKICAqCiAgKiovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ3hfdmFsaWRhdGVfc3BlZWQodW5zaWduZWQgaW50IGtoeiwgdTggKm9uX2R1cmF0aW9uLCB1OCAqb2ZmX2R1cmF0aW9uKQorc3RhdGljIHVuc2lnbmVkIGludCBneF92YWxpZGF0ZV9zcGVlZCh1bnNpZ25lZCBpbnQga2h6LCB1OCAqb25fZHVyYXRpb24sCisJCXU4ICpvZmZfZHVyYXRpb24pCiB7CiAJdW5zaWduZWQgaW50IGk7CiAJdTggdG1wX29uLCB0bXBfb2ZmOwogCWludCBvbGRfdG1wX2ZyZXEgPSBzdG9ja19mcmVxOwogCWludCB0bXBfZnJlcTsKIAotCSpvZmZfZHVyYXRpb249MTsKLQkqb25fZHVyYXRpb249MDsKKwkqb2ZmX2R1cmF0aW9uID0gMTsKKwkqb25fZHVyYXRpb24gPSAwOwogCi0JZm9yIChpPW1heF9kdXJhdGlvbjsgaT4wOyBpLS0pIHsKKwlmb3IgKGkgPSBtYXhfZHVyYXRpb247IGkgPiAwOyBpLS0pIHsKIAkJdG1wX29mZiA9ICgoa2h6ICogaSkgLyBzdG9ja19mcmVxKSAmIDB4ZmY7CiAJCXRtcF9vbiA9IGkgLSB0bXBfb2ZmOwogCQl0bXBfZnJlcSA9IChzdG9ja19mcmVxICogdG1wX29mZikgLyBpOwpAQCAtMjU5LDI2ICsyNzEsMzQgQEAKIAlmcmVxcy5jcHUgPSAwOwogCWZyZXFzLm9sZCA9IGd4X2dldF9jcHVzcGVlZCgwKTsKIAotCW5ld19raHogPSBneF92YWxpZGF0ZV9zcGVlZChraHosICZneF9wYXJhbXMtPm9uX2R1cmF0aW9uLCAmZ3hfcGFyYW1zLT5vZmZfZHVyYXRpb24pOworCW5ld19raHogPSBneF92YWxpZGF0ZV9zcGVlZChraHosICZneF9wYXJhbXMtPm9uX2R1cmF0aW9uLAorCQkJJmd4X3BhcmFtcy0+b2ZmX2R1cmF0aW9uKTsKIAogCWZyZXFzLm5ldyA9IG5ld19raHo7CiAKIAljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAotCWlmIChuZXdfa2h6ICE9IHN0b2NrX2ZyZXEpIHsgIC8qIGlmIG5ldyBraHogPT0gMTAwJSBvZiBDUFUgc3BlZWQsIGl0IGlzIHNwZWNpYWwgY2FzZSAqLworCisKKwlpZiAobmV3X2toeiAhPSBzdG9ja19mcmVxKSB7CisJCS8qIGlmIG5ldyBraHogPT0gMTAwJSBvZiBDUFUgc3BlZWQsIGl0IGlzIHNwZWNpYWwgY2FzZSAqLwogCQlzd2l0Y2ggKGd4X3BhcmFtcy0+Y3M1NXgwLT5kZXZpY2UpIHsKIAkJY2FzZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfTEVHQUNZOgogCQkJcG1lcjEgPSBneF9wYXJhbXMtPnBjaV9wbWVyMSB8IElSUV9TUERVUCB8IFZJRF9TUERVUDsKIAkJCS8qIEZJWE1FOiBuZWVkIHRvIHRlc3Qgb3RoZXIgdmFsdWVzIC0tIFp3YW5lLE1pdXJhICovCi0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZ3hfcGFyYW1zLT5jczU1eDAsIFBDSV9JUlFUQywgNCk7IC8qIHR5cGljYWwgMiB0byA0bXMgKi8KLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShneF9wYXJhbXMtPmNzNTV4MCwgUENJX1ZJRFRDLCAxMDApOy8qIHR5cGljYWwgNTAgdG8gMTAwbXMgKi8KLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShneF9wYXJhbXMtPmNzNTV4MCwgUENJX1BNRVIxLCBwbWVyMSk7CisJCQkvKiB0eXBpY2FsIDIgdG8gNG1zICovCisJCQlneF93cml0ZV9ieXRlKFBDSV9JUlFUQywgNCk7CisJCQkvKiB0eXBpY2FsIDUwIHRvIDEwMG1zICovCisJCQlneF93cml0ZV9ieXRlKFBDSV9WSURUQywgMTAwKTsKKwkJCWd4X3dyaXRlX2J5dGUoUENJX1BNRVIxLCBwbWVyMSk7CiAKLQkJCWlmIChneF9wYXJhbXMtPmNzNTV4MC0+cmV2aXNpb24gPCAweDEwKSB7ICAgLyogQ1M1NTMwKHJldiAxLjIsIDEuMykgKi8KLQkJCQlzdXNjZmcgPSBneF9wYXJhbXMtPnBjaV9zdXNjZmcgfCBTVVNNT0Q7Ci0JCQl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENTNTUzMEEsQi4uICovCi0JCQkJc3VzY2ZnID0gZ3hfcGFyYW1zLT5wY2lfc3VzY2ZnIHwgU1VTTU9EIHwgUFdSU1ZFOworCQkJaWYgKGd4X3BhcmFtcy0+Y3M1NXgwLT5yZXZpc2lvbiA8IDB4MTApIHsKKwkJCQkvKiBDUzU1MzAocmV2IDEuMiwgMS4zKSAqLworCQkJCXN1c2NmZyA9IGd4X3BhcmFtcy0+cGNpX3N1c2NmZ3xTVVNNT0Q7CisJCQl9IGVsc2UgeworCQkJCS8qIENTNTUzMEEsQi4uICovCisJCQkJc3VzY2ZnID0gZ3hfcGFyYW1zLT5wY2lfc3VzY2ZnfFNVU01PRHxQV1JTVkU7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MjA6CkBAIC0yOTQsMTMgKzMxNCwxMyBAQAogCQlzdXNjZmcgPSBneF9wYXJhbXMtPnBjaV9zdXNjZmcgJiB+KFNVU01PRCk7CiAJCWd4X3BhcmFtcy0+b2ZmX2R1cmF0aW9uID0gMDsKIAkJZ3hfcGFyYW1zLT5vbl9kdXJhdGlvbiA9IDA7Ci0JCWRwcmludGsoInN1c3BlbmQgbW9kdWxhdGlvbiBkaXNhYmxlZDogY3B1IHJ1bnMgMTAwIHBlcmNlbnQgc3BlZWQuXG4iKTsKKwkJZHByaW50aygic3VzcGVuZCBtb2R1bGF0aW9uIGRpc2FibGVkOiBjcHUgcnVucyAxMDAlJSBzcGVlZC5cbiIpOwogCX0KIAotCXBjaV93cml0ZV9jb25maWdfYnl0ZShneF9wYXJhbXMtPmNzNTV4MCwgUENJX01PRE9GRiwgZ3hfcGFyYW1zLT5vZmZfZHVyYXRpb24pOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShneF9wYXJhbXMtPmNzNTV4MCwgUENJX01PRE9OLCBneF9wYXJhbXMtPm9uX2R1cmF0aW9uKTsKKwlneF93cml0ZV9ieXRlKFBDSV9NT0RPRkYsIGd4X3BhcmFtcy0+b2ZmX2R1cmF0aW9uKTsKKwlneF93cml0ZV9ieXRlKFBDSV9NT0RPTiwgZ3hfcGFyYW1zLT5vbl9kdXJhdGlvbik7CiAKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZ3hfcGFyYW1zLT5jczU1eDAsIFBDSV9TVVNDRkcsIHN1c2NmZyk7CisJZ3hfd3JpdGVfYnl0ZShQQ0lfU1VTQ0ZHLCBzdXNjZmcpOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGd4X3BhcmFtcy0+Y3M1NXgwLCBQQ0lfU1VTQ0ZHLCAmc3VzY2ZnKTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTMzNCw3ICszNTQsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBvbGljeS0+Y3B1ID0gMDsKLQljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwgKHN0b2NrX2ZyZXEgLyBtYXhfZHVyYXRpb24pLCBzdG9ja19mcmVxKTsKKwljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwgKHN0b2NrX2ZyZXEgLyBtYXhfZHVyYXRpb24pLAorCQkJc3RvY2tfZnJlcSk7CiAKIAkvKiBpdCBuZWVkcyB0byBiZSBhc3N1cmVkIHRoYXQgYXQgbGVhc3Qgb25lIHN1cHBvcnRlZCBmcmVxdWVuY3kgaXMKIAkgKiB3aXRoaW4gcG9saWN5LT5taW4gYW5kIHBvbGljeS0+bWF4LiBJZiBpdCBpcyBub3QsIHBvbGljeS0+bWF4CkBAIC0zNTQsNyArMzc1LDggQEAKIAlwb2xpY3ktPm1heCA9IHRtcF9mcmVxOwogCWlmIChwb2xpY3ktPm1heCA8IHBvbGljeS0+bWluKQogCQlwb2xpY3ktPm1heCA9IHBvbGljeS0+bWluOwotCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCAoc3RvY2tfZnJlcSAvIG1heF9kdXJhdGlvbiksIHN0b2NrX2ZyZXEpOworCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCAoc3RvY2tfZnJlcSAvIG1heF9kdXJhdGlvbiksCisJCQlzdG9ja19mcmVxKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzk4LDE4ICs0MjAsMTggQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBkZXRlcm1pbmUgbWF4aW11bSBmcmVxdWVuY3kgKi8KLQlpZiAocGNpX2J1c2NsaykgeworCWlmIChwY2lfYnVzY2xrKQogCQltYXhmcmVxID0gcGNpX2J1c2NsayAqIGd4X2ZyZXFfbXVsdFtnZXRDeDg2KENYODZfRElSMSkgJiAweDBmXTsKLQl9IGVsc2UgaWYgKGNwdV9raHopIHsKKwllbHNlIGlmIChjcHVfa2h6KQogCQltYXhmcmVxID0gY3B1X2toejsKLQl9IGVsc2UgeworCWVsc2UKIAkJbWF4ZnJlcSA9IDMwMDAwICogZ3hfZnJlcV9tdWx0W2dldEN4ODYoQ1g4Nl9ESVIxKSAmIDB4MGZdOwotCX0KKwogCXN0b2NrX2ZyZXEgPSBtYXhmcmVxOwogCWN1cmZyZXEgPSBneF9nZXRfY3B1c3BlZWQoMCk7CiAKIAlkcHJpbnRrKCJjcHUgbWF4IGZyZXF1ZW5jeSBpcyAlZC5cbiIsIG1heGZyZXEpOwotCWRwcmludGsoImNwdSBjdXJyZW50IGZyZXF1ZW5jeSBpcyAlZGtIei5cbiIsY3VyZnJlcSk7CisJZHByaW50aygiY3B1IGN1cnJlbnQgZnJlcXVlbmN5IGlzICVka0h6LlxuIiwgY3VyZnJlcSk7CiAKIAkvKiBzZXR1cCBiYXNpYyBzdHJ1Y3QgZm9yIGNwdWZyZXEgQVBJICovCiAJcG9saWN5LT5jcHUgPSAwOwpAQCAtNDQ3LDcgKzQ2OSw4IEBACiAJc3RydWN0IHBjaV9kZXYgKmd4X3BjaTsKIAogCS8qIFRlc3QgaWYgd2UgaGF2ZSB0aGUgcmlnaHQgaGFyZHdhcmUgKi8KLQlpZiAoKGd4X3BjaSA9IGd4X2RldGVjdF9jaGlwc2V0KCkpID09IE5VTEwpCisJZ3hfcGNpID0gZ3hfZGV0ZWN0X2NoaXBzZXQoKTsKKwlpZiAoZ3hfcGNpID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogY2hlY2sgd2hldGhlciBtb2R1bGUgcGFyYW1ldGVycyBhcmUgc2FuZSAqLwpAQCAtNDY4LDkgKzQ5MSwxMSBAQAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBhcmFtcy0+Y3M1NXgwLCBQQ0lfUE1FUjEsICYocGFyYW1zLT5wY2lfcG1lcjEpKTsKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwYXJhbXMtPmNzNTV4MCwgUENJX1BNRVIyLCAmKHBhcmFtcy0+cGNpX3BtZXIyKSk7CiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGFyYW1zLT5jczU1eDAsIFBDSV9NT0RPTiwgJihwYXJhbXMtPm9uX2R1cmF0aW9uKSk7Ci0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGFyYW1zLT5jczU1eDAsIFBDSV9NT0RPRkYsICYocGFyYW1zLT5vZmZfZHVyYXRpb24pKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwYXJhbXMtPmNzNTV4MCwgUENJX01PRE9GRiwKKwkJCSYocGFyYW1zLT5vZmZfZHVyYXRpb24pKTsKIAotCWlmICgocmV0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmd4X3N1c3Btb2RfZHJpdmVyKSkpIHsKKwlyZXQgPSBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmZ3hfc3VzcG1vZF9kcml2ZXIpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUocGFyYW1zKTsKIAkJcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgZXJyb3IhICovCiAJfQpAQCAtNDg1LDkgKzUxMCw5IEBACiAJa2ZyZWUoZ3hfcGFyYW1zKTsKIH0KIAotTU9EVUxFX0FVVEhPUiAoIkhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04gKCJDcHVmcmVxIGRyaXZlciBmb3IgQ3lyaXggTWVkaWFHWCBhbmQgTmF0U2VtaSBHZW9kZSIpOwotTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNwdWZyZXEgZHJpdmVyIGZvciBDeXJpeCBNZWRpYUdYIGFuZCBOYXRTZW1pIEdlb2RlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIG1vZHVsZV9pbml0KGNwdWZyZXFfZ3hfaW5pdCk7CiBtb2R1bGVfZXhpdChjcHVmcmVxX2d4X2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwppbmRleCBhNGNmZjVkLi5mMWM1MWFlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwpAQCAtMzAsMTIgKzMwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgPGFzbS9tc3IuaD4KLSNpbmNsdWRlIDxhc20vdGltZXguaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgogCiAjaW5jbHVkZSAibG9uZ2hhdWwuaCIKQEAgLTU4LDcgKzU4LDcgQEAKICNkZWZpbmUgVVNFX05PUlRIQlJJREdFCQkoMSA8PCAyKQogCiBzdGF0aWMgaW50IGNwdV9tb2RlbDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtc2NhbGVzPTE2Oworc3RhdGljIHVuc2lnbmVkIGludCBudW1zY2FsZXMgPSAxNjsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZnNiOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1WX3BvcyAqdnJtX21WX3RhYmxlOwpAQCAtNjcsOCArNjcsOCBAQAogc3RhdGljIHVuc2lnbmVkIGludCBoaWdoZXN0X3NwZWVkLCBsb3dlc3Rfc3BlZWQ7IC8qIGtIeiAqLwogc3RhdGljIHVuc2lnbmVkIGludCBtaW5tdWx0LCBtYXhtdWx0Owogc3RhdGljIGludCBjYW5fc2NhbGVfdm9sdGFnZTsKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByOworc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3g7CiBzdGF0aWMgdTMyIGFjcGlfcmVnc19hZGRyOwogc3RhdGljIHU4IGxvbmdoYXVsX2ZsYWdzOwogc3RhdGljIHVuc2lnbmVkIGludCBsb25naGF1bF9pbmRleDsKQEAgLTc4LDEyICs3OCwxMyBAQAogc3RhdGljIGludCBkaXNhYmxlX2FjcGlfYzM7CiBzdGF0aWMgaW50IHJldmlkX2VycmF0YTsKIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJsb25naGF1bCIsIG1zZykKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCBcCisJCSJsb25naGF1bCIsIG1zZykKIAogCiAvKiBDbG9jayByYXRpb3MgbXVsdGlwbGllZCBieSAxMCAqLwotc3RhdGljIGludCBjbG9ja19yYXRpb1szMl07Ci1zdGF0aWMgaW50IGVibGNyX3RhYmxlWzMyXTsKK3N0YXRpYyBpbnQgbXVsdHNbMzJdOworc3RhdGljIGludCBlYmxjclszMl07CiBzdGF0aWMgaW50IGxvbmdoYXVsX3ZlcnNpb247CiBzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpsb25naGF1bF90YWJsZTsKIApAQCAtOTMsNyArOTQsNyBAQAogc3RhdGljIGNoYXIgKnByaW50X3NwZWVkKGludCBzcGVlZCkKIHsKIAlpZiAoc3BlZWQgPCAxMDAwKSB7Ci0JCXNucHJpbnRmKHNwZWVkYnVmZmVyLCBzaXplb2Yoc3BlZWRidWZmZXIpLCIlZE1IeiIsIHNwZWVkKTsKKwkJc25wcmludGYoc3BlZWRidWZmZXIsIHNpemVvZihzcGVlZGJ1ZmZlciksICIlZE1IeiIsIHNwZWVkKTsKIAkJcmV0dXJuIHNwZWVkYnVmZmVyOwogCX0KIApAQCAtMTIyLDI3ICsxMjMsMjggQEAKIAogc3RhdGljIGludCBsb25naGF1bF9nZXRfY3B1X211bHQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGludmFsdWU9MCxsbywgaGk7CisJdW5zaWduZWQgbG9uZyBpbnZhbHVlID0gMCwgbG8sIGhpOwogCi0JcmRtc3IgKE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OLCBsbywgaGkpOwotCWludmFsdWUgPSAobG8gJiAoMTw8MjJ8MTw8MjN8MTw8MjR8MTw8MjUpKSA+PjIyOwotCWlmIChsb25naGF1bF92ZXJzaW9uPT1UWVBFX0xPTkdIQVVMX1YyIHx8IGxvbmdoYXVsX3ZlcnNpb249PVRZUEVfUE9XRVJTQVZFUikgeworCXJkbXNyKE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OLCBsbywgaGkpOworCWludmFsdWUgPSAobG8gJiAoMTw8MjJ8MTw8MjN8MTw8MjR8MTw8MjUpKT4+MjI7CisJaWYgKGxvbmdoYXVsX3ZlcnNpb24gPT0gVFlQRV9MT05HSEFVTF9WMiB8fAorCSAgICBsb25naGF1bF92ZXJzaW9uID09IFRZUEVfUE9XRVJTQVZFUikgewogCQlpZiAobG8gJiAoMTw8MjcpKQotCQkJaW52YWx1ZSs9MTY7CisJCQlpbnZhbHVlICs9IDE2OwogCX0KLQlyZXR1cm4gZWJsY3JfdGFibGVbaW52YWx1ZV07CisJcmV0dXJuIGVibGNyW2ludmFsdWVdOwogfQogCiAvKiBGb3IgcHJvY2Vzc29yIHdpdGggQkNSMiBNU1IgKi8KIAotc3RhdGljIHZvaWQgZG9fbG9uZ2hhdWwxKHVuc2lnbmVkIGludCBjbG9ja19yYXRpb19pbmRleCkKK3N0YXRpYyB2b2lkIGRvX2xvbmdoYXVsMSh1bnNpZ25lZCBpbnQgbXVsdHNfaW5kZXgpCiB7CiAJdW5pb24gbXNyX2JjcjIgYmNyMjsKIAogCXJkbXNybChNU1JfVklBX0JDUjIsIGJjcjIudmFsKTsKIAkvKiBFbmFibGUgc29mdHdhcmUgY2xvY2sgbXVsdGlwbGllciAqLwogCWJjcjIuYml0cy5FU09GVEJGID0gMTsKLQliY3IyLmJpdHMuQ0xPQ0tNVUwgPSBjbG9ja19yYXRpb19pbmRleCAmIDB4ZmY7CisJYmNyMi5iaXRzLkNMT0NLTVVMID0gbXVsdHNfaW5kZXggJiAweGZmOwogCiAJLyogU3luYyB0byB0aW1lciB0aWNrICovCiAJc2FmZV9oYWx0KCk7CkBAIC0xNjEsNyArMTYzLDcgQEAKIAogLyogRm9yIHByb2Nlc3NvciB3aXRoIExvbmdoYXVsIE1TUiAqLwogCi1zdGF0aWMgdm9pZCBkb19wb3dlcnNhdmVyKGludCBjeF9hZGRyZXNzLCB1bnNpZ25lZCBpbnQgY2xvY2tfcmF0aW9faW5kZXgsCitzdGF0aWMgdm9pZCBkb19wb3dlcnNhdmVyKGludCBjeF9hZGRyZXNzLCB1bnNpZ25lZCBpbnQgbXVsdHNfaW5kZXgsCiAJCQkgIHVuc2lnbmVkIGludCBkaXIpCiB7CiAJdW5pb24gbXNyX2xvbmdoYXVsIGxvbmdoYXVsOwpAQCAtMTczLDExICsxNzUsMTEgQEAKIAkJbG9uZ2hhdWwuYml0cy5SZXZpc2lvbktleSA9IGxvbmdoYXVsLmJpdHMuUmV2aXNpb25JRDsKIAllbHNlCiAJCWxvbmdoYXVsLmJpdHMuUmV2aXNpb25LZXkgPSAwOwotCWxvbmdoYXVsLmJpdHMuU29mdEJ1c1JhdGlvID0gY2xvY2tfcmF0aW9faW5kZXggJiAweGY7Ci0JbG9uZ2hhdWwuYml0cy5Tb2Z0QnVzUmF0aW80ID0gKGNsb2NrX3JhdGlvX2luZGV4ICYgMHgxMCkgPj4gNDsKKwlsb25naGF1bC5iaXRzLlNvZnRCdXNSYXRpbyA9IG11bHRzX2luZGV4ICYgMHhmOworCWxvbmdoYXVsLmJpdHMuU29mdEJ1c1JhdGlvNCA9IChtdWx0c19pbmRleCAmIDB4MTApID4+IDQ7CiAJLyogU2V0dXAgbmV3IHZvbHRhZ2UgKi8KIAlpZiAoY2FuX3NjYWxlX3ZvbHRhZ2UpCi0JCWxvbmdoYXVsLmJpdHMuU29mdFZJRCA9IChjbG9ja19yYXRpb19pbmRleCA+PiA4KSAmIDB4MWY7CisJCWxvbmdoYXVsLmJpdHMuU29mdFZJRCA9IChtdWx0c19pbmRleCA+PiA4KSAmIDB4MWY7CiAJLyogU3luYyB0byB0aW1lciB0aWNrICovCiAJc2FmZV9oYWx0KCk7CiAJLyogUmFpc2Ugdm9sdGFnZSBpZiBuZWNlc3NhcnkgKi8KQEAgLTI0MCwxNCArMjQyLDE0IEBACiAKIC8qKgogICogbG9uZ2hhdWxfc2V0X2NwdV9mcmVxdWVuY3koKQotICogQGNsb2NrX3JhdGlvX2luZGV4IDogYml0cGF0dGVybiBvZiB0aGUgbmV3IG11bHRpcGxpZXIuCisgKiBAbXVsdHNfaW5kZXggOiBiaXRwYXR0ZXJuIG9mIHRoZSBuZXcgbXVsdGlwbGllci4KICAqCiAgKiBTZXRzIGEgbmV3IGNsb2NrIHJhdGlvLgogICovCiAKIHN0YXRpYyB2b2lkIGxvbmdoYXVsX3NldHN0YXRlKHVuc2lnbmVkIGludCB0YWJsZV9pbmRleCkKIHsKLQl1bnNpZ25lZCBpbnQgY2xvY2tfcmF0aW9faW5kZXg7CisJdW5zaWduZWQgaW50IG11bHRzX2luZGV4OwogCWludCBzcGVlZCwgbXVsdDsKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjU2LDkgKzI1OCw5IEBACiAJdTMyIGJtX3RpbWVvdXQgPSAxMDAwOwogCXVuc2lnbmVkIGludCBkaXIgPSAwOwogCi0JY2xvY2tfcmF0aW9faW5kZXggPSBsb25naGF1bF90YWJsZVt0YWJsZV9pbmRleF0uaW5kZXg7CisJbXVsdHNfaW5kZXggPSBsb25naGF1bF90YWJsZVt0YWJsZV9pbmRleF0uaW5kZXg7CiAJLyogU2FmZXR5IHByZWNhdXRpb25zICovCi0JbXVsdCA9IGNsb2NrX3JhdGlvW2Nsb2NrX3JhdGlvX2luZGV4ICYgMHgxZl07CisJbXVsdCA9IG11bHRzW211bHRzX2luZGV4ICYgMHgxZl07CiAJaWYgKG11bHQgPT0gLTEpCiAJCXJldHVybjsKIAlzcGVlZCA9IGNhbGNfc3BlZWQobXVsdCk7CkBAIC0yNzQsNyArMjc2LDcgQEAKIAogCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CiAKLQlkcHJpbnRrICgiU2V0dGluZyB0byBGU0I6JWRNSHogTXVsdDolZC4lZHggKCVzKVxuIiwKKwlkcHJpbnRrKCJTZXR0aW5nIHRvIEZTQjolZE1IeiBNdWx0OiVkLiVkeCAoJXMpXG4iLAogCQkJZnNiLCBtdWx0LzEwLCBtdWx0JTEwLCBwcmludF9zcGVlZChzcGVlZC8xMDAwKSk7CiByZXRyeV9sb29wOgogCXByZWVtcHRfZGlzYWJsZSgpOwpAQCAtMjgyLDggKzI4NCw4IEBACiAKIAlwaWMyX21hc2sgPSBpbmIoMHhBMSk7CiAJcGljMV9tYXNrID0gaW5iKDB4MjEpOwkvKiB3b3JrcyBvbiBDMy4gc2F2ZSBtYXNrLiAqLwotCW91dGIoMHhGRiwweEExKTsJLyogT3ZlcmtpbGwgKi8KLQlvdXRiKDB4RkUsMHgyMSk7CS8qIFRNUjAgb25seSAqLworCW91dGIoMHhGRiwgMHhBMSk7CS8qIE92ZXJraWxsICovCisJb3V0YigweEZFLCAweDIxKTsJLyogVE1SMCBvbmx5ICovCiAKIAkvKiBXYWl0IHdoaWxlIFBDSSBidXMgaXMgYnVzeS4gKi8KIAlpZiAoYWNwaV9yZWdzX2FkZHIgJiYgKGxvbmdoYXVsX2ZsYWdzICYgVVNFX05PUlRIQlJJREdFCkBAIC0zMTIsNyArMzE0LDcgQEAKIAkgKiBTb2Z0d2FyZSBjb250cm9sbGVkIG11bHRpcGxpZXJzIG9ubHkuCiAJICovCiAJY2FzZSBUWVBFX0xPTkdIQVVMX1YxOgotCQlkb19sb25naGF1bDEoY2xvY2tfcmF0aW9faW5kZXgpOworCQlkb19sb25naGF1bDEobXVsdHNfaW5kZXgpOwogCQlicmVhazsKIAogCS8qCkBAIC0zMjcsOSArMzI5LDkgQEAKIAkJaWYgKGxvbmdoYXVsX2ZsYWdzICYgVVNFX0FDUElfQzMpIHsKIAkJCS8qIERvbid0IGFsbG93IHdha2V1cCAqLwogCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9STEQsIDApOwotCQkJZG9fcG93ZXJzYXZlcihjeC0+YWRkcmVzcywgY2xvY2tfcmF0aW9faW5kZXgsIGRpcik7CisJCQlkb19wb3dlcnNhdmVyKGN4LT5hZGRyZXNzLCBtdWx0c19pbmRleCwgZGlyKTsKIAkJfSBlbHNlIHsKLQkJCWRvX3Bvd2Vyc2F2ZXIoMCwgY2xvY2tfcmF0aW9faW5kZXgsIGRpcik7CisJCQlkb19wb3dlcnNhdmVyKDAsIG11bHRzX2luZGV4LCBkaXIpOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTM0MSw4ICszNDMsOCBAQAogCQkvKiBFbmFibGUgYnVzIG1hc3RlciBhcmJpdHJhdGlvbiAqLwogCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19BUkJfRElTQUJMRSwgMCk7CiAJfQotCW91dGIocGljMl9tYXNrLDB4QTEpOwkvKiByZXN0b3JlIG1hc2sgKi8KLQlvdXRiKHBpYzFfbWFzaywweDIxKTsKKwlvdXRiKHBpYzJfbWFzaywgMHhBMSk7CS8qIHJlc3RvcmUgbWFzayAqLworCW91dGIocGljMV9tYXNrLCAweDIxKTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwpAQCAtMzkyLDcgKzM5NCw4IEBACiAJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CiAKIAlpZiAoIWJtX3RpbWVvdXQpCi0JCXByaW50ayhLRVJOX0lORk8gUEZYICJXYXJuaW5nOiBUaW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGlkbGUgUENJIGJ1cy5cbiIpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiV2FybmluZzogVGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciAiCisJCQkJImlkbGUgUENJIGJ1cy5cbiIpOwogfQogCiAvKgpAQCAtNDU4LDMxICs0NjEsMzIgQEAKIAkJYnJlYWs7CiAJfQogCi0JZHByaW50ayAoIk1pbk11bHQ6JWQuJWR4IE1heE11bHQ6JWQuJWR4XG4iLAorCWRwcmludGsoIk1pbk11bHQ6JWQuJWR4IE1heE11bHQ6JWQuJWR4XG4iLAogCQkgbWlubXVsdC8xMCwgbWlubXVsdCUxMCwgbWF4bXVsdC8xMCwgbWF4bXVsdCUxMCk7CiAKIAloaWdoZXN0X3NwZWVkID0gY2FsY19zcGVlZChtYXhtdWx0KTsKIAlsb3dlc3Rfc3BlZWQgPSBjYWxjX3NwZWVkKG1pbm11bHQpOwotCWRwcmludGsgKCJGU0I6JWRNSHogIExvd2VzdCBzcGVlZDogJXMgICBIaWdoZXN0IHNwZWVkOiVzXG4iLCBmc2IsCisJZHByaW50aygiRlNCOiVkTUh6ICBMb3dlc3Qgc3BlZWQ6ICVzICAgSGlnaGVzdCBzcGVlZDolc1xuIiwgZnNiLAogCQkgcHJpbnRfc3BlZWQobG93ZXN0X3NwZWVkLzEwMDApLAogCQkgcHJpbnRfc3BlZWQoaGlnaGVzdF9zcGVlZC8xMDAwKSk7CiAKIAlpZiAobG93ZXN0X3NwZWVkID09IGhpZ2hlc3Rfc3BlZWQpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJoaWdoZXN0c3BlZWQgPT0gbG93ZXN0LCBhYm9ydGluZy5cbiIpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiaGlnaGVzdHNwZWVkID09IGxvd2VzdCwgYWJvcnRpbmcuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChsb3dlc3Rfc3BlZWQgPiBoaWdoZXN0X3NwZWVkKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAibm9uc2Vuc2UhIGxvd2VzdCAoJWQgPiAlZCkgIVxuIiwKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIm5vbnNlbnNlISBsb3dlc3QgKCVkID4gJWQpICFcbiIsCiAJCQlsb3dlc3Rfc3BlZWQsIGhpZ2hlc3Rfc3BlZWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlsb25naGF1bF90YWJsZSA9IGttYWxsb2MoKG51bXNjYWxlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSksIEdGUF9LRVJORUwpOwotCWlmKCFsb25naGF1bF90YWJsZSkKKwlsb25naGF1bF90YWJsZSA9IGttYWxsb2MoKG51bXNjYWxlcyArIDEpICogc2l6ZW9mKCpsb25naGF1bF90YWJsZSksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWxvbmdoYXVsX3RhYmxlKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWZvciAoaiA9IDA7IGogPCBudW1zY2FsZXM7IGorKykgewotCQlyYXRpbyA9IGNsb2NrX3JhdGlvW2pdOworCQlyYXRpbyA9IG11bHRzW2pdOwogCQlpZiAocmF0aW8gPT0gLTEpCiAJCQljb250aW51ZTsKIAkJaWYgKHJhdGlvID4gbWF4bXVsdCB8fCByYXRpbyA8IG1pbm11bHQpCkBAIC01MDcsMTMgKzUxMSwxMCBAQAogCQkJfQogCQl9CiAJCWlmIChtaW5faSAhPSBqKSB7Ci0JCQl1bnNpZ25lZCBpbnQgdGVtcDsKLQkJCXRlbXAgPSBsb25naGF1bF90YWJsZVtqXS5mcmVxdWVuY3k7Ci0JCQlsb25naGF1bF90YWJsZVtqXS5mcmVxdWVuY3kgPSBsb25naGF1bF90YWJsZVttaW5faV0uZnJlcXVlbmN5OwotCQkJbG9uZ2hhdWxfdGFibGVbbWluX2ldLmZyZXF1ZW5jeSA9IHRlbXA7Ci0JCQl0ZW1wID0gbG9uZ2hhdWxfdGFibGVbal0uaW5kZXg7Ci0JCQlsb25naGF1bF90YWJsZVtqXS5pbmRleCA9IGxvbmdoYXVsX3RhYmxlW21pbl9pXS5pbmRleDsKLQkJCWxvbmdoYXVsX3RhYmxlW21pbl9pXS5pbmRleCA9IHRlbXA7CisJCQlzd2FwKGxvbmdoYXVsX3RhYmxlW2pdLmZyZXF1ZW5jeSwKKwkJCSAgICAgbG9uZ2hhdWxfdGFibGVbbWluX2ldLmZyZXF1ZW5jeSk7CisJCQlzd2FwKGxvbmdoYXVsX3RhYmxlW2pdLmluZGV4LAorCQkJICAgICBsb25naGF1bF90YWJsZVttaW5faV0uaW5kZXgpOwogCQl9CiAJfQogCkBAIC01MjEsNyArNTIyLDcgQEAKIAogCS8qIEZpbmQgaW5kZXggd2UgYXJlIHJ1bm5pbmcgb24gKi8KIAlmb3IgKGogPSAwOyBqIDwgazsgaisrKSB7Ci0JCWlmIChjbG9ja19yYXRpb1tsb25naGF1bF90YWJsZVtqXS5pbmRleCAmIDB4MWZdID09IG11bHQpIHsKKwkJaWYgKG11bHRzW2xvbmdoYXVsX3RhYmxlW2pdLmluZGV4ICYgMHgxZl0gPT0gbXVsdCkgewogCQkJbG9uZ2hhdWxfaW5kZXggPSBqOwogCQkJYnJlYWs7CiAJCX0KQEAgLTU1OSwyMCArNTYwLDIyIEBACiAJbWF4dmlkID0gdnJtX21WX3RhYmxlW2xvbmdoYXVsLmJpdHMuTWF4aW11bVZJRF07CiAKIAlpZiAobWludmlkLm1WID09IDAgfHwgbWF4dmlkLm1WID09IDAgfHwgbWludmlkLm1WID4gbWF4dmlkLm1WKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQm9ndXMgdmFsdWVzIE1pbjolZC4lMDNkIE1heDolZC4lMDNkLiAiCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJCb2d1cyB2YWx1ZXMgTWluOiVkLiUwM2QgTWF4OiVkLiUwM2QuICIKIAkJCQkJIlZvbHRhZ2Ugc2NhbGluZyBkaXNhYmxlZC5cbiIsCi0JCQkJCW1pbnZpZC5tVi8xMDAwLCBtaW52aWQubVYlMTAwMCwgbWF4dmlkLm1WLzEwMDAsIG1heHZpZC5tViUxMDAwKTsKKwkJCQkJbWludmlkLm1WLzEwMDAsIG1pbnZpZC5tViUxMDAwLAorCQkJCQltYXh2aWQubVYvMTAwMCwgbWF4dmlkLm1WJTEwMDApOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKG1pbnZpZC5tViA9PSBtYXh2aWQubVYpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJDbGFpbXMgdG8gc3VwcG9ydCB2b2x0YWdlIHNjYWxpbmcgYnV0IG1pbiAmIG1heCBhcmUgIgotCQkJCSJib3RoICVkLiUwM2QuIFZvbHRhZ2Ugc2NhbGluZyBkaXNhYmxlZFxuIiwKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkNsYWltcyB0byBzdXBwb3J0IHZvbHRhZ2Ugc2NhbGluZyBidXQgIgorCQkJCSJtaW4gJiBtYXggYXJlIGJvdGggJWQuJTAzZC4gIgorCQkJCSJWb2x0YWdlIHNjYWxpbmcgZGlzYWJsZWRcbiIsCiAJCQkJbWF4dmlkLm1WLzEwMDAsIG1heHZpZC5tViUxMDAwKTsKIAkJcmV0dXJuOwogCX0KIAotCS8qIEhvdyBtYW55IHZvbHRhZ2Ugc3RlcHMgKi8KKwkvKiBIb3cgbWFueSB2b2x0YWdlIHN0ZXBzKi8KIAludW12c2NhbGVzID0gbWF4dmlkLnBvcyAtIG1pbnZpZC5wb3MgKyAxOwogCXByaW50ayhLRVJOX0lORk8gUEZYCiAJCSJNYXggVklEPSVkLiUwM2QgICIKQEAgLTU4Niw3ICs1ODksNyBAQAogCWogPSBsb25naGF1bC5iaXRzLk1pbk1IekJSOwogCWlmIChsb25naGF1bC5iaXRzLk1pbk1IekJSNCkKIAkJaiArPSAxNjsKLQltaW5fdmlkX3NwZWVkID0gZWJsY3JfdGFibGVbal07CisJbWluX3ZpZF9zcGVlZCA9IGVibGNyW2pdOwogCWlmIChtaW5fdmlkX3NwZWVkID09IC0xKQogCQlyZXR1cm47CiAJc3dpdGNoIChsb25naGF1bC5iaXRzLk1pbk1IekZTQikgewpAQCAtNjE3LDcgKzYyMCw4IEBACiAJCQlwb3MgPSBtaW52aWQucG9zOwogCQlsb25naGF1bF90YWJsZVtqXS5pbmRleCB8PSBtVl92cm1fdGFibGVbcG9zXSA8PCA4OwogCQl2aWQgPSB2cm1fbVZfdGFibGVbbVZfdnJtX3RhYmxlW3Bvc11dOwotCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZjogJWQga0h6LCBpbmRleDogJWQsIHZpZDogJWQgbVZcbiIsIHNwZWVkLCBqLCB2aWQubVYpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZjogJWQga0h6LCBpbmRleDogJWQsIHZpZDogJWQgbVZcbiIsCisJCQkJc3BlZWQsIGosIHZpZC5tVik7CiAJCWorKzsKIAl9CiAKQEAgLTY0MCw3ICs2NDQsOCBAQAogCXVuc2lnbmVkIGludCBkaXIgPSAwOwogCXU4IHZpZCwgY3VycmVudF92aWQ7CiAKLQlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgbG9uZ2hhdWxfdGFibGUsIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJnRhYmxlX2luZGV4KSkKKwlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgbG9uZ2hhdWxfdGFibGUsIHRhcmdldF9mcmVxLAorCQkJCXJlbGF0aW9uLCAmdGFibGVfaW5kZXgpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIERvbid0IHNldCBzYW1lIGZyZXF1ZW5jeSBhZ2FpbiAqLwpAQCAtNjU2LDcgKzY2MSw4IEBACiAJCSAqIHRoaXMgaW4gaGFyZHdhcmUsIEMzIGlzIG9sZCBhbmQgd2UgbmVlZCB0byBkbyB0aGlzCiAJCSAqIGluIHNvZnR3YXJlLiAqLwogCQlpID0gbG9uZ2hhdWxfaW5kZXg7Ci0JCWN1cnJlbnRfdmlkID0gKGxvbmdoYXVsX3RhYmxlW2xvbmdoYXVsX2luZGV4XS5pbmRleCA+PiA4KSAmIDB4MWY7CisJCWN1cnJlbnRfdmlkID0gKGxvbmdoYXVsX3RhYmxlW2xvbmdoYXVsX2luZGV4XS5pbmRleCA+PiA4KTsKKwkJY3VycmVudF92aWQgJj0gMHgxZjsKIAkJaWYgKHRhYmxlX2luZGV4ID4gbG9uZ2hhdWxfaW5kZXgpCiAJCQlkaXIgPSAxOwogCQl3aGlsZSAoaSAhPSB0YWJsZV9pbmRleCkgewpAQCAtNjkxLDkgKzY5Nyw5IEBACiB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkOwogCi0JaWYgKCBhY3BpX2J1c19nZXRfZGV2aWNlKG9ial9oYW5kbGUsICZkKSApIHsKKwlpZiAoYWNwaV9idXNfZ2V0X2RldmljZShvYmpfaGFuZGxlLCAmZCkpCiAJCXJldHVybiAwOwotCX0KKwogCSpyZXR1cm5fdmFsdWUgPSBhY3BpX2RyaXZlcl9kYXRhKGQpOwogCXJldHVybiAxOwogfQpAQCAtNzUwLDcgKzc1Niw3IEBACiAJLyogRmluZCBWVDgyMzUgc291dGhicmlkZ2UgKi8KIAlkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODIzNSwgTlVMTCk7CiAJaWYgKGRldiA9PSBOVUxMKQotCS8qIEZpbmQgVlQ4MjM3IHNvdXRoYnJpZGdlICovCisJCS8qIEZpbmQgVlQ4MjM3IHNvdXRoYnJpZGdlICovCiAJCWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklBLAogCQkJCSAgICAgUENJX0RFVklDRV9JRF9WSUFfODIzNywgTlVMTCk7CiAJaWYgKGRldiAhPSBOVUxMKSB7CkBAIC03NjksNyArNzc1LDggQEAKIAkJaWYgKHBjaV9jbWQgJiAxIDw8IDcpIHsKIAkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4ODgsICZhY3BpX3JlZ3NfYWRkcik7CiAJCQlhY3BpX3JlZ3NfYWRkciAmPSAweGZmMDA7Ci0JCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQUNQSSBJL08gYXQgMHgleFxuIiwgYWNwaV9yZWdzX2FkZHIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkFDUEkgSS9PIGF0IDB4JXhcbiIsCisJCQkJCWFjcGlfcmVnc19hZGRyKTsKIAkJfQogCiAJCXBjaV9kZXZfcHV0KGRldik7CkBAIC03ODEsNyArNzg4LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGxvbmdoYXVsX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YSgwKTsKLQljaGFyICpjcHVuYW1lPU5VTEw7CisJY2hhciAqY3B1bmFtZSA9IE5VTEw7CiAJaW50IHJldDsKIAl1MzIgbG8sIGhpOwogCkBAIC03OTEsOCArNzk4LDggQEAKIAkJY3B1X21vZGVsID0gQ1BVX1NBTVVFTDsKIAkJY3B1bmFtZSA9ICJDMyAnU2FtdWVsJyBbQzVBXSI7CiAJCWxvbmdoYXVsX3ZlcnNpb24gPSBUWVBFX0xPTkdIQVVMX1YxOwotCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBzYW11ZWwxX2Nsb2NrX3JhdGlvLCBzaXplb2Yoc2FtdWVsMV9jbG9ja19yYXRpbykpOwotCQltZW1jcHkgKGVibGNyX3RhYmxlLCBzYW11ZWwxX2VibGNyLCBzaXplb2Yoc2FtdWVsMV9lYmxjcikpOworCQltZW1jcHkobXVsdHMsIHNhbXVlbDFfbXVsdHMsIHNpemVvZihzYW11ZWwxX211bHRzKSk7CisJCW1lbWNweShlYmxjciwgc2FtdWVsMV9lYmxjciwgc2l6ZW9mKHNhbXVlbDFfZWJsY3IpKTsKIAkJYnJlYWs7CiAKIAljYXNlIDc6CkBAIC04MDMsMTAgKzgxMCw4IEBACiAJCQljcHVuYW1lID0gIkMzICdTYW11ZWwgMicgW0M1Ql0iOwogCQkJLyogTm90ZSwgdGhpcyBpcyBub3QgYSB0eXBvLCBlYXJseSBTYW11ZWwyJ3MgaGFkCiAJCQkgKiBTYW11ZWwxIHJhdGlvcy4gKi8KLQkJCW1lbWNweShjbG9ja19yYXRpbywgc2FtdWVsMV9jbG9ja19yYXRpbywKLQkJCQlzaXplb2Yoc2FtdWVsMV9jbG9ja19yYXRpbykpOwotCQkJbWVtY3B5KGVibGNyX3RhYmxlLCBzYW11ZWwyX2VibGNyLAotCQkJCXNpemVvZihzYW11ZWwyX2VibGNyKSk7CisJCQltZW1jcHkobXVsdHMsIHNhbXVlbDFfbXVsdHMsIHNpemVvZihzYW11ZWwxX211bHRzKSk7CisJCQltZW1jcHkoZWJsY3IsIHNhbXVlbDJfZWJsY3IsIHNpemVvZihzYW11ZWwyX2VibGNyKSk7CiAJCQlicmVhazsKIAkJY2FzZSAxIC4uLiAxNToKIAkJCWxvbmdoYXVsX3ZlcnNpb24gPSBUWVBFX0xPTkdIQVVMX1YxOwpAQCAtODE3LDEwICs4MjIsOCBAQAogCQkJCWNwdV9tb2RlbCA9IENQVV9FWlJBOwogCQkJCWNwdW5hbWUgPSAiQzMgJ0V6cmEnIFtDNUNdIjsKIAkJCX0KLQkJCW1lbWNweShjbG9ja19yYXRpbywgZXpyYV9jbG9ja19yYXRpbywKLQkJCQlzaXplb2YoZXpyYV9jbG9ja19yYXRpbykpOwotCQkJbWVtY3B5KGVibGNyX3RhYmxlLCBlenJhX2VibGNyLAotCQkJCXNpemVvZihlenJhX2VibGNyKSk7CisJCQltZW1jcHkobXVsdHMsIGV6cmFfbXVsdHMsIHNpemVvZihlenJhX211bHRzKSk7CisJCQltZW1jcHkoZWJsY3IsIGV6cmFfZWJsY3IsIHNpemVvZihlenJhX2VibGNyKSk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTgyOSwxOCArODMyLDE2IEBACiAJCWNwdV9tb2RlbCA9IENQVV9FWlJBX1Q7CiAJCWNwdW5hbWUgPSAiQzMgJ0V6cmEtVCcgW0M1TV0iOwogCQlsb25naGF1bF92ZXJzaW9uID0gVFlQRV9QT1dFUlNBVkVSOwotCQludW1zY2FsZXM9MzI7Ci0JCW1lbWNweSAoY2xvY2tfcmF0aW8sIGV6cmF0X2Nsb2NrX3JhdGlvLCBzaXplb2YoZXpyYXRfY2xvY2tfcmF0aW8pKTsKLQkJbWVtY3B5IChlYmxjcl90YWJsZSwgZXpyYXRfZWJsY3IsIHNpemVvZihlenJhdF9lYmxjcikpOworCQludW1zY2FsZXMgPSAzMjsKKwkJbWVtY3B5KG11bHRzLCBlenJhdF9tdWx0cywgc2l6ZW9mKGV6cmF0X211bHRzKSk7CisJCW1lbWNweShlYmxjciwgZXpyYXRfZWJsY3IsIHNpemVvZihlenJhdF9lYmxjcikpOwogCQlicmVhazsKIAogCWNhc2UgOToKIAkJbG9uZ2hhdWxfdmVyc2lvbiA9IFRZUEVfUE9XRVJTQVZFUjsKIAkJbnVtc2NhbGVzID0gMzI7Ci0JCW1lbWNweShjbG9ja19yYXRpbywKLQkJICAgICAgIG5laGVtaWFoX2Nsb2NrX3JhdGlvLAotCQkgICAgICAgc2l6ZW9mKG5laGVtaWFoX2Nsb2NrX3JhdGlvKSk7Ci0JCW1lbWNweShlYmxjcl90YWJsZSwgbmVoZW1pYWhfZWJsY3IsIHNpemVvZihuZWhlbWlhaF9lYmxjcikpOworCQltZW1jcHkobXVsdHMsIG5laGVtaWFoX211bHRzLCBzaXplb2YobmVoZW1pYWhfbXVsdHMpKTsKKwkJbWVtY3B5KGVibGNyLCBuZWhlbWlhaF9lYmxjciwgc2l6ZW9mKG5laGVtaWFoX2VibGNyKSk7CiAJCXN3aXRjaCAoYy0+eDg2X21hc2spIHsKIAkJY2FzZSAwIC4uLiAxOgogCQkJY3B1X21vZGVsID0gQ1BVX05FSEVNSUFIOwpAQCAtODY5LDE0ICs4NzAsMTQgQEAKIAkJCWxvbmdoYXVsX3ZlcnNpb24gPSBUWVBFX0xPTkdIQVVMX1YxOwogCX0KIAotCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVklBICVzIENQVSBkZXRlY3RlZC4gICIsIGNwdW5hbWUpOworCXByaW50ayhLRVJOX0lORk8gUEZYICJWSUEgJXMgQ1BVIGRldGVjdGVkLiAgIiwgY3B1bmFtZSk7CiAJc3dpdGNoIChsb25naGF1bF92ZXJzaW9uKSB7CiAJY2FzZSBUWVBFX0xPTkdIQVVMX1YxOgogCWNhc2UgVFlQRV9MT05HSEFVTF9WMjoKLQkJcHJpbnRrICgiTG9uZ2hhdWwgdiVkIHN1cHBvcnRlZC5cbiIsIGxvbmdoYXVsX3ZlcnNpb24pOworCQlwcmludGsoS0VSTl9DT05UICJMb25naGF1bCB2JWQgc3VwcG9ydGVkLlxuIiwgbG9uZ2hhdWxfdmVyc2lvbik7CiAJCWJyZWFrOwogCWNhc2UgVFlQRV9QT1dFUlNBVkVSOgotCQlwcmludGsgKCJQb3dlcnNhdmVyIHN1cHBvcnRlZC5cbiIpOworCQlwcmludGsoS0VSTl9DT05UICJQb3dlcnNhdmVyIHN1cHBvcnRlZC5cbiIpOwogCQlicmVhazsKIAl9OwogCkBAIC05NDAsNyArOTQxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIGxvbmdoYXVsX2F0dHJbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyICpsb25naGF1bF9hdHRyW10gPSB7CiAJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAogCU5VTEwsCiB9OwpAQCAtOTY2LDEzICs5NjcsMTUgQEAKIAogI2lmZGVmIENPTkZJR19TTVAKIAlpZiAobnVtX29ubGluZV9jcHVzKCkgPiAxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIk1vcmUgdGhhbiAxIENQVSBkZXRlY3RlZCwgbG9uZ2hhdWwgZGlzYWJsZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTW9yZSB0aGFuIDEgQ1BVIGRldGVjdGVkLCAiCisJCQkJImxvbmdoYXVsIGRpc2FibGVkLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KICNlbmRpZgogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCWlmIChjcHVfaGFzX2FwaWMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQVBJQyBkZXRlY3RlZC4gTG9uZ2hhdWwgaXMgY3VycmVudGx5IGJyb2tlbiBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQVBJQyBkZXRlY3RlZC4gTG9uZ2hhdWwgaXMgY3VycmVudGx5ICIKKwkJCQkiYnJva2VuIGluIHRoaXMgY29uZmlndXJhdGlvbi5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAjZW5kaWYKQEAgLTk5Myw4ICs5OTYsOCBAQAogewogCWludCBpOwogCi0JZm9yIChpPTA7IGkgPCBudW1zY2FsZXM7IGkrKykgewotCQlpZiAoY2xvY2tfcmF0aW9baV0gPT0gbWF4bXVsdCkgeworCWZvciAoaSA9IDA7IGkgPCBudW1zY2FsZXM7IGkrKykgeworCQlpZiAobXVsdHNbaV0gPT0gbWF4bXVsdCkgewogCQkJbG9uZ2hhdWxfc2V0c3RhdGUoaSk7CiAJCQlicmVhazsKIAkJfQpAQCAtMTAwNywxMSArMTAxMCwxMSBAQAogLyogRXZlbiBpZiBCSU9TIGlzIGV4cG9ydGluZyBBQ1BJIEMzIHN0YXRlLCBhbmQgaXQgaXMgdXNlZAogICogd2l0aCBzdWNjZXNzIHdoZW4gQ1BVIGlzIGlkbGUsIHRoaXMgc3RhdGUgZG9lc24ndAogICogdHJpZ2dlciBmcmVxdWVuY3kgdHJhbnNpdGlvbiBpbiBzb21lIGNhc2VzLiAqLwotbW9kdWxlX3BhcmFtIChkaXNhYmxlX2FjcGlfYzMsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oZGlzYWJsZV9hY3BpX2MzLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2FjcGlfYzMsICJEb24ndCB1c2UgQUNQSSBDMyBzdXBwb3J0Iik7CiAvKiBDaGFuZ2UgQ1BVIHZvbHRhZ2Ugd2l0aCBmcmVxdWVuY3kuIFZlcnkgdXNlZnVsbCB0byBzYXZlCiAgKiBwb3dlciwgYnV0IG1vc3QgVklBIEMzIHByb2Nlc3NvcnMgYXJlbid0IHN1cHBvcnRpbmcgaXQuICovCi1tb2R1bGVfcGFyYW0gKHNjYWxlX3ZvbHRhZ2UsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oc2NhbGVfdm9sdGFnZSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc2NhbGVfdm9sdGFnZSwgIlNjYWxlIHZvbHRhZ2Ugb2YgcHJvY2Vzc29yIik7CiAvKiBGb3JjZSByZXZpc2lvbiBrZXkgdG8gMCBmb3IgcHJvY2Vzc29ycyB3aGljaCBkb2Vzbid0CiAgKiBzdXBwb3J0IHZvbHRhZ2Ugc2NhbGluZywgYnV0IGFyZSBpbnRyb2R1Y2luZyBpdHNlbGYgYXMKQEAgLTEwMTksOSArMTAyMiw5IEBACiBtb2R1bGVfcGFyYW0ocmV2aWRfZXJyYXRhLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhyZXZpZF9lcnJhdGEsICJJZ25vcmUgQ1BVIFJldmlzaW9uIElEIik7CiAKLU1PRFVMRV9BVVRIT1IgKCJEYXZlIEpvbmVzIDxkYXZlakByZWRoYXQuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OICgiTG9uZ2hhdWwgZHJpdmVyIGZvciBWSUEgQ3lyaXggcHJvY2Vzc29ycy4iKTsKLU1PRFVMRV9MSUNFTlNFICgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJEYXZlIEpvbmVzIDxkYXZlakByZWRoYXQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMb25naGF1bCBkcml2ZXIgZm9yIFZJQSBDeXJpeCBwcm9jZXNzb3JzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBsYXRlX2luaXRjYWxsKGxvbmdoYXVsX2luaXQpOwogbW9kdWxlX2V4aXQobG9uZ2hhdWxfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5oCmluZGV4IDRmY2MzMjAuLmUyMzYwYTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5oCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5oCkBAIC00OSwxNCArNDksMTQgQEAKIAogLyoKICAqIENsb2NrIHJhdGlvIHRhYmxlcy4gRGl2L01vZCBieSAxMCB0byBnZXQgcmF0aW8uCi0gKiBUaGUgZWJsY3Igb25lcyBzcGVjaWZ5IHRoZSByYXRpbyByZWFkIGZyb20gdGhlIENQVS4KLSAqIFRoZSBjbG9ja19yYXRpbyBvbmVzIHNwZWNpZnkgd2hhdCB0byB3cml0ZSB0byB0aGUgQ1BVLgorICogVGhlIGVibGNyIHZhbHVlcyBzcGVjaWZ5IHRoZSByYXRpbyByZWFkIGZyb20gdGhlIENQVS4KKyAqIFRoZSBtdWx0cyB2YWx1ZXMgc3BlY2lmeSB3aGF0IHRvIHdyaXRlIHRvIHRoZSBDUFUuCiAgKi8KIAogLyoKICAqIFZJQSBDMyBTYW11ZWwgMSAgJiBTYW11ZWwgMiAoc3RlcHBpbmcgMCkKICAqLwotc3RhdGljIGNvbnN0IGludCBfX2luaXRkYXRhIHNhbXVlbDFfY2xvY2tfcmF0aW9bMTZdID0geworc3RhdGljIGNvbnN0IGludCBfX2luaXRkYXRhIHNhbXVlbDFfbXVsdHNbMTZdID0gewogCS0xLCAvKiAwMDAwIC0+IFJFU0VSVkVEICovCiAJMzAsIC8qIDAwMDEgLT4gIDMuMHggKi8KIAk0MCwgLyogMDAxMCAtPiAgNC4weCAqLwpAQCAtMTE5LDcgKzExOSw3IEBACiAvKgogICogVklBIEMzIEV6cmEKICAqLwotc3RhdGljIGNvbnN0IGludCBfX2luaXRkYXRhIGV6cmFfY2xvY2tfcmF0aW9bMTZdID0geworc3RhdGljIGNvbnN0IGludCBfX2luaXRkYXRhIGV6cmFfbXVsdHNbMTZdID0gewogCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLwogCTMwLCAgLyogMDAwMSAtPiAgMy4weCAqLwogCTQwLCAgLyogMDAxMCAtPiAgNC4weCAqLwpAQCAtMTYwLDcgKzE2MCw3IEBACiAvKgogICogVklBIEMzIChFenJhLVQpIFtDNU1dLgogICovCi1zdGF0aWMgY29uc3QgaW50IF9faW5pdGRhdGEgZXpyYXRfY2xvY2tfcmF0aW9bMzJdID0geworc3RhdGljIGNvbnN0IGludCBfX2luaXRkYXRhIGV6cmF0X211bHRzWzMyXSA9IHsKIAkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KIAkzMCwgIC8qIDAwMDEgLT4gIDMuMHggKi8KIAk0MCwgIC8qIDAwMTAgLT4gIDQuMHggKi8KQEAgLTIzNSw3ICsyMzUsNyBAQAogLyoKICAqIFZJQSBDMyBOZWhlbWlhaCAqLwogCi1zdGF0aWMgY29uc3QgaW50IF9faW5pdGRhdGEgIG5laGVtaWFoX2Nsb2NrX3JhdGlvWzMyXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgX19pbml0ZGF0YSAgbmVoZW1pYWhfbXVsdHNbMzJdID0gewogCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLwogCS0xLCAvKiAwMDAxIC0+IDE2LjB4ICovCiAJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ3J1bi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdydW4uYwppbmRleCA3NzdhN2ZmLi5kYTVmNzBmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ3J1bi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25ncnVuLmMKQEAgLTExLDEyICsxMSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAKICNpbmNsdWRlIDxhc20vbXNyLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS90aW1leC5oPgogCi0jZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgImxvbmdydW4iLCBtc2cpCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgXAorCQkibG9uZ3J1biIsIG1zZykKIAogc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlcglsb25ncnVuX2RyaXZlcjsKIApAQCAtNTEsNyArNTIsNyBAQAogCW1zcl9sbyAmPSAweDAwMDAwMDdGOwogCW1zcl9oaSAmPSAweDAwMDAwMDdGOwogCi0JaWYgKCBsb25ncnVuX2hpZ2hfZnJlcSA8PSBsb25ncnVuX2xvd19mcmVxICkgeworCWlmIChsb25ncnVuX2hpZ2hfZnJlcSA8PSBsb25ncnVuX2xvd19mcmVxKSB7CiAJCS8qIEFzc3VtZSBkZWdlbmVyYXRlIExvbmdydW4gdGFibGUgKi8KIAkJcG9saWN5LT5taW4gPSBwb2xpY3ktPm1heCA9IGxvbmdydW5faGlnaF9mcmVxOwogCX0gZWxzZSB7CkBAIC03OSw3ICs4MCw3IEBACiAJaWYgKCFwb2xpY3kpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCBsb25ncnVuX2hpZ2hfZnJlcSA8PSBsb25ncnVuX2xvd19mcmVxICkgeworCWlmIChsb25ncnVuX2hpZ2hfZnJlcSA8PSBsb25ncnVuX2xvd19mcmVxKSB7CiAJCS8qIEFzc3VtZSBkZWdlbmVyYXRlIExvbmdydW4gdGFibGUgKi8KIAkJcGN0Z19sbyA9IHBjdGdfaGkgPSAxMDA7CiAJfSBlbHNlIHsKQEAgLTE1Miw3ICsxNTMsNyBAQAogCWNwdWlkKDB4ODA4NjAwMDcsICZlYXgsICZlYngsICZlY3gsICZlZHgpOwogCWRwcmludGsoImNwdWlkIGVheCBpcyAldVxuIiwgZWF4KTsKIAotCXJldHVybiAoZWF4ICogMTAwMCk7CisJcmV0dXJuIGVheCAqIDEwMDA7CiB9CiAKIC8qKgpAQCAtMTk2LDcgKzE5Nyw4IEBACiAJCXJkbXNyKE1TUl9UTVRBX0xSVElfVk9MVF9NSFosIG1zcl9sbywgbXNyX2hpKTsKIAkJKmhpZ2hfZnJlcSA9IG1zcl9sbyAqIDEwMDA7IC8qIHRvIGtIeiAqLwogCi0JCWRwcmludGsoImxvbmdydW4gdGFibGUgaW50ZXJmYWNlIHRvbGQgJXUgLSAldSBrSHpcbiIsICpsb3dfZnJlcSwgKmhpZ2hfZnJlcSk7CisJCWRwcmludGsoImxvbmdydW4gdGFibGUgaW50ZXJmYWNlIHRvbGQgJXUgLSAldSBrSHpcbiIsCisJCQkJKmxvd19mcmVxLCAqaGlnaF9mcmVxKTsKIAogCQlpZiAoKmxvd19mcmVxID4gKmhpZ2hfZnJlcSkKIAkJCSpsb3dfZnJlcSA9ICpoaWdoX2ZyZXE7CkBAIC0yMTksNyArMjIxLDcgQEAKIAljcHVpZCgweDgwODYwMDA3LCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKIAkvKiB0cnkgZGVjcmVhc2luZyBpbiAxMCUgc3RlcHMsIHNvbWUgcHJvY2Vzc29ycyByZWFjdCBvbmx5CiAJICogb24gc29tZSBiYXJyaWVyIHZhbHVlcyAqLwotCWZvciAodHJ5X2hpID0gODA7IHRyeV9oaSA+IDAgJiYgZWN4ID4gOTA7IHRyeV9oaSAtPTEwKSB7CisJZm9yICh0cnlfaGkgPSA4MDsgdHJ5X2hpID4gMCAmJiBlY3ggPiA5MDsgdHJ5X2hpIC09IDEwKSB7CiAJCS8qIHNldCB0byAwIHRvIHRyeV9oaSBwZXJmX3BjdGcgKi8KIAkJbXNyX2xvICY9IDB4RkZGRkZGODA7CiAJCW1zcl9oaSAmPSAweEZGRkZGRjgwOwpAQCAtMjM2LDcgKzIzOCw3IEBACiAKIAkvKiBwZXJmb3JtYW5jZV9wY3RnID0gKGN1cnJlbnRfZnJlcSAtIGxvd19mcmVxKS8oaGlnaF9mcmVxIC0gbG93X2ZyZXEpCiAJICogZXFhbHMKLQkgKiBsb3dfZnJlcSAqICggMSAtIHBlcmZfcGN0ZykgPSAoY3VyX2ZyZXEgLSBoaWdoX2ZyZXEgKiBwZXJmX3BjdGcpCisJICogbG93X2ZyZXEgKiAoMSAtIHBlcmZfcGN0ZykgPSAoY3VyX2ZyZXEgLSBoaWdoX2ZyZXEgKiBwZXJmX3BjdGcpCiAJICoKIAkgKiBoaWdoX2ZyZXEgKiBwZXJmX3BjdGcgaXMgc3RvcmVkIHRlbXBvYXJpbHkgaW50byAiZWJ4Ii4KIAkgKi8KQEAgLTMxNyw5ICszMTksMTAgQEAKIH0KIAogCi1NT0RVTEVfQVVUSE9SICgiRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OICgiTG9uZ1J1biBkcml2ZXIgZm9yIFRyYW5zbWV0YSBDcnVzb2UgYW5kIEVmZmljZW9uIHByb2Nlc3NvcnMuIik7Ci1NT0RVTEVfTElDRU5TRSAoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMb25nUnVuIGRyaXZlciBmb3IgVHJhbnNtZXRhIENydXNvZSBhbmQgIgorCQkiRWZmaWNlb24gcHJvY2Vzc29ycy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogbW9kdWxlX2luaXQobG9uZ3J1bl9pbml0KTsKIG1vZHVsZV9leGl0KGxvbmdydW5fZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcDQtY2xvY2ttb2QuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jCmluZGV4IDMxNzhjM2EuLjQxZWQ5NDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jCkBAIC0yNywxNSArMjcsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9tc3IuaD4KLSNpbmNsdWRlIDxhc20vdGltZXguaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KIAogI2luY2x1ZGUgInNwZWVkc3RlcC1saWIuaCIKIAogI2RlZmluZSBQRlgJInA0LWNsb2NrbW9kOiAiCi0jZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgInA0LWNsb2NrbW9kIiwgbXNnKQorI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsIFwKKwkJInA0LWNsb2NrbW9kIiwgbXNnKQogCiAvKgogICogRHV0eSBDeWNsZSAoM2JpdHMpLCBub3RlIERDX0RJU0FCTEUgaXMgbm90IHNwZWNpZmllZCBpbgpAQCAtNTgsNyArNjAsOCBAQAogewogCXUzMiBsLCBoOwogCi0JaWYgKCFjcHVfb25saW5lKGNwdSkgfHwgKG5ld3N0YXRlID4gRENfRElTQUJMRSkgfHwgKG5ld3N0YXRlID09IERDX1JFU1YpKQorCWlmICghY3B1X29ubGluZShjcHUpIHx8CisJICAgIChuZXdzdGF0ZSA+IERDX0RJU0FCTEUpIHx8IChuZXdzdGF0ZSA9PSBEQ19SRVNWKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZG1zcl9vbl9jcHUoY3B1LCBNU1JfSUEzMl9USEVSTV9TVEFUVVMsICZsLCAmaCk7CkBAIC02Niw3ICs2OSw4IEBACiAJaWYgKGwgJiAweDAxKQogCQlkcHJpbnRrKCJDUFUjJWQgY3VycmVudGx5IHRoZXJtYWwgdGhyb3R0bGVkXG4iLCBjcHUpOwogCi0JaWYgKGhhc19ONDRfTzE3X2VycmF0YVtjcHVdICYmIChuZXdzdGF0ZSA9PSBEQ18yNVBUIHx8IG5ld3N0YXRlID09IERDX0RGTFQpKQorCWlmIChoYXNfTjQ0X08xN19lcnJhdGFbY3B1XSAmJgorCSAgICAobmV3c3RhdGUgPT0gRENfMjVQVCB8fCBuZXdzdGF0ZSA9PSBEQ19ERkxUKSkKIAkJbmV3c3RhdGUgPSBEQ18zOFBUOwogCiAJcmRtc3Jfb25fY3B1KGNwdSwgTVNSX0lBMzJfVEhFUk1fQ09OVFJPTCwgJmwsICZoKTsKQEAgLTExMiw3ICsxMTYsOCBAQAogCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOwogCWludCBpOwogCi0JaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksICZwNGNsb2NrbW9kX3RhYmxlWzBdLCB0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZuZXdzdGF0ZSkpCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksICZwNGNsb2NrbW9kX3RhYmxlWzBdLAorCQkJCXRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmcmVxcy5vbGQgPSBjcHVmcmVxX3A0X2dldChwb2xpY3ktPmNwdSk7CkBAIC0xMjcsNyArMTMyLDggQEAKIAkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKIAl9CiAKLQkvKiBydW4gb24gZWFjaCBsb2dpY2FsIENQVSwgc2VlIHNlY3Rpb24gMTMuMTUuMyBvZiBJQTMyIEludGVsIEFyY2hpdGVjdHVyZSBTb2Z0d2FyZQorCS8qIHJ1biBvbiBlYWNoIGxvZ2ljYWwgQ1BVLAorCSAqIHNlZSBzZWN0aW9uIDEzLjE1LjMgb2YgSUEzMiBJbnRlbCBBcmNoaXRlY3R1cmUgU29mdHdhcmUKIAkgKiBEZXZlbG9wZXIncyBNYW51YWwsIFZvbHVtZSAzCiAJICovCiAJZm9yX2VhY2hfY3B1KGksIHBvbGljeS0+Y3B1cykKQEAgLTE1MywyOCArMTU5LDMwIEBACiB7CiAJaWYgKGMtPng4NiA9PSAweDA2KSB7CiAJCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0VTVCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiV2FybmluZzogRVNULWNhcGFibGUgQ1BVIGRldGVjdGVkLiAiCi0JCQkgICAgICAgIlRoZSBhY3BpLWNwdWZyZXEgbW9kdWxlIG9mZmVycyB2b2x0YWdlIHNjYWxpbmciCi0JCQkgICAgICAgIiBpbiBhZGRpdGlvbiBvZiBmcmVxdWVuY3kgc2NhbGluZy4gWW91IHNob3VsZCB1c2UgIgotCQkJICAgICAgICJ0aGF0IGluc3RlYWQgb2YgcDQtY2xvY2ttb2QsIGlmIHBvc3NpYmxlLlxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiV2FybmluZzogRVNULWNhcGFibGUgQ1BVICIKKwkJCSAgICAgICAiZGV0ZWN0ZWQuIFRoZSBhY3BpLWNwdWZyZXEgbW9kdWxlIG9mZmVycyAiCisJCQkgICAgICAgInZvbHRhZ2Ugc2NhbGluZyBpbiBhZGRpdGlvbiBvZiBmcmVxdWVuY3kgIgorCQkJICAgICAgICJzY2FsaW5nLiBZb3Ugc2hvdWxkIHVzZSB0aGF0IGluc3RlYWQgb2YgIgorCQkJICAgICAgICJwNC1jbG9ja21vZCwgaWYgcG9zc2libGUuXG4iKTsKIAkJc3dpdGNoIChjLT54ODZfbW9kZWwpIHsKIAkJY2FzZSAweDBFOiAvKiBDb3JlICovCiAJCWNhc2UgMHgwRjogLyogQ29yZSBEdW8gKi8KIAkJY2FzZSAweDE2OiAvKiBDZWxlcm9uIENvcmUgKi8KIAkJCXA0Y2xvY2ttb2RfZHJpdmVyLmZsYWdzIHw9IENQVUZSRVFfQ09OU1RfTE9PUFM7Ci0JCQlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KFNQRUVEU1RFUF9QUk9DRVNTT1JfUENPUkUpOworCQkJcmV0dXJuIHNwZWVkc3RlcF9nZXRfZnJlcXVlbmN5KFNQRUVEU1RFUF9DUFVfUENPUkUpOwogCQljYXNlIDB4MEQ6IC8qIFBlbnRpdW0gTSAoRG90aGFuKSAqLwogCQkJcDRjbG9ja21vZF9kcml2ZXIuZmxhZ3MgfD0gQ1BVRlJFUV9DT05TVF9MT09QUzsKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIDB4MDk6IC8qIFBlbnRpdW0gTSAoQmFuaWFzKSAqLwotCQkJcmV0dXJuIHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShTUEVFRFNURVBfUFJPQ0VTU09SX1BNKTsKKwkJCXJldHVybiBzcGVlZHN0ZXBfZ2V0X2ZyZXF1ZW5jeShTUEVFRFNURVBfQ1BVX1BNKTsKIAkJfQogCX0KIAogCWlmIChjLT54ODYgIT0gMHhGKSB7CiAJCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9FU1QpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVua25vd24gcDQtY2xvY2ttb2QtY2FwYWJsZSBDUFUuICIKLQkJCQkiUGxlYXNlIHNlbmQgYW4gZS1tYWlsIHRvIDxjcHVmcmVxQHZnZXIua2VybmVsLm9yZz5cbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVua25vd24gQ1BVLiAiCisJCQkJIlBsZWFzZSBzZW5kIGFuIGUtbWFpbCB0byAiCisJCQkJIjxjcHVmcmVxQHZnZXIua2VybmVsLm9yZz5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE4MiwxNiArMTkwLDE2IEBACiAJICogdGhyb3R0bGluZyBpcyBhY3RpdmUgb3Igbm90LiAqLwogCXA0Y2xvY2ttb2RfZHJpdmVyLmZsYWdzIHw9IENQVUZSRVFfQ09OU1RfTE9PUFM7CiAKLQlpZiAoc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IoKSA9PSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0TSkgeworCWlmIChzcGVlZHN0ZXBfZGV0ZWN0X3Byb2Nlc3NvcigpID09IFNQRUVEU1RFUF9DUFVfUDRNKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJXYXJuaW5nOiBQZW50aXVtIDQtTSBkZXRlY3RlZC4gIgogCQkgICAgICAgIlRoZSBzcGVlZHN0ZXAtaWNoIG9yIGFjcGkgY3B1ZnJlcSBtb2R1bGVzIG9mZmVyICIKIAkJICAgICAgICJ2b2x0YWdlIHNjYWxpbmcgaW4gYWRkaXRpb24gb2YgZnJlcXVlbmN5IHNjYWxpbmcuICIKIAkJICAgICAgICJZb3Ugc2hvdWxkIHVzZSBlaXRoZXIgb25lIGluc3RlYWQgb2YgcDQtY2xvY2ttb2QsICIKIAkJICAgICAgICJpZiBwb3NzaWJsZS5cbiIpOwotCQlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KFNQRUVEU1RFUF9QUk9DRVNTT1JfUDRNKTsKKwkJcmV0dXJuIHNwZWVkc3RlcF9nZXRfZnJlcXVlbmN5KFNQRUVEU1RFUF9DUFVfUDRNKTsKIAl9CiAKLQlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KFNQRUVEU1RFUF9QUk9DRVNTT1JfUDREKTsKKwlyZXR1cm4gc3BlZWRzdGVwX2dldF9mcmVxdWVuY3koU1BFRURTVEVQX0NQVV9QNEQpOwogfQogCiAKQEAgLTIxNywxNCArMjI1LDIwIEBACiAJCWRwcmludGsoImhhcyBlcnJhdGEgLS0gZGlzYWJsaW5nIGxvdyBmcmVxdWVuY2llc1xuIik7CiAJfQogCisJaWYgKHNwZWVkc3RlcF9kZXRlY3RfcHJvY2Vzc29yKCkgPT0gU1BFRURTVEVQX0NQVV9QNEQgJiYKKwkgICAgYy0+eDg2X21vZGVsIDwgMikgeworCQkvKiBzd2l0Y2ggdG8gbWF4aW11bSBmcmVxdWVuY3kgYW5kIG1lYXN1cmUgcmVzdWx0ICovCisJCWNwdWZyZXFfcDRfc2V0ZGMocG9saWN5LT5jcHUsIERDX0RJU0FCTEUpOworCQlyZWNhbGlicmF0ZV9jcHVfa2h6KCk7CisJfQogCS8qIGdldCBtYXggZnJlcXVlbmN5ICovCiAJc3RvY2tfZnJlcSA9IGNwdWZyZXFfcDRfZ2V0X2ZyZXF1ZW5jeShjKTsKIAlpZiAoIXN0b2NrX2ZyZXEpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogdGFibGUgaW5pdCAqLwotCWZvciAoaT0xOyAocDRjbG9ja21vZF90YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQpOyBpKyspIHsKLQkJaWYgKChpPDIpICYmIChoYXNfTjQ0X08xN19lcnJhdGFbcG9saWN5LT5jcHVdKSkKKwlmb3IgKGkgPSAxOyAocDRjbG9ja21vZF90YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQpOyBpKyspIHsKKwkJaWYgKChpIDwgMikgJiYgKGhhc19ONDRfTzE3X2VycmF0YVtwb2xpY3ktPmNwdV0pKQogCQkJcDRjbG9ja21vZF90YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CiAJCWVsc2UKIAkJCXA0Y2xvY2ttb2RfdGFibGVbaV0uZnJlcXVlbmN5ID0gKHN0b2NrX2ZyZXEgKiBpKS84OwpAQCAtMjMyLDcgKzI0NiwxMCBAQAogCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKHA0Y2xvY2ttb2RfdGFibGUsIHBvbGljeS0+Y3B1KTsKIAogCS8qIGNwdWluZm8gYW5kIGRlZmF1bHQgcG9saWN5IHZhbHVlcyAqLwotCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAxMDAwMDAwOyAvKiBhc3N1bWVkICovCisKKwkvKiB0aGUgdHJhbnNpdGlvbiBsYXRlbmN5IGlzIHNldCB0byBiZSAxIGhpZ2hlciB0aGFuIHRoZSBtYXhpbXVtCisJICogdHJhbnNpdGlvbiBsYXRlbmN5IG9mIHRoZSBvbmRlbWFuZCBnb3Zlcm5vciAqLworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAxMDAwMDAwMTsKIAlwb2xpY3ktPmN1ciA9IHN0b2NrX2ZyZXE7CiAKIAlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksICZwNGNsb2NrbW9kX3RhYmxlWzBdKTsKQEAgLTI1OCwxMiArMjc1LDEyIEBACiAJCWwgPSBEQ19ESVNBQkxFOwogCiAJaWYgKGwgIT0gRENfRElTQUJMRSkKLQkJcmV0dXJuIChzdG9ja19mcmVxICogbCAvIDgpOworCQlyZXR1cm4gc3RvY2tfZnJlcSAqIGwgLyA4OwogCiAJcmV0dXJuIHN0b2NrX2ZyZXE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBwNGNsb2NrbW9kX2F0dHJbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyICpwNGNsb2NrbW9kX2F0dHJbXSA9IHsKIAkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCiAJTlVMTCwKIH07CkBAIC0yOTgsOSArMzE1LDEwIEBACiAKIAlyZXQgPSBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmcDRjbG9ja21vZF9kcml2ZXIpOwogCWlmICghcmV0KQotCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUDQvWGVvbihUTSkgQ1BVIE9uLURlbWFuZCBDbG9jayBNb2R1bGF0aW9uIGF2YWlsYWJsZVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJQNC9YZW9uKFRNKSBDUFUgT24tRGVtYW5kIENsb2NrICIKKwkJCQkiTW9kdWxhdGlvbiBhdmFpbGFibGVcbiIpOwogCi0JcmV0dXJuIChyZXQpOworCXJldHVybiByZXQ7CiB9CiAKIApAQCAtMzEwLDkgKzMyOCw5IEBACiB9CiAKIAotTU9EVUxFX0FVVEhPUiAoIlp3YW5lIE13YWlrYW1ibyA8endhbmVAY29tbWZpcmVzZXJ2aWNlcy5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04gKCJjcHVmcmVxIGRyaXZlciBmb3IgUGVudGl1bShUTSkgNC9YZW9uKFRNKSIpOwotTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlp3YW5lIE13YWlrYW1ibyA8endhbmVAY29tbWZpcmVzZXJ2aWNlcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImNwdWZyZXEgZHJpdmVyIGZvciBQZW50aXVtKFRNKSA0L1hlb24oVE0pIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIGxhdGVfaW5pdGNhbGwoY3B1ZnJlcV9wNF9pbml0KTsKIG1vZHVsZV9leGl0KGNwdWZyZXFfcDRfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNi5jCmluZGV4IGMxYWM1NzkuLmYxMGRlYTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNi5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqICBUaGlzIGZpbGUgd2FzIGJhc2VkIHVwb24gY29kZSBpbiBQb3dlcnR3ZWFrIExpbnV4IChodHRwOi8vcG93ZXJ0d2Vhay5zZi5uZXQpCi0gKiAgKEMpIDIwMDAtMjAwMyAgRGF2ZSBKb25lcywgQXJqYW4gdmFuIGRlIFZlbiwgSmFubmUgUMOkbmvDpGzDpCwgRG9taW5payBCcm9kb3dza2kuCisgKiAgKEMpIDIwMDAtMjAwMyAgRGF2ZSBKb25lcywgQXJqYW4gdmFuIGRlIFZlbiwgSmFubmUgUMOkbmvDpGzDpCwKKyAqICAgICAgICAgICAgICAgICBEb21pbmlrIEJyb2Rvd3NraS4KICAqCiAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgogICoKQEAgLTEzLDE0ICsxNCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxhc20vbXNyLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCisjaW5jbHVkZSA8YXNtL21zci5oPgorCiAjZGVmaW5lIFBPV0VSTk9XX0lPUE9SVCAweGZmZjAgICAgICAgICAgLyogaXQgZG9lc24ndCBtYXR0ZXIgd2hlcmUsIGFzIGxvbmcKIAkJCQkJICAgYXMgaXQgaXMgdW51c2VkICovCiAKKyNkZWZpbmUgUEZYICJwb3dlcm5vdy1rNjogIgogc3RhdGljIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgIGJ1c2ZyZXE7ICAgLyogRlNCLCBpbiAxMCBrSHogKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICBtYXhfbXVsdGlwbGllcjsKIApAQCAtNDcsOCArNDksOCBAQAogICovCiBzdGF0aWMgaW50IHBvd2Vybm93X2s2X2dldF9jcHVfbXVsdGlwbGllcih2b2lkKQogewotCXU2NCAgICAgICAgICAgICBpbnZhbHVlID0gMDsKLQl1MzIgICAgICAgICAgICAgbXNydmFsOworCXU2NCBpbnZhbHVlID0gMDsKKwl1MzIgbXNydmFsOwogCiAJbXNydmFsID0gUE9XRVJOT1dfSU9QT1JUICsgMHgxOwogCXdybXNyKE1TUl9LNl9FUE1SLCBtc3J2YWwsIDApOyAvKiBlbmFibGUgdGhlIFBvd2VyTm93IHBvcnQgKi8KQEAgLTY4LDEyICs3MCwxMiBAQAogICovCiBzdGF0aWMgdm9pZCBwb3dlcm5vd19rNl9zZXRfc3RhdGUodW5zaWduZWQgaW50IGJlc3RfaSkKIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBvdXR2YWx1ZSA9IDAsIGludmFsdWUgPSAwOwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIG1zcnZhbDsKLQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAgICBmcmVxczsKKwl1bnNpZ25lZCBsb25nIG91dHZhbHVlID0gMCwgaW52YWx1ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBtc3J2YWw7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CiAKIAlpZiAoY2xvY2tfcmF0aW9bYmVzdF9pXS5pbmRleCA+IG1heF9tdWx0aXBsaWVyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogaW52YWxpZCB0YXJnZXQgZnJlcXVlbmN5XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW52YWxpZCB0YXJnZXQgZnJlcXVlbmN5XG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTE5LDcgKzEyMSw4IEBACiAgKiBwb3dlcm5vd19rNl9zZXRwb2xpY3kgLSBzZXRzIGEgbmV3IENQVUZyZXEgcG9saWN5CiAgKiBAcG9saWN5OiBuZXcgcG9saWN5CiAgKiBAdGFyZ2V0X2ZyZXE6IHRoZSB0YXJnZXQgZnJlcXVlbmN5Ci0gKiBAcmVsYXRpb246IGhvdyB0aGF0IGZyZXF1ZW5jeSByZWxhdGVzIHRvIGFjaGlldmVkIGZyZXF1ZW5jeSAoQ1BVRlJFUV9SRUxBVElPTl9MIG9yIENQVUZSRVFfUkVMQVRJT05fSCkKKyAqIEByZWxhdGlvbjogaG93IHRoYXQgZnJlcXVlbmN5IHJlbGF0ZXMgdG8gYWNoaWV2ZWQgZnJlcXVlbmN5CisgKiAgKENQVUZSRVFfUkVMQVRJT05fTCBvciBDUFVGUkVRX1JFTEFUSU9OX0gpCiAgKgogICogc2V0cyBhIG5ldyBDUFVGcmVxIHBvbGljeQogICovCkBAIC0xMjcsOSArMTMwLDEwIEBACiAJCQkgICAgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAogCQkJICAgICAgIHVuc2lnbmVkIGludCByZWxhdGlvbikKIHsKLQl1bnNpZ25lZCBpbnQgICAgbmV3c3RhdGUgPSAwOworCXVuc2lnbmVkIGludCBuZXdzdGF0ZSA9IDA7CiAKLQlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgJmNsb2NrX3JhdGlvWzBdLCB0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZuZXdzdGF0ZSkpCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksICZjbG9ja19yYXRpb1swXSwKKwkJCQl0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZuZXdzdGF0ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcG93ZXJub3dfazZfc2V0X3N0YXRlKG5ld3N0YXRlKTsKQEAgLTE0MCw3ICsxNDQsNyBAQAogCiBzdGF0aWMgaW50IHBvd2Vybm93X2s2X2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewotCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBpLCBmOwogCWludCByZXN1bHQ7CiAKIAlpZiAocG9saWN5LT5jcHUgIT0gMCkKQEAgLTE1MiwxMCArMTU2LDExIEBACiAKIAkvKiB0YWJsZSBpbml0ICovCiAJZm9yIChpID0gMDsgKGNsb2NrX3JhdGlvW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgewotCQlpZiAoY2xvY2tfcmF0aW9baV0uaW5kZXggPiBtYXhfbXVsdGlwbGllcikKKwkJZiA9IGNsb2NrX3JhdGlvW2ldLmluZGV4OworCQlpZiAoZiA+IG1heF9tdWx0aXBsaWVyKQogCQkJY2xvY2tfcmF0aW9baV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOwogCQllbHNlCi0JCQljbG9ja19yYXRpb1tpXS5mcmVxdWVuY3kgPSBidXNmcmVxICogY2xvY2tfcmF0aW9baV0uaW5kZXg7CisJCQljbG9ja19yYXRpb1tpXS5mcmVxdWVuY3kgPSBidXNmcmVxICogZjsKIAl9CiAKIAkvKiBjcHVpbmZvIGFuZCBkZWZhdWx0IHBvbGljeSB2YWx1ZXMgKi8KQEAgLTE4NSw3ICsxOTAsOSBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IHBvd2Vybm93X2s2X2dldCh1bnNpZ25lZCBpbnQgY3B1KQogewotCXJldHVybiBidXNmcmVxICogcG93ZXJub3dfazZfZ2V0X2NwdV9tdWx0aXBsaWVyKCk7CisJdW5zaWduZWQgaW50IHJldDsKKwlyZXQgPSAoYnVzZnJlcSAqIHBvd2Vybm93X2s2X2dldF9jcHVfbXVsdGlwbGllcigpKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciAqcG93ZXJub3dfazZfYXR0cltdID0gewpAQCAtMjIxLDcgKzIyOCw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihQT1dFUk5PV19JT1BPUlQsIDE2LCAiUG93ZXJOb3chIikpIHsKLQkJcHJpbnRrKCJjcHVmcmVxOiBQb3dlck5vdyBJT1BPUlQgcmVnaW9uIGFscmVhZHkgdXNlZC5cbiIpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUG93ZXJOb3cgSU9QT1JUIHJlZ2lvbiBhbHJlYWR5IHVzZWQuXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0yNDYsNyArMjUzLDggQEAKIH0KIAogCi1NT0RVTEVfQVVUSE9SKCJBcmphbiB2YW4gZGUgVmVuLCBEYXZlIEpvbmVzIDxkYXZlakByZWRoYXQuY29tPiwgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPiIpOworTU9EVUxFX0FVVEhPUigiQXJqYW4gdmFuIGRlIFZlbiwgRGF2ZSBKb25lcyA8ZGF2ZWpAcmVkaGF0LmNvbT4sICIKKwkJIkRvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUG93ZXJOb3chIGRyaXZlciBmb3IgQU1EIEs2LTIrIC8gSzYtMysgcHJvY2Vzc29ycy4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYwppbmRleCAxYjQ0NmQ3Li4zYzI4Y2NkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYwpAQCAtNiwxMCArNiwxMiBAQAogICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KICAqICBCYXNlZCB1cG9uIGRhdGFzaGVldHMgJiBzYW1wbGUgQ1BVcyBraW5kbHkgcHJvdmlkZWQgYnkgQU1ELgogICoKLSAqIEVycmF0YSA1OiBQcm9jZXNzb3IgbWF5IGZhaWwgdG8gZXhlY3V0ZSBhIEZJRC9WSUQgY2hhbmdlIGluIHByZXNlbmNlIG9mIGludGVycnVwdC4KLSAqIC0gV2UgY2xpL3N0aSBvbiBzdGVwcGluZyBBMCBDUFVzIGFyb3VuZCB0aGUgRklEL1ZJRCB0cmFuc2l0aW9uLgotICogRXJyYXRhIDE1OiBQcm9jZXNzb3JzIHdpdGggaGFsZiBmcmVxdWVuY3kgbXVsdGlwbGllcnMgbWF5IGhhbmcgdXBvbiB3YWtldXAgZnJvbSBkaXNjb25uZWN0LgotICogLSBXZSBkaXNhYmxlIGhhbGYgbXVsdGlwbGllcnMgaWYgQUNQSSBpcyB1c2VkIG9uIEEwIHN0ZXBwaW5nIENQVXMuCisgKiBFcnJhdGEgNToKKyAqICBDUFUgbWF5IGZhaWwgdG8gZXhlY3V0ZSBhIEZJRC9WSUQgY2hhbmdlIGluIHByZXNlbmNlIG9mIGludGVycnVwdC4KKyAqICAtIFdlIGNsaS9zdGkgb24gc3RlcHBpbmcgQTAgQ1BVcyBhcm91bmQgdGhlIEZJRC9WSUQgdHJhbnNpdGlvbi4KKyAqIEVycmF0YSAxNToKKyAqICBDUFUgd2l0aCBoYWxmIGZyZXF1ZW5jeSBtdWx0aXBsaWVycyBtYXkgaGFuZyB1cG9uIHdha2V1cCBmcm9tIGRpc2Nvbm5lY3QuCisgKiAgLSBXZSBkaXNhYmxlIGhhbGYgbXVsdGlwbGllcnMgaWYgQUNQSSBpcyB1c2VkIG9uIEEwIHN0ZXBwaW5nIENQVXMuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjAsMTEgKzIyLDExIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAorI2luY2x1ZGUgPGFzbS90aW1lci5oPgkJLyogTmVlZGVkIGZvciByZWNhbGlicmF0ZV9jcHVfa2h6KCkgKi8KICNpbmNsdWRlIDxhc20vbXNyLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWVyLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjaWZkZWYgQ09ORklHX1g4Nl9QT1dFUk5PV19LN19BQ1BJCkBAIC01OCw5ICs2MCw5IEBACiB1bmlvbiBwb3dlcm5vd19hY3BpX2NvbnRyb2xfdCB7CiAJc3RydWN0IHsKIAkJdW5zaWduZWQgbG9uZyBmaWQ6NSwKLQkJdmlkOjUsCi0JCXNndGM6MjAsCi0JCXJlczE6MjsKKwkJCXZpZDo1LAorCQkJc2d0YzoyMCwKKwkJCXJlczE6MjsKIAl9IGJpdHM7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiB9OwpAQCAtOTQsMTQgKzk2LDE1IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY2FuX3NjYWxlX2J1czsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY2FuX3NjYWxlX3ZpZDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWluaW11bV9zcGVlZD0tMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWluaW11bV9zcGVlZCA9IC0xOwogc3RhdGljIHVuc2lnbmVkIGludCBtYXhpbXVtX3NwZWVkOwogc3RhdGljIHVuc2lnbmVkIGludCBudW1iZXJfc2NhbGVzOwogc3RhdGljIHVuc2lnbmVkIGludCBmc2I7CiBzdGF0aWMgdW5zaWduZWQgaW50IGxhdGVuY3k7CiBzdGF0aWMgY2hhciBoYXZlX2EwOwogCi0jZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgInBvd2Vybm93LWs3IiwgbXNnKQorI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsIFwKKwkJInBvd2Vybm93LWs3IiwgbXNnKQogCiBzdGF0aWMgaW50IGNoZWNrX2ZzYih1bnNpZ25lZCBpbnQgZnNic3BlZWQpCiB7CkBAIC0xMDksNyArMTEyLDcgQEAKIAl1bnNpZ25lZCBpbnQgZiA9IGZzYiAvIDEwMDA7CiAKIAlkZWx0YSA9IChmc2JzcGVlZCA+IGYpID8gZnNic3BlZWQgLSBmIDogZiAtIGZzYnNwZWVkOwotCXJldHVybiAoZGVsdGEgPCA1KTsKKwlyZXR1cm4gZGVsdGEgPCA1OwogfQogCiBzdGF0aWMgaW50IGNoZWNrX3Bvd2Vybm93KHZvaWQpCkBAIC0xMTcsMjQgKzEyMCwyNiBAQAogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YSgwKTsKIAl1bnNpZ25lZCBpbnQgbWF4ZWksIGVheCwgZWJ4LCBlY3gsIGVkeDsKIAotCWlmICgoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0FNRCkgfHwgKGMtPng4NiAhPTYpKSB7CisJaWYgKChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EKSB8fCAoYy0+eDg2ICE9IDYpKSB7CiAjaWZkZWYgTU9EVUxFCi0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVGhpcyBtb2R1bGUgb25seSB3b3JrcyB3aXRoIEFNRCBLNyBDUFVzXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlRoaXMgbW9kdWxlIG9ubHkgd29ya3Mgd2l0aCAiCisJCQkJIkFNRCBLNyBDUFVzXG4iKTsKICNlbmRpZgogCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBHZXQgbWF4aW11bSBjYXBhYmlsaXRpZXMgKi8KLQltYXhlaSA9IGNwdWlkX2VheCAoMHg4MDAwMDAwMCk7CisJbWF4ZWkgPSBjcHVpZF9lYXgoMHg4MDAwMDAwMCk7CiAJaWYgKG1heGVpIDwgMHg4MDAwMDAwNykgewkvKiBBbnkgcG93ZXJub3cgaW5mbyA/ICovCiAjaWZkZWYgTU9EVUxFCi0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiTm8gcG93ZXJub3cgY2FwYWJpbGl0aWVzIGRldGVjdGVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIk5vIHBvd2Vybm93IGNhcGFiaWxpdGllcyBkZXRlY3RlZFxuIik7CiAjZW5kaWYKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKChjLT54ODZfbW9kZWwgPT0gNikgJiYgKGMtPng4Nl9tYXNrID09IDApKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiSzcgNjYwW0EwXSBjb3JlIGRldGVjdGVkLCBlbmFibGluZyBlcnJhdGEgd29ya2Fyb3VuZHNcbiIpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiSzcgNjYwW0EwXSBjb3JlIGRldGVjdGVkLCAiCisJCQkJImVuYWJsaW5nIGVycmF0YSB3b3JrYXJvdW5kc1xuIik7CiAJCWhhdmVfYTAgPSAxOwogCX0KIApAQCAtMTQ0LDM3ICsxNDksNDIgQEAKIAlpZiAoIShlZHggJiAoMSA8PCAxIHwgMSA8PCAyKSkpCiAJCXJldHVybiAwOwogCi0JcHJpbnRrIChLRVJOX0lORk8gUEZYICJQb3dlck5PVyEgVGVjaG5vbG9neSBwcmVzZW50LiBDYW4gc2NhbGU6ICIpOworCXByaW50ayhLRVJOX0lORk8gUEZYICJQb3dlck5PVyEgVGVjaG5vbG9neSBwcmVzZW50LiBDYW4gc2NhbGU6ICIpOwogCiAJaWYgKGVkeCAmIDEgPDwgMSkgewotCQlwcmludGsgKCJmcmVxdWVuY3kiKTsKLQkJY2FuX3NjYWxlX2J1cz0xOworCQlwcmludGsoImZyZXF1ZW5jeSIpOworCQljYW5fc2NhbGVfYnVzID0gMTsKIAl9CiAKIAlpZiAoKGVkeCAmICgxIDw8IDEgfCAxIDw8IDIpKSA9PSAweDYpCi0JCXByaW50ayAoIiBhbmQgIik7CisJCXByaW50aygiIGFuZCAiKTsKIAogCWlmIChlZHggJiAxIDw8IDIpIHsKLQkJcHJpbnRrICgidm9sdGFnZSIpOwotCQljYW5fc2NhbGVfdmlkPTE7CisJCXByaW50aygidm9sdGFnZSIpOworCQljYW5fc2NhbGVfdmlkID0gMTsKIAl9CiAKLQlwcmludGsgKCIuXG4iKTsKKwlwcmludGsoIi5cbiIpOwogCXJldHVybiAxOwogfQogCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX2VudHJ5KHVuc2lnbmVkIGludCBlbnRyeSkKK3sKKwlwb3dlcm5vd190YWJsZVtlbnRyeV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworfQogCi1zdGF0aWMgaW50IGdldF9yYW5nZXMgKHVuc2lnbmVkIGNoYXIgKnBzdCkKK3N0YXRpYyBpbnQgZ2V0X3Jhbmdlcyh1bnNpZ25lZCBjaGFyICpwc3QpCiB7CiAJdW5zaWduZWQgaW50IGo7CiAJdW5zaWduZWQgaW50IHNwZWVkOwogCXU4IGZpZCwgdmlkOwogCi0JcG93ZXJub3dfdGFibGUgPSBremFsbG9jKChzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKSAqIChudW1iZXJfc2NhbGVzICsgMSkpLCBHRlBfS0VSTkVMKTsKKwlwb3dlcm5vd190YWJsZSA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUpICoKKwkJCQkobnVtYmVyX3NjYWxlcyArIDEpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb3dlcm5vd190YWJsZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3IgKGo9MCA7IGogPCBudW1iZXJfc2NhbGVzOyBqKyspIHsKKwlmb3IgKGogPSAwIDsgaiA8IG51bWJlcl9zY2FsZXM7IGorKykgewogCQlmaWQgPSAqcHN0Kys7CiAKIAkJcG93ZXJub3dfdGFibGVbal0uZnJlcXVlbmN5ID0gKGZzYiAqIGZpZF9jb2Rlc1tmaWRdKSAvIDEwOwpAQCAtMTgyLDEwICsxOTIsMTAgQEAKIAogCQlzcGVlZCA9IHBvd2Vybm93X3RhYmxlW2pdLmZyZXF1ZW5jeTsKIAotCQlpZiAoKGZpZF9jb2Rlc1tmaWRdICUgMTApPT01KSB7CisJCWlmICgoZmlkX2NvZGVzW2ZpZF0gJSAxMCkgPT0gNSkgewogI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzdfQUNQSQogCQkJaWYgKGhhdmVfYTAgPT0gMSkKLQkJCQlwb3dlcm5vd190YWJsZVtqXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCQkJaW52YWxpZGF0ZV9lbnRyeShqKTsKICNlbmRpZgogCQl9CiAKQEAgLTE5Nyw3ICsyMDcsNyBAQAogCQl2aWQgPSAqcHN0Kys7CiAJCXBvd2Vybm93X3RhYmxlW2pdLmluZGV4IHw9ICh2aWQgPDwgOCk7IC8qIHVwcGVyIDggYml0cyAqLwogCi0JCWRwcmludGsgKCIgICBGSUQ6IDB4JXggKCVkLiVkeCBbJWRNSHpdKSAgIgorCQlkcHJpbnRrKCIgICBGSUQ6IDB4JXggKCVkLiVkeCBbJWRNSHpdKSAgIgogCQkJICJWSUQ6IDB4JXggKCVkLiUwM2RWKVxuIiwgZmlkLCBmaWRfY29kZXNbZmlkXSAvIDEwLAogCQkJIGZpZF9jb2Rlc1tmaWRdICUgMTAsIHNwZWVkLzEwMDAsIHZpZCwKIAkJCSBtb2JpbGVfdmlkX3RhYmxlW3ZpZF0vMTAwMCwKQEAgLTIxNCwxMyArMjI0LDEzIEBACiB7CiAJdW5pb24gbXNyX2ZpZHZpZGN0bCBmaWR2aWRjdGw7CiAKLQlyZG1zcmwgKE1TUl9LN19GSURfVklEX0NUTCwgZmlkdmlkY3RsLnZhbCk7CisJcmRtc3JsKE1TUl9LN19GSURfVklEX0NUTCwgZmlkdmlkY3RsLnZhbCk7CiAJaWYgKGZpZHZpZGN0bC5iaXRzLkZJRCAhPSBmaWQpIHsKIAkJZmlkdmlkY3RsLmJpdHMuU0dUQyA9IGxhdGVuY3k7CiAJCWZpZHZpZGN0bC5iaXRzLkZJRCA9IGZpZDsKIAkJZmlkdmlkY3RsLmJpdHMuVklEQyA9IDA7CiAJCWZpZHZpZGN0bC5iaXRzLkZJREMgPSAxOwotCQl3cm1zcmwgKE1TUl9LN19GSURfVklEX0NUTCwgZmlkdmlkY3RsLnZhbCk7CisJCXdybXNybChNU1JfSzdfRklEX1ZJRF9DVEwsIGZpZHZpZGN0bC52YWwpOwogCX0KIH0KIApAQCAtMjI5LDE4ICsyMzksMTggQEAKIHsKIAl1bmlvbiBtc3JfZmlkdmlkY3RsIGZpZHZpZGN0bDsKIAotCXJkbXNybCAoTVNSX0s3X0ZJRF9WSURfQ1RMLCBmaWR2aWRjdGwudmFsKTsKKwlyZG1zcmwoTVNSX0s3X0ZJRF9WSURfQ1RMLCBmaWR2aWRjdGwudmFsKTsKIAlpZiAoZmlkdmlkY3RsLmJpdHMuVklEICE9IHZpZCkgewogCQlmaWR2aWRjdGwuYml0cy5TR1RDID0gbGF0ZW5jeTsKIAkJZmlkdmlkY3RsLmJpdHMuVklEID0gdmlkOwogCQlmaWR2aWRjdGwuYml0cy5GSURDID0gMDsKIAkJZmlkdmlkY3RsLmJpdHMuVklEQyA9IDE7Ci0JCXdybXNybCAoTVNSX0s3X0ZJRF9WSURfQ1RMLCBmaWR2aWRjdGwudmFsKTsKKwkJd3Jtc3JsKE1TUl9LN19GSURfVklEX0NUTCwgZmlkdmlkY3RsLnZhbCk7CiAJfQogfQogCiAKLXN0YXRpYyB2b2lkIGNoYW5nZV9zcGVlZCAodW5zaWduZWQgaW50IGluZGV4KQorc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHVuc2lnbmVkIGludCBpbmRleCkKIHsKIAl1OCBmaWQsIHZpZDsKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKQEAgLTI1Nyw3ICsyNjcsNyBAQAogCiAJZnJlcXMuY3B1ID0gMDsKIAotCXJkbXNybCAoTVNSX0s3X0ZJRF9WSURfU1RBVFVTLCBmaWR2aWRzdGF0dXMudmFsKTsKKwlyZG1zcmwoTVNSX0s3X0ZJRF9WSURfU1RBVFVTLCBmaWR2aWRzdGF0dXMudmFsKTsKIAljZmlkID0gZmlkdmlkc3RhdHVzLmJpdHMuQ0ZJRDsKIAlmcmVxcy5vbGQgPSBmc2IgKiBmaWRfY29kZXNbY2ZpZF0gLyAxMDsKIApAQCAtMzIxLDEyICszMzEsMTQgQEAKIAkJZ290byBlcnIxOwogCX0KIAotCWlmIChhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSB7CisJaWYgKGFjcGlfcHJvY2Vzc29yX3BlcmYtPmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQgIT0KKwkJCUFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSB7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyMjsKIAl9CiAKLQlpZiAoYWNwaV9wcm9jZXNzb3JfcGVyZi0+c3RhdHVzX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSB7CisJaWYgKGFjcGlfcHJvY2Vzc29yX3BlcmYtPnN0YXR1c19yZWdpc3Rlci5zcGFjZV9pZCAhPQorCQkJQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpIHsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byBlcnIyOwogCX0KQEAgLTMzOCw3ICszNTAsOCBAQAogCQlnb3RvIGVycjI7CiAJfQogCi0JcG93ZXJub3dfdGFibGUgPSBremFsbG9jKChudW1iZXJfc2NhbGVzICsgMSkgKiAoc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSkpLCBHRlBfS0VSTkVMKTsKKwlwb3dlcm5vd190YWJsZSA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUpICoKKwkJCQkobnVtYmVyX3NjYWxlcyArIDEpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb3dlcm5vd190YWJsZSkgewogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycjI7CkBAIC0zNTIsNyArMzY1LDcgQEAKIAkJdW5zaWduZWQgaW50IHNwZWVkLCBzcGVlZF9taHo7CiAKIAkJcGMudmFsID0gKHVuc2lnbmVkIGxvbmcpIHN0YXRlLT5jb250cm9sOwotCQlkcHJpbnRrICgiYWNwaTogIFAlZDogJWQgTUh6ICVkIG1XICVkIHVTIGNvbnRyb2wgJTA4eCBTR1RDICVkXG4iLAorCQlkcHJpbnRrKCJhY3BpOiAgUCVkOiAlZCBNSHogJWQgbVcgJWQgdVMgY29udHJvbCAlMDh4IFNHVEMgJWRcbiIsCiAJCQkgaSwKIAkJCSAodTMyKSBzdGF0ZS0+Y29yZV9mcmVxdWVuY3ksCiAJCQkgKHUzMikgc3RhdGUtPnBvd2VyLApAQCAtMzgxLDEyICszOTQsMTIgQEAKIAkJaWYgKHNwZWVkICUgMTAwMCA+IDApCiAJCQlzcGVlZF9taHorKzsKIAotCQlpZiAoKGZpZF9jb2Rlc1tmaWRdICUgMTApPT01KSB7CisJCWlmICgoZmlkX2NvZGVzW2ZpZF0gJSAxMCkgPT0gNSkgewogCQkJaWYgKGhhdmVfYTAgPT0gMSkKLQkJCQlwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCQkJaW52YWxpZGF0ZV9lbnRyeShpKTsKIAkJfQogCi0JCWRwcmludGsgKCIgICBGSUQ6IDB4JXggKCVkLiVkeCBbJWRNSHpdKSAgIgorCQlkcHJpbnRrKCIgICBGSUQ6IDB4JXggKCVkLiVkeCBbJWRNSHpdKSAgIgogCQkJICJWSUQ6IDB4JXggKCVkLiUwM2RWKVxuIiwgZmlkLCBmaWRfY29kZXNbZmlkXSAvIDEwLAogCQkJIGZpZF9jb2Rlc1tmaWRdICUgMTAsIHNwZWVkX21oeiwgdmlkLAogCQkJIG1vYmlsZV92aWRfdGFibGVbdmlkXS8xMDAwLApAQCAtNDIyLDcgKzQzNSw4IEBACiBlcnIwNToKIAlrZnJlZShhY3BpX3Byb2Nlc3Nvcl9wZXJmKTsKIGVycjA6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkFDUEkgcGVyZmxpYiBjYW4gbm90IGJlIHVzZWQgaW4gdGhpcyBwbGF0Zm9ybVxuIik7CisJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkFDUEkgcGVyZmxpYiBjYW4gbm90IGJlIHVzZWQgb24gIgorCQkJInRoaXMgcGxhdGZvcm1cbiIpOwogCWFjcGlfcHJvY2Vzc29yX3BlcmYgPSBOVUxMOwogCXJldHVybiByZXR2YWw7CiB9CkBAIC00MzUsNyArNDQ5LDE0IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBwb3dlcm5vd19kZWNvZGVfYmlvcyAoaW50IG1heGZpZCwgaW50IHN0YXJ0dmlkKQorc3RhdGljIHZvaWQgcHJpbnRfcHN0X2VudHJ5KHN0cnVjdCBwc3RfcyAqcHN0LCB1bnNpZ25lZCBpbnQgaikKK3sKKwlkcHJpbnRrKCJQU1Q6JWQgKEAlcClcbiIsIGosIHBzdCk7CisJZHByaW50aygiIGNwdWlkOiAweCV4ICBmc2I6ICVkICBtYXhGSUQ6IDB4JXggIHN0YXJ0dmlkOiAweCV4XG4iLAorCQlwc3QtPmNwdWlkLCBwc3QtPmZzYnNwZWVkLCBwc3QtPm1heGZpZCwgcHN0LT5zdGFydHZpZCk7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXJub3dfZGVjb2RlX2Jpb3MoaW50IG1heGZpZCwgaW50IHN0YXJ0dmlkKQogewogCXN0cnVjdCBwc2JfcyAqcHNiOwogCXN0cnVjdCBwc3RfcyAqcHN0OwpAQCAtNDQ2LDYxICs0NjcsNjcgQEAKIAogCWV0dXBsZSA9IGNwdWlkX2VheCgweDgwMDAwMDAxKTsKIAotCWZvciAoaT0weEMwMDAwOyBpIDwgMHhmZmZmMCA7IGkrPTE2KSB7CisJZm9yIChpID0gMHhDMDAwMDsgaSA8IDB4ZmZmZjAgOyBpICs9IDE2KSB7CiAKIAkJcCA9IHBoeXNfdG9fdmlydChpKTsKIAotCQlpZiAobWVtY21wKHAsICJBTURLN1BOT1chIiwgIDEwKSA9PSAwKXsKLQkJCWRwcmludGsgKCJGb3VuZCBQU0IgaGVhZGVyIGF0ICVwXG4iLCBwKTsKKwkJaWYgKG1lbWNtcChwLCAiQU1ESzdQTk9XISIsICAxMCkgPT0gMCkgeworCQkJZHByaW50aygiRm91bmQgUFNCIGhlYWRlciBhdCAlcFxuIiwgcCk7CiAJCQlwc2IgPSAoc3RydWN0IHBzYl9zICopIHA7Ci0JCQlkcHJpbnRrICgiVGFibGUgdmVyc2lvbjogMHgleFxuIiwgcHNiLT50YWJsZXZlcnNpb24pOworCQkJZHByaW50aygiVGFibGUgdmVyc2lvbjogMHgleFxuIiwgcHNiLT50YWJsZXZlcnNpb24pOwogCQkJaWYgKHBzYi0+dGFibGV2ZXJzaW9uICE9IDB4MTIpIHsKLQkJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIlNvcnJ5LCBvbmx5IHYxLjIgdGFibGVzIHN1cHBvcnRlZCByaWdodCBub3dcbiIpOworCQkJCXByaW50ayhLRVJOX0lORk8gUEZYICJTb3JyeSwgb25seSB2MS4yIHRhYmxlcyIKKwkJCQkJCSIgc3VwcG9ydGVkIHJpZ2h0IG5vd1xuIik7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQl9CiAKLQkJCWRwcmludGsgKCJGbGFnczogMHgleFxuIiwgcHNiLT5mbGFncyk7Ci0JCQlpZiAoKHBzYi0+ZmxhZ3MgJiAxKT09MCkgewotCQkJCWRwcmludGsgKCJNb2JpbGUgdm9sdGFnZSByZWd1bGF0b3JcbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlkcHJpbnRrICgiRGVza3RvcCB2b2x0YWdlIHJlZ3VsYXRvclxuIik7Ci0JCQl9CisJCQlkcHJpbnRrKCJGbGFnczogMHgleFxuIiwgcHNiLT5mbGFncyk7CisJCQlpZiAoKHBzYi0+ZmxhZ3MgJiAxKSA9PSAwKQorCQkJCWRwcmludGsoIk1vYmlsZSB2b2x0YWdlIHJlZ3VsYXRvclxuIik7CisJCQllbHNlCisJCQkJZHByaW50aygiRGVza3RvcCB2b2x0YWdlIHJlZ3VsYXRvclxuIik7CiAKIAkJCWxhdGVuY3kgPSBwc2ItPnNldHRsaW5ndGltZTsKIAkJCWlmIChsYXRlbmN5IDwgMTAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkJJT1Mgc2V0IHNldHRsaW5nIHRpbWUgdG8gJWQgbWljcm9zZWNvbmRzLiAiCi0JCQkJCQkiU2hvdWxkIGJlIGF0IGxlYXN0IDEwMC4gQ29ycmVjdGluZy5cbiIsIGxhdGVuY3kpOworCQkJCXByaW50ayhLRVJOX0lORk8gUEZYICJCSU9TIHNldCBzZXR0bGluZyB0aW1lICIKKwkJCQkJCSJ0byAlZCBtaWNyb3NlY29uZHMuICIKKwkJCQkJCSJTaG91bGQgYmUgYXQgbGVhc3QgMTAwLiAiCisJCQkJCQkiQ29ycmVjdGluZy5cbiIsIGxhdGVuY3kpOwogCQkJCWxhdGVuY3kgPSAxMDA7CiAJCQl9Ci0JCQlkcHJpbnRrICgiU2V0dGxpbmcgVGltZTogJWQgbWljcm9zZWNvbmRzLlxuIiwgcHNiLT5zZXR0bGluZ3RpbWUpOwotCQkJZHByaW50ayAoIkhhcyAlZCBQU1QgdGFibGVzLiAoT25seSBkdW1waW5nIG9uZXMgcmVsZXZhbnQgdG8gdGhpcyBDUFUpLlxuIiwgcHNiLT5udW1wc3QpOworCQkJZHByaW50aygiU2V0dGxpbmcgVGltZTogJWQgbWljcm9zZWNvbmRzLlxuIiwKKwkJCQkJcHNiLT5zZXR0bGluZ3RpbWUpOworCQkJZHByaW50aygiSGFzICVkIFBTVCB0YWJsZXMuIChPbmx5IGR1bXBpbmcgb25lcyAiCisJCQkJCSJyZWxldmFudCB0byB0aGlzIENQVSkuXG4iLAorCQkJCQlwc2ItPm51bXBzdCk7CiAKLQkJCXAgKz0gc2l6ZW9mIChzdHJ1Y3QgcHNiX3MpOworCQkJcCArPSBzaXplb2Yoc3RydWN0IHBzYl9zKTsKIAogCQkJcHN0ID0gKHN0cnVjdCBwc3RfcyAqKSBwOwogCi0JCQlmb3IgKGo9MDsgajxwc2ItPm51bXBzdDsgaisrKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgcHNiLT5udW1wc3Q7IGorKykgewogCQkJCXBzdCA9IChzdHJ1Y3QgcHN0X3MgKikgcDsKIAkJCQludW1iZXJfc2NhbGVzID0gcHN0LT5udW1wc3RhdGVzOwogCi0JCQkJaWYgKChldHVwbGUgPT0gcHN0LT5jcHVpZCkgJiYgY2hlY2tfZnNiKHBzdC0+ZnNic3BlZWQpICYmCi0JCQkJICAgIChtYXhmaWQ9PXBzdC0+bWF4ZmlkKSAmJiAoc3RhcnR2aWQ9PXBzdC0+c3RhcnR2aWQpKQotCQkJCXsKLQkJCQkJZHByaW50ayAoIlBTVDolZCAoQCVwKVxuIiwgaiwgcHN0KTsKLQkJCQkJZHByaW50ayAoIiBjcHVpZDogMHgleCAgZnNiOiAlZCAgbWF4RklEOiAweCV4ICBzdGFydHZpZDogMHgleFxuIiwKLQkJCQkJCSBwc3QtPmNwdWlkLCBwc3QtPmZzYnNwZWVkLCBwc3QtPm1heGZpZCwgcHN0LT5zdGFydHZpZCk7Ci0KLQkJCQkJcmV0ID0gZ2V0X3JhbmdlcyAoKGNoYXIgKikgcHN0ICsgc2l6ZW9mIChzdHJ1Y3QgcHN0X3MpKTsKKwkJCQlpZiAoKGV0dXBsZSA9PSBwc3QtPmNwdWlkKSAmJgorCQkJCSAgICBjaGVja19mc2IocHN0LT5mc2JzcGVlZCkgJiYKKwkJCQkgICAgKG1heGZpZCA9PSBwc3QtPm1heGZpZCkgJiYKKwkJCQkgICAgKHN0YXJ0dmlkID09IHBzdC0+c3RhcnR2aWQpKSB7CisJCQkJCXByaW50X3BzdF9lbnRyeShwc3QsIGopOworCQkJCQlwID0gKGNoYXIgKilwc3QgKyBzaXplb2Yoc3RydWN0IHBzdF9zKTsKKwkJCQkJcmV0ID0gZ2V0X3JhbmdlcyhwKTsKIAkJCQkJcmV0dXJuIHJldDsKIAkJCQl9IGVsc2UgewogCQkJCQl1bnNpZ25lZCBpbnQgazsKLQkJCQkJcCA9IChjaGFyICopIHBzdCArIHNpemVvZiAoc3RydWN0IHBzdF9zKTsKLQkJCQkJZm9yIChrPTA7IGs8bnVtYmVyX3NjYWxlczsgaysrKQotCQkJCQkJcCs9MjsKKwkJCQkJcCA9IChjaGFyICopcHN0ICsgc2l6ZW9mKHN0cnVjdCBwc3Rfcyk7CisJCQkJCWZvciAoayA9IDA7IGsgPCBudW1iZXJfc2NhbGVzOyBrKyspCisJCQkJCQlwICs9IDI7CiAJCQkJfQogCQkJfQotCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJObyBQU1QgdGFibGVzIG1hdGNoIHRoaXMgY3B1aWQgKDB4JXgpXG4iLCBldHVwbGUpOwotCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJUaGlzIGlzIGluZGljYXRpdmUgb2YgYSBicm9rZW4gQklPUy5cbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIk5vIFBTVCB0YWJsZXMgbWF0Y2ggdGhpcyBjcHVpZCAiCisJCQkJCSIoMHgleClcbiIsIGV0dXBsZSk7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiVGhpcyBpcyBpbmRpY2F0aXZlIG9mIGEgYnJva2VuICIKKwkJCQkJIkJJT1MuXG4iKTsKIAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTUxMSwxMyArNTM4LDE0IEBACiB9CiAKIAotc3RhdGljIGludCBwb3dlcm5vd190YXJnZXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorc3RhdGljIGludCBwb3dlcm5vd190YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCiAJCQkgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAogCQkJICAgIHVuc2lnbmVkIGludCByZWxhdGlvbikKIHsKIAl1bnNpZ25lZCBpbnQgbmV3c3RhdGU7CiAKLQlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgcG93ZXJub3dfdGFibGUsIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKKwlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgcG93ZXJub3dfdGFibGUsIHRhcmdldF9mcmVxLAorCQkJCXJlbGF0aW9uLCAmbmV3c3RhdGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNoYW5nZV9zcGVlZChuZXdzdGF0ZSk7CkBAIC01MjYsNyArNTU0LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IHBvd2Vybm93X3ZlcmlmeSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitzdGF0aWMgaW50IHBvd2Vybm93X3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgcG93ZXJub3dfdGFibGUpOwogfQpAQCAtNTY2LDE4ICs1OTQsMjMgQEAKIAogCWlmIChjcHUpCiAJCXJldHVybiAwOwotCXJkbXNybCAoTVNSX0s3X0ZJRF9WSURfU1RBVFVTLCBmaWR2aWRzdGF0dXMudmFsKTsKKwlyZG1zcmwoTVNSX0s3X0ZJRF9WSURfU1RBVFVTLCBmaWR2aWRzdGF0dXMudmFsKTsKIAljZmlkID0gZmlkdmlkc3RhdHVzLmJpdHMuQ0ZJRDsKIAotCXJldHVybiAoZnNiICogZmlkX2NvZGVzW2NmaWRdIC8gMTApOworCXJldHVybiBmc2IgKiBmaWRfY29kZXNbY2ZpZF0gLyAxMDsKIH0KIAogCiBzdGF0aWMgaW50IF9faW5pdCBhY2VyX2NwdWZyZXFfcHN0KGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQogewotCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGxhcHRvcCB3aXRoIGJyb2tlbiBQU1QgdGFibGVzIGluIEJJT1MgZGV0ZWN0ZWQuXG4iLCBkLT5pZGVudCk7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiWW91IG5lZWQgdG8gZG93bmdyYWRlIHRvIDNBMjEgKDA5LzA5LzIwMDIpLCBvciB0cnkgYSBuZXdlciBCSU9TIHRoYW4gM0E3MSAoMDEvMjAvMjAwMylcbiIpOwotCXByaW50ayhLRVJOX1dBUk5JTkcgImNwdWZyZXEgc2NhbGluZyBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHJlc3VsdCBvZiB0aGlzLlxuIik7CisJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJIiVzIGxhcHRvcCB3aXRoIGJyb2tlbiBQU1QgdGFibGVzIGluIEJJT1MgZGV0ZWN0ZWQuXG4iLAorCQlkLT5pZGVudCk7CisJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJIllvdSBuZWVkIHRvIGRvd25ncmFkZSB0byAzQTIxICgwOS8wOS8yMDAyKSwgb3IgdHJ5IGEgbmV3ZXIgIgorCQkiQklPUyB0aGFuIDNBNzEgKDAxLzIwLzIwMDMpXG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HIFBGWAorCQkiY3B1ZnJlcSBzY2FsaW5nIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMuXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTk4LDcgKzYzMSw3IEBACiAJeyB9CiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBwb3dlcm5vd19jcHVfaW5pdCAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitzdGF0aWMgaW50IF9faW5pdCBwb3dlcm5vd19jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAl1bmlvbiBtc3JfZmlkdmlkc3RhdHVzIGZpZHZpZHN0YXR1czsKIAlpbnQgcmVzdWx0OwpAQCAtNjA2LDcgKzYzOSw3IEBACiAJaWYgKHBvbGljeS0+Y3B1ICE9IDApCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmRtc3JsIChNU1JfSzdfRklEX1ZJRF9TVEFUVVMsIGZpZHZpZHN0YXR1cy52YWwpOworCXJkbXNybChNU1JfSzdfRklEX1ZJRF9TVEFUVVMsIGZpZHZpZHN0YXR1cy52YWwpOwogCiAJcmVjYWxpYnJhdGVfY3B1X2toeigpOwogCkBAIC02MTgsMTkgKzY1MSwyMSBAQAogCWRwcmludGsoIkZTQjogJTNkTUh6XG4iLCBmc2IvMTAwMCk7CiAKIAlpZiAoZG1pX2NoZWNrX3N5c3RlbShwb3dlcm5vd19kbWlfdGFibGUpIHx8IGFjcGlfZm9yY2UpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJQU0IvUFNUIGtub3duIHRvIGJlIGJyb2tlbi4gIFRyeWluZyBBQ1BJIGluc3RlYWRcbiIpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUFNCL1BTVCBrbm93biB0byBiZSBicm9rZW4uICAiCisJCQkJIlRyeWluZyBBQ1BJIGluc3RlYWRcbiIpOwogCQlyZXN1bHQgPSBwb3dlcm5vd19hY3BpX2luaXQoKTsKIAl9IGVsc2UgewotCQlyZXN1bHQgPSBwb3dlcm5vd19kZWNvZGVfYmlvcyhmaWR2aWRzdGF0dXMuYml0cy5NRklELCBmaWR2aWRzdGF0dXMuYml0cy5TVklEKTsKKwkJcmVzdWx0ID0gcG93ZXJub3dfZGVjb2RlX2Jpb3MoZmlkdmlkc3RhdHVzLmJpdHMuTUZJRCwKKwkJCQlmaWR2aWRzdGF0dXMuYml0cy5TVklEKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJUcnlpbmcgQUNQSSBwZXJmbGliXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJUcnlpbmcgQUNQSSBwZXJmbGliXG4iKTsKIAkJCW1heGltdW1fc3BlZWQgPSAwOwogCQkJbWluaW11bV9zcGVlZCA9IC0xOwogCQkJbGF0ZW5jeSA9IDA7CiAJCQlyZXN1bHQgPSBwb3dlcm5vd19hY3BpX2luaXQoKTsKIAkJCWlmIChyZXN1bHQpIHsKLQkJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkFDUEkgYW5kIGxlZ2FjeSBtZXRob2RzIGZhaWxlZFxuIik7Ci0JCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJTZWUgaHR0cDovL3d3dy5jb2RlbW9ua2V5Lm9yZy51ay9wcm9qZWN0cy9jcHVmcmVxL3Bvd2Vybm93LWs3Lmh0bWxcbiIpOworCQkJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCQkJCSJBQ1BJIGFuZCBsZWdhY3kgbWV0aG9kcyBmYWlsZWRcbiIpOwogCQkJfQogCQl9IGVsc2UgewogCQkJLyogU0dUQyB1c2UgdGhlIGJ1cyBjbG9jayBhcyB0aW1lciAqLwpAQCAtNjQyLDEwICs2NzcsMTEgQEAKIAlpZiAocmVzdWx0KQogCQlyZXR1cm4gcmVzdWx0OwogCi0JcHJpbnRrIChLRVJOX0lORk8gUEZYICJNaW5pbXVtIHNwZWVkICVkIE1Iei4gTWF4aW11bSBzcGVlZCAlZCBNSHouXG4iLAorCXByaW50ayhLRVJOX0lORk8gUEZYICJNaW5pbXVtIHNwZWVkICVkIE1Iei4gTWF4aW11bSBzcGVlZCAlZCBNSHouXG4iLAogCQkJCW1pbmltdW1fc3BlZWQvMTAwMCwgbWF4aW11bV9zcGVlZC8xMDAwKTsKIAotCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBjcHVmcmVxX3NjYWxlKDIwMDAwMDBVTCwgZnNiLCBsYXRlbmN5KTsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0KKwkJY3B1ZnJlcV9zY2FsZSgyMDAwMDAwVUwsIGZzYiwgbGF0ZW5jeSk7CiAKIAlwb2xpY3ktPmN1ciA9IHBvd2Vybm93X2dldCgwKTsKIApAQCAtNjU0LDcgKzY5MCw4IEBACiAJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBwb3dlcm5vd190YWJsZSk7CiB9CiAKLXN0YXRpYyBpbnQgcG93ZXJub3dfY3B1X2V4aXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KSB7CitzdGF0aWMgaW50IHBvd2Vybm93X2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQorewogCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKIAogI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzdfQUNQSQpAQCAtNjY5LDcgKzcwNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBwb3dlcm5vd190YWJsZV9hdHRyW10gPSB7CitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciAqcG93ZXJub3dfdGFibGVfYXR0cltdID0gewogCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKIAlOVUxMLAogfTsKQEAgLTY4NSwxNSArNzIyLDE1IEBACiAJLmF0dHIJPSBwb3dlcm5vd190YWJsZV9hdHRyLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcG93ZXJub3dfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHBvd2Vybm93X2luaXQodm9pZCkKIHsKLQlpZiAoY2hlY2tfcG93ZXJub3coKT09MCkKKwlpZiAoY2hlY2tfcG93ZXJub3coKSA9PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnBvd2Vybm93X2RyaXZlcik7CiB9CiAKIAotc3RhdGljIHZvaWQgX19leGl0IHBvd2Vybm93X2V4aXQgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgcG93ZXJub3dfZXhpdCh2b2lkKQogewogCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJnBvd2Vybm93X2RyaXZlcik7CiB9CkBAIC03MDEsOSArNzM4LDkgQEAKIG1vZHVsZV9wYXJhbShhY3BpX2ZvcmNlLCAgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYWNwaV9mb3JjZSwgIkZvcmNlIEFDUEkgdG8gYmUgdXNlZC4iKTsKIAotTU9EVUxFX0FVVEhPUiAoIkRhdmUgSm9uZXMgPGRhdmVqQHJlZGhhdC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04gKCJQb3dlcm5vdyBkcml2ZXIgZm9yIEFNRCBLNyBwcm9jZXNzb3JzLiIpOwotTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkRhdmUgSm9uZXMgPGRhdmVqQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBvd2Vybm93IGRyaXZlciBmb3IgQU1EIEs3IHByb2Nlc3NvcnMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIGxhdGVfaW5pdGNhbGwocG93ZXJub3dfaW5pdCk7CiBtb2R1bGVfZXhpdChwb3dlcm5vd19leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKaW5kZXggNjQyOGFhMS4uYTE1YWM5NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKQEAgLTMzLDE2ICszMywxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBmb3IgY3VycmVudCAvIHNldF9jcHVzX2FsbG93ZWQoKSAqLworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPGFzbS9tc3IuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KIAotI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzhfQUNQSQogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+Ci0jZW5kaWYKIAogI2RlZmluZSBQRlggInBvd2Vybm93LWs4OiAiCiAjZGVmaW5lIFZFUlNJT04gInZlcnNpb24gMi4yMC4wMCIKQEAgLTcxLDcgKzY5LDggQEAKIAlyZXR1cm4gMTAwMCAqIGZpbmRfZnJlcV9mcm9tX2ZpZChmaWQpOwogfQogCi1zdGF0aWMgdTMyIGZpbmRfa2h6X2ZyZXFfZnJvbV9wc3RhdGUoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpkYXRhLCB1MzIgcHN0YXRlKQorc3RhdGljIHUzMiBmaW5kX2toel9mcmVxX2Zyb21fcHN0YXRlKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqZGF0YSwKKwkJdTMyIHBzdGF0ZSkKIHsKIAlyZXR1cm4gZGF0YVtwc3RhdGVdLmZyZXF1ZW5jeTsKIH0KQEAgLTE4Niw3ICsxODUsOSBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlsbyA9IGZpZCB8IChkYXRhLT5jdXJydmlkIDw8IE1TUl9DX0xPX1ZJRF9TSElGVCkgfCBNU1JfQ19MT19JTklUX0ZJRF9WSUQ7CisJbG8gPSBmaWQ7CisJbG8gfD0gKGRhdGEtPmN1cnJ2aWQgPDwgTVNSX0NfTE9fVklEX1NISUZUKTsKKwlsbyB8PSBNU1JfQ19MT19JTklUX0ZJRF9WSUQ7CiAKIAlkcHJpbnRrKCJ3cml0aW5nIGZpZCAweCV4LCBsbyAweCV4LCBoaSAweCV4XG4iLAogCQlmaWQsIGxvLCBkYXRhLT5wbGxsb2NrICogUExMX0xPQ0tfQ09OVkVSU0lPTik7CkBAIC0xOTQsNyArMTk1LDkgQEAKIAlkbyB7CiAJCXdybXNyKE1TUl9GSURWSURfQ1RMLCBsbywgZGF0YS0+cGxsbG9jayAqIFBMTF9MT0NLX0NPTlZFUlNJT04pOwogCQlpZiAoaSsrID4gMTAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYICJIYXJkd2FyZSBlcnJvciAtIHBlbmRpbmcgYml0IHZlcnkgc3R1Y2sgLSBubyBmdXJ0aGVyIHBzdGF0ZSBjaGFuZ2VzIHBvc3NpYmxlXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCQkiSGFyZHdhcmUgZXJyb3IgLSBwZW5kaW5nIGJpdCB2ZXJ5IHN0dWNrIC0gIgorCQkJCSJubyBmdXJ0aGVyIHBzdGF0ZSBjaGFuZ2VzIHBvc3NpYmxlXG4iKTsKIAkJCXJldHVybiAxOwogCQl9CiAJfSB3aGlsZSAocXVlcnlfY3VycmVudF92YWx1ZXNfd2l0aF9wZW5kaW5nX3dhaXQoZGF0YSkpOwpAQCAtMjAyLDE0ICsyMDUsMTYgQEAKIAljb3VudF9vZmZfaXJ0KGRhdGEpOwogCiAJaWYgKHNhdmV2aWQgIT0gZGF0YS0+Y3VycnZpZCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2aWQgY2hhbmdlIG9uIGZpZCB0cmFucywgb2xkIDB4JXgsIG5ldyAweCV4XG4iLAotCQkgICAgICAgc2F2ZXZpZCwgZGF0YS0+Y3VycnZpZCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSJ2aWQgY2hhbmdlIG9uIGZpZCB0cmFucywgb2xkIDB4JXgsIG5ldyAweCV4XG4iLAorCQkJc2F2ZXZpZCwgZGF0YS0+Y3VycnZpZCk7CiAJCXJldHVybiAxOwogCX0KIAogCWlmIChmaWQgIT0gZGF0YS0+Y3VycmZpZCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJmaWQgdHJhbnMgZmFpbGVkLCBmaWQgMHgleCwgY3VyciAweCV4XG4iLCBmaWQsCi0JCSAgICAgICAgZGF0YS0+Y3VycmZpZCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSJmaWQgdHJhbnMgZmFpbGVkLCBmaWQgMHgleCwgY3VyciAweCV4XG4iLCBmaWQsCisJCQlkYXRhLT5jdXJyZmlkKTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC0yMjgsNyArMjMzLDkgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JbG8gPSBkYXRhLT5jdXJyZmlkIHwgKHZpZCA8PCBNU1JfQ19MT19WSURfU0hJRlQpIHwgTVNSX0NfTE9fSU5JVF9GSURfVklEOworCWxvID0gZGF0YS0+Y3VycmZpZDsKKwlsbyB8PSAodmlkIDw8IE1TUl9DX0xPX1ZJRF9TSElGVCk7CisJbG8gfD0gTVNSX0NfTE9fSU5JVF9GSURfVklEOwogCiAJZHByaW50aygid3JpdGluZyB2aWQgMHgleCwgbG8gMHgleCwgaGkgMHgleFxuIiwKIAkJdmlkLCBsbywgU1RPUF9HUkFOVF81TlMpOwpAQCAtMjM2LDIwICsyNDMsMjQgQEAKIAlkbyB7CiAJCXdybXNyKE1TUl9GSURWSURfQ1RMLCBsbywgU1RPUF9HUkFOVF81TlMpOwogCQlpZiAoaSsrID4gMTAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbnRlcm5hbCBlcnJvciAtIHBlbmRpbmcgYml0IHZlcnkgc3R1Y2sgLSBubyBmdXJ0aGVyIHBzdGF0ZSBjaGFuZ2VzIHBvc3NpYmxlXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggImludGVybmFsIGVycm9yIC0gcGVuZGluZyBiaXQgIgorCQkJCQkidmVyeSBzdHVjayAtIG5vIGZ1cnRoZXIgcHN0YXRlICIKKwkJCQkJImNoYW5nZXMgcG9zc2libGVcbiIpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAl9IHdoaWxlIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSk7CiAKIAlpZiAoc2F2ZWZpZCAhPSBkYXRhLT5jdXJyZmlkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggImZpZCBjaGFuZ2VkIG9uIHZpZCB0cmFucywgb2xkIDB4JXggbmV3IDB4JXhcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggImZpZCBjaGFuZ2VkIG9uIHZpZCB0cmFucywgb2xkICIKKwkJCSIweCV4IG5ldyAweCV4XG4iLAogCQkgICAgICAgc2F2ZWZpZCwgZGF0YS0+Y3VycmZpZCk7CiAJCXJldHVybiAxOwogCX0KIAogCWlmICh2aWQgIT0gZGF0YS0+Y3VycnZpZCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2aWQgdHJhbnMgZmFpbGVkLCB2aWQgMHgleCwgY3VyciAweCV4XG4iLCB2aWQsCi0JCQkJZGF0YS0+Y3VycnZpZCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInZpZCB0cmFucyBmYWlsZWQsIHZpZCAweCV4LCAiCisJCQkJImN1cnIgMHgleFxuIiwKKwkJCQl2aWQsIGRhdGEtPmN1cnJ2aWQpOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTI2MSw3ICsyNzIsOCBAQAogICogRGVjcmVhc2luZyB2aWQgY29kZXMgcmVwcmVzZW50IGluY3JlYXNpbmcgdm9sdGFnZXM6CiAgKiB2aWQgb2YgMCBpcyAxLjU1MFYsIHZpZCBvZiAweDFlIGlzIDAuODAwViwgdmlkIG9mIFZJRF9PRkYgaXMgb2ZmLgogICovCi1zdGF0aWMgaW50IGRlY3JlYXNlX3ZpZF9jb2RlX2J5X3N0ZXAoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiByZXF2aWQsIHUzMiBzdGVwKQorc3RhdGljIGludCBkZWNyZWFzZV92aWRfY29kZV9ieV9zdGVwKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLAorCQl1MzIgcmVxdmlkLCB1MzIgc3RlcCkKIHsKIAlpZiAoKGRhdGEtPmN1cnJ2aWQgLSByZXF2aWQpID4gc3RlcCkKIAkJcmVxdmlkID0gZGF0YS0+Y3VycnZpZCAtIHN0ZXA7CkBAIC0yODMsNyArMjk1LDggQEAKIH0KIAogLyogQ2hhbmdlIE9wdGVyb24vQXRobG9uNjQgZmlkIGFuZCB2aWQsIGJ5IHRoZSAzIHBoYXNlcy4gKi8KLXN0YXRpYyBpbnQgdHJhbnNpdGlvbl9maWRfdmlkKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgcmVxZmlkLCB1MzIgcmVxdmlkKQorc3RhdGljIGludCB0cmFuc2l0aW9uX2ZpZF92aWQoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsCisJCXUzMiByZXFmaWQsIHUzMiByZXF2aWQpCiB7CiAJaWYgKGNvcmVfdm9sdGFnZV9wcmVfdHJhbnNpdGlvbihkYXRhLCByZXF2aWQpKQogCQlyZXR1cm4gMTsKQEAgLTI5OCw3ICszMTEsOCBAQAogCQlyZXR1cm4gMTsKIAogCWlmICgocmVxZmlkICE9IGRhdGEtPmN1cnJmaWQpIHx8IChyZXF2aWQgIT0gZGF0YS0+Y3VycnZpZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGVkIChjcHUlZCk6IHJlcSAweCV4IDB4JXgsIGN1cnIgMHgleCAweCV4XG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgKGNwdSVkKTogcmVxIDB4JXggMHgleCwgIgorCQkJCSJjdXJyIDB4JXggMHgleFxuIiwKIAkJCQlzbXBfcHJvY2Vzc29yX2lkKCksCiAJCQkJcmVxZmlkLCByZXF2aWQsIGRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOwogCQlyZXR1cm4gMTsKQEAgLTMxMSwxMyArMzI1LDE1IEBACiB9CiAKIC8qIFBoYXNlIDEgLSBjb3JlIHZvbHRhZ2UgdHJhbnNpdGlvbiAuLi4gc2V0dXAgdm9sdGFnZSAqLwotc3RhdGljIGludCBjb3JlX3ZvbHRhZ2VfcHJlX3RyYW5zaXRpb24oc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiByZXF2aWQpCitzdGF0aWMgaW50IGNvcmVfdm9sdGFnZV9wcmVfdHJhbnNpdGlvbihzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwKKwkJdTMyIHJlcXZpZCkKIHsKIAl1MzIgcnZvc3RlcHMgPSBkYXRhLT5ydm87CiAJdTMyIHNhdmVmaWQgPSBkYXRhLT5jdXJyZmlkOwogCXUzMiBtYXh2aWQsIGxvOwogCi0JZHByaW50aygicGgxIChjcHUlZCk6IHN0YXJ0LCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleCwgcmVxdmlkIDB4JXgsIHJ2byAweCV4XG4iLAorCWRwcmludGsoInBoMSAoY3B1JWQpOiBzdGFydCwgY3VycmZpZCAweCV4LCBjdXJydmlkIDB4JXgsICIKKwkJInJlcXZpZCAweCV4LCBydm8gMHgleFxuIiwKIAkJc21wX3Byb2Nlc3Nvcl9pZCgpLAogCQlkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkLCByZXF2aWQsIGRhdGEtPnJ2byk7CiAKQEAgLTM0MCw3ICszNTYsNyBAQAogCQl9IGVsc2UgewogCQkJZHByaW50aygicGgxOiBjaGFuZ2luZyB2aWQgZm9yIHJ2bywgcmVxIDB4JXhcbiIsCiAJCQkJZGF0YS0+Y3VycnZpZCAtIDEpOwotCQkJaWYgKGRlY3JlYXNlX3ZpZF9jb2RlX2J5X3N0ZXAoZGF0YSwgZGF0YS0+Y3VycnZpZCAtIDEsIDEpKQorCQkJaWYgKGRlY3JlYXNlX3ZpZF9jb2RlX2J5X3N0ZXAoZGF0YSwgZGF0YS0+Y3VycnZpZC0xLCAxKSkKIAkJCQlyZXR1cm4gMTsKIAkJCXJ2b3N0ZXBzLS07CiAJCX0KQEAgLTM1MCw3ICszNjYsOCBAQAogCQlyZXR1cm4gMTsKIAogCWlmIChzYXZlZmlkICE9IGRhdGEtPmN1cnJmaWQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicGgxIGVyciwgY3VycmZpZCBjaGFuZ2VkIDB4JXhcbiIsIGRhdGEtPmN1cnJmaWQpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJwaDEgZXJyLCBjdXJyZmlkIGNoYW5nZWQgMHgleFxuIiwKKwkJCQlkYXRhLT5jdXJyZmlkKTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC0zNjMsMjAgKzM4MCwyNCBAQAogLyogUGhhc2UgMiAtIGNvcmUgZnJlcXVlbmN5IHRyYW5zaXRpb24gKi8KIHN0YXRpYyBpbnQgY29yZV9mcmVxdWVuY3lfdHJhbnNpdGlvbihzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdTMyIHJlcWZpZCkKIHsKLQl1MzIgdmNvcmVxZmlkLCB2Y29jdXJyZmlkLCB2Y29maWRkaWZmLCBmaWRfaW50ZXJ2YWwsIHNhdmV2aWQgPSBkYXRhLT5jdXJydmlkOworCXUzMiB2Y29yZXFmaWQsIHZjb2N1cnJmaWQsIHZjb2ZpZGRpZmY7CisJdTMyIGZpZF9pbnRlcnZhbCwgc2F2ZXZpZCA9IGRhdGEtPmN1cnJ2aWQ7CiAKLQlpZiAoKHJlcWZpZCA8IEhJX0ZJRF9UQUJMRV9CT1RUT00pICYmIChkYXRhLT5jdXJyZmlkIDwgSElfRklEX1RBQkxFX0JPVFRPTSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicGgyOiBpbGxlZ2FsIGxvLWxvIHRyYW5zaXRpb24gMHgleCAweCV4XG4iLAotCQkJcmVxZmlkLCBkYXRhLT5jdXJyZmlkKTsKKwlpZiAoKHJlcWZpZCA8IEhJX0ZJRF9UQUJMRV9CT1RUT00pICYmCisJICAgIChkYXRhLT5jdXJyZmlkIDwgSElfRklEX1RBQkxFX0JPVFRPTSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicGgyOiBpbGxlZ2FsIGxvLWxvIHRyYW5zaXRpb24gIgorCQkJCSIweCV4IDB4JXhcbiIsIHJlcWZpZCwgZGF0YS0+Y3VycmZpZCk7CiAJCXJldHVybiAxOwogCX0KIAogCWlmIChkYXRhLT5jdXJyZmlkID09IHJlcWZpZCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJwaDIgbnVsbCBmaWQgdHJhbnNpdGlvbiAweCV4XG4iLCBkYXRhLT5jdXJyZmlkKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicGgyIG51bGwgZmlkIHRyYW5zaXRpb24gMHgleFxuIiwKKwkJCQlkYXRhLT5jdXJyZmlkKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZHByaW50aygicGgyIChjcHUlZCk6IHN0YXJ0aW5nLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleCwgcmVxZmlkIDB4JXhcbiIsCisJZHByaW50aygicGgyIChjcHUlZCk6IHN0YXJ0aW5nLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleCwgIgorCQkicmVxZmlkIDB4JXhcbiIsCiAJCXNtcF9wcm9jZXNzb3JfaWQoKSwKIAkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCwgcmVxZmlkKTsKIApAQCAtMzkwLDE0ICs0MTEsMTQgQEAKIAogCQlpZiAocmVxZmlkID4gZGF0YS0+Y3VycmZpZCkgewogCQkJaWYgKGRhdGEtPmN1cnJmaWQgPiBMT19GSURfVEFCTEVfVE9QKSB7Ci0JCQkJaWYgKHdyaXRlX25ld19maWQoZGF0YSwgZGF0YS0+Y3VycmZpZCArIGZpZF9pbnRlcnZhbCkpIHsKKwkJCQlpZiAod3JpdGVfbmV3X2ZpZChkYXRhLAorCQkJCQkJZGF0YS0+Y3VycmZpZCArIGZpZF9pbnRlcnZhbCkpCiAJCQkJCXJldHVybiAxOwotCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJaWYgKHdyaXRlX25ld19maWQKLQkJCQkgICAgKGRhdGEsIDIgKyBjb252ZXJ0X2ZpZF90b192Y29fZmlkKGRhdGEtPmN1cnJmaWQpKSkgeworCQkJCSAgICAoZGF0YSwKKwkJCQkgICAgIDIgKyBjb252ZXJ0X2ZpZF90b192Y29fZmlkKGRhdGEtPmN1cnJmaWQpKSkKIAkJCQkJcmV0dXJuIDE7Ci0JCQkJfQogCQkJfQogCQl9IGVsc2UgewogCQkJaWYgKHdyaXRlX25ld19maWQoZGF0YSwgZGF0YS0+Y3VycmZpZCAtIGZpZF9pbnRlcnZhbCkpCkBAIC00MTcsNyArNDM4LDggQEAKIAogCWlmIChkYXRhLT5jdXJyZmlkICE9IHJlcWZpZCkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkicGgyOiBtaXNtYXRjaCwgZmFpbGVkIGZpZCB0cmFuc2l0aW9uLCBjdXJyIDB4JXgsIHJlcSAweCV4XG4iLAorCQkJInBoMjogbWlzbWF0Y2gsIGZhaWxlZCBmaWQgdHJhbnNpdGlvbiwgIgorCQkJImN1cnIgMHgleCwgcmVxIDB4JXhcbiIsCiAJCQlkYXRhLT5jdXJyZmlkLCByZXFmaWQpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC00MzUsNyArNDU3LDggQEAKIH0KIAogLyogUGhhc2UgMyAtIGNvcmUgdm9sdGFnZSB0cmFuc2l0aW9uIGZsb3cgLi4uIGp1bXAgdG8gdGhlIGZpbmFsIHZpZC4gKi8KLXN0YXRpYyBpbnQgY29yZV92b2x0YWdlX3Bvc3RfdHJhbnNpdGlvbihzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdTMyIHJlcXZpZCkKK3N0YXRpYyBpbnQgY29yZV92b2x0YWdlX3Bvc3RfdHJhbnNpdGlvbihzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwKKwkJdTMyIHJlcXZpZCkKIHsKIAl1MzIgc2F2ZWZpZCA9IGRhdGEtPmN1cnJmaWQ7CiAJdTMyIHNhdmVyZXF2aWQgPSByZXF2aWQ7CkBAIC00NTcsNyArNDgwLDggQEAKIAogCQlpZiAoZGF0YS0+Y3VycnZpZCAhPSByZXF2aWQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJCSAgICAgICAicGgzOiBmYWlsZWQgdmlkIHRyYW5zaXRpb25cbiwgcmVxIDB4JXgsIGN1cnIgMHgleCIsCisJCQkgICAgICAgInBoMzogZmFpbGVkIHZpZCB0cmFuc2l0aW9uXG4sICIKKwkJCSAgICAgICAicmVxIDB4JXgsIGN1cnIgMHgleCIsCiAJCQkgICAgICAgcmVxdmlkLCBkYXRhLT5jdXJydmlkKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC01MDgsNyArNTMyLDggQEAKIAlpZiAoKGVheCAmIENQVUlEX1hGQU0pID09IENQVUlEX1hGQU1fSzgpIHsKIAkJaWYgKCgoZWF4ICYgQ1BVSURfVVNFX1hGQU1fWE1PRCkgIT0gQ1BVSURfVVNFX1hGQU1fWE1PRCkgfHwKIAkJICAgICgoZWF4ICYgQ1BVSURfWE1PRCkgPiBDUFVJRF9YTU9EX1JFVl9NQVNLKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlByb2Nlc3NvciBjcHVpZCAleCBub3Qgc3VwcG9ydGVkXG4iLCBlYXgpOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlgKKwkJCQkiUHJvY2Vzc29yIGNwdWlkICV4IG5vdCBzdXBwb3J0ZWRcbiIsIGVheCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC01MjAsOCArNTQ1LDEwIEBACiAJCX0KIAogCQljcHVpZChDUFVJRF9GUkVRX1ZPTFRfQ0FQQUJJTElUSUVTLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKLQkJaWYgKChlZHggJiBQX1NUQVRFX1RSQU5TSVRJT05fQ0FQQUJMRSkgIT0gUF9TVEFURV9UUkFOU0lUSU9OX0NBUEFCTEUpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gUEZYICJQb3dlciBzdGF0ZSB0cmFuc2l0aW9ucyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJaWYgKChlZHggJiBQX1NUQVRFX1RSQU5TSVRJT05fQ0FQQUJMRSkKKwkJCSE9IFBfU1RBVEVfVFJBTlNJVElPTl9DQVBBQkxFKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWAorCQkJCSJQb3dlciBzdGF0ZSB0cmFuc2l0aW9ucyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfSBlbHNlIHsgLyogbXVzdCBiZSBhIEhXIFBzdGF0ZSBjYXBhYmxlIHByb2Nlc3NvciAqLwpAQCAtNTM5LDcgKzU2Niw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGNoZWNrX3BzdF90YWJsZShzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgc3RydWN0IHBzdF9zICpwc3QsIHU4IG1heHZpZCkKK3N0YXRpYyBpbnQgY2hlY2tfcHN0X3RhYmxlKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCBzdHJ1Y3QgcHN0X3MgKnBzdCwKKwkJdTggbWF4dmlkKQogewogCXVuc2lnbmVkIGludCBqOwogCXU4IGxhc3RmaWQgPSAweGZmOwpAQCAtNTUwLDEyICs1NzgsMTQgQEAKIAkJCSAgICAgICBqLCBwc3Rbal0udmlkKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWlmIChwc3Rbal0udmlkIDwgZGF0YS0+cnZvKSB7CS8qIHZpZCArIHJ2byA+PSAwICovCisJCWlmIChwc3Rbal0udmlkIDwgZGF0YS0+cnZvKSB7CisJCQkvKiB2aWQgKyBydm8gPj0gMCAqLwogCQkJcHJpbnRrKEtFUk5fRVJSIEZXX0JVRyBQRlggIjAgdmlkIGV4Y2VlZGVkIHdpdGggcHN0YXRlIgogCQkJICAgICAgICIgJWRcbiIsIGopOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KLQkJaWYgKHBzdFtqXS52aWQgPCBtYXh2aWQgKyBkYXRhLT5ydm8pIHsJLyogdmlkICsgcnZvID49IG1heHZpZCAqLworCQlpZiAocHN0W2pdLnZpZCA8IG1heHZpZCArIGRhdGEtPnJ2bykgeworCQkJLyogdmlkICsgcnZvID49IG1heHZpZCAqLwogCQkJcHJpbnRrKEtFUk5fRVJSIEZXX0JVRyBQRlggIm1heHZpZCBleGNlZWRlZCB3aXRoIHBzdGF0ZSIKIAkJCSAgICAgICAiICVkXG4iLCBqKTsKIAkJCXJldHVybiAtRU5PREVWOwpAQCAtNTc5LDIzICs2MDksMzEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChsYXN0ZmlkID4gTE9fRklEX1RBQkxFX1RPUCkKLQkJcHJpbnRrKEtFUk5fSU5GTyBGV19CVUcgUEZYICAiZmlyc3QgZmlkIG5vdCBmcm9tIGxvIGZyZXEgdGFibGVcbiIpOworCQlwcmludGsoS0VSTl9JTkZPIEZXX0JVRyBQRlgKKwkJCSJmaXJzdCBmaWQgbm90IGZyb20gbG8gZnJlcSB0YWJsZVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9lbnRyeShzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGVudHJ5KQoreworCWRhdGEtPnBvd2Vybm93X3RhYmxlW2VudHJ5XS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7Cit9CisKIHN0YXRpYyB2b2lkIHByaW50X2Jhc2ljcyhzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkKIHsKIAlpbnQgajsKIAlmb3IgKGogPSAwOyBqIDwgZGF0YS0+bnVtcHM7IGorKykgewotCQlpZiAoZGF0YS0+cG93ZXJub3dfdGFibGVbal0uZnJlcXVlbmN5ICE9IENQVUZSRVFfRU5UUllfSU5WQUxJRCkgeworCQlpZiAoZGF0YS0+cG93ZXJub3dfdGFibGVbal0uZnJlcXVlbmN5ICE9CisJCQkJQ1BVRlJFUV9FTlRSWV9JTlZBTElEKSB7CiAJCQlpZiAoY3B1X2ZhbWlseSA9PSBDUFVfSFdfUFNUQVRFKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiAgICVkIDogcHN0YXRlICVkICglZCBNSHopXG4iLAotCQkJCQlqLAorCQkJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCQkJCSIgICAlZCA6IHBzdGF0ZSAlZCAoJWQgTUh6KVxuIiwgaiwKIAkJCQkJZGF0YS0+cG93ZXJub3dfdGFibGVbal0uaW5kZXgsCiAJCQkJCWRhdGEtPnBvd2Vybm93X3RhYmxlW2pdLmZyZXF1ZW5jeS8xMDAwKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiAgICVkIDogZmlkIDB4JXggKCVkIE1IeiksIHZpZCAweCV4XG4iLAorCQkJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCQkJCSIgICAlZCA6IGZpZCAweCV4ICglZCBNSHopLCB2aWQgMHgleFxuIiwKIAkJCQkJaiwKIAkJCQkJZGF0YS0+cG93ZXJub3dfdGFibGVbal0uaW5kZXggJiAweGZmLAogCQkJCQlkYXRhLT5wb3dlcm5vd190YWJsZVtqXS5mcmVxdWVuY3kvMTAwMCwKQEAgLTYwNCwyMCArNjQyLDI1IEBACiAJCX0KIAl9CiAJaWYgKGRhdGEtPmJhdHBzKQotCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiT25seSAlZCBwc3RhdGVzIG9uIGJhdHRlcnlcbiIsIGRhdGEtPmJhdHBzKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIk9ubHkgJWQgcHN0YXRlcyBvbiBiYXR0ZXJ5XG4iLAorCQkJCWRhdGEtPmJhdHBzKTsKIH0KIAotc3RhdGljIGludCBmaWxsX3Bvd2Vybm93X3RhYmxlKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCBzdHJ1Y3QgcHN0X3MgKnBzdCwgdTggbWF4dmlkKQorc3RhdGljIGludCBmaWxsX3Bvd2Vybm93X3RhYmxlKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLAorCQlzdHJ1Y3QgcHN0X3MgKnBzdCwgdTggbWF4dmlkKQogewogCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqcG93ZXJub3dfdGFibGU7CiAJdW5zaWduZWQgaW50IGo7CiAKLQlpZiAoZGF0YS0+YmF0cHMpIHsgICAgLyogdXNlIEFDUEkgc3VwcG9ydCB0byBnZXQgZnVsbCBzcGVlZCBvbiBtYWlucyBwb3dlciAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiT25seSAlZCBwc3RhdGVzIHVzYWJsZSAodXNlIEFDUEkgZHJpdmVyIGZvciBmdWxsIHJhbmdlXG4iLCBkYXRhLT5iYXRwcyk7CisJaWYgKGRhdGEtPmJhdHBzKSB7CisJCS8qIHVzZSBBQ1BJIHN1cHBvcnQgdG8gZ2V0IGZ1bGwgc3BlZWQgb24gbWFpbnMgcG93ZXIgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJCSJPbmx5ICVkIHBzdGF0ZXMgdXNhYmxlICh1c2UgQUNQSSBkcml2ZXIgZm9yIGZ1bGwgIgorCQkJInJhbmdlXG4iLCBkYXRhLT5iYXRwcyk7CiAJCWRhdGEtPm51bXBzID0gZGF0YS0+YmF0cHM7CiAJfQogCi0JZm9yICggaj0xOyBqPGRhdGEtPm51bXBzOyBqKysgKSB7CisJZm9yIChqID0gMTsgaiA8IGRhdGEtPm51bXBzOyBqKyspIHsKIAkJaWYgKHBzdFtqLTFdLmZpZCA+PSBwc3Rbal0uZmlkKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJQU1Qgb3V0IG9mIHNlcXVlbmNlXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtNjQwLDkgKzY4MywxMSBAQAogCX0KIAogCWZvciAoaiA9IDA7IGogPCBkYXRhLT5udW1wczsgaisrKSB7CisJCWludCBmcmVxOwogCQlwb3dlcm5vd190YWJsZVtqXS5pbmRleCA9IHBzdFtqXS5maWQ7IC8qIGxvd2VyIDggYml0cyAqLwogCQlwb3dlcm5vd190YWJsZVtqXS5pbmRleCB8PSAocHN0W2pdLnZpZCA8PCA4KTsgLyogdXBwZXIgOCBiaXRzICovCi0JCXBvd2Vybm93X3RhYmxlW2pdLmZyZXF1ZW5jeSA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQocHN0W2pdLmZpZCk7CisJCWZyZXEgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKHBzdFtqXS5maWQpOworCQlwb3dlcm5vd190YWJsZVtqXS5mcmVxdWVuY3kgPSBmcmVxOwogCX0KIAlwb3dlcm5vd190YWJsZVtkYXRhLT5udW1wc10uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CiAJcG93ZXJub3dfdGFibGVbZGF0YS0+bnVtcHNdLmluZGV4ID0gMDsKQEAgLTY1OCw3ICs3MDMsOCBAQAogCQlwcmludF9iYXNpY3MoZGF0YSk7CiAKIAlmb3IgKGogPSAwOyBqIDwgZGF0YS0+bnVtcHM7IGorKykKLQkJaWYgKChwc3Rbal0uZmlkPT1kYXRhLT5jdXJyZmlkKSAmJiAocHN0W2pdLnZpZD09ZGF0YS0+Y3VycnZpZCkpCisJCWlmICgocHN0W2pdLmZpZCA9PSBkYXRhLT5jdXJyZmlkKSAmJgorCQkgICAgKHBzdFtqXS52aWQgPT0gZGF0YS0+Y3VycnZpZCkpCiAJCQlyZXR1cm4gMDsKIAogCWRwcmludGsoImN1cnJmaWQvdmlkIGRvIG5vdCBtYXRjaCBQU1QsIGlnbm9yaW5nXG4iKTsKQEAgLTY5OCw3ICs3NDQsOCBAQAogCQl9CiAKIAkJZGF0YS0+dnN0YWJsZSA9IHBzYi0+dnN0YWJsZTsKLQkJZHByaW50aygidm9sdGFnZSBzdGFiaWxpemF0aW9uIHRpbWU6ICVkKCoyMHVzKVxuIiwgZGF0YS0+dnN0YWJsZSk7CisJCWRwcmludGsoInZvbHRhZ2Ugc3RhYmlsaXphdGlvbiB0aW1lOiAlZCgqMjB1cylcbiIsCisJCQkJZGF0YS0+dnN0YWJsZSk7CiAKIAkJZHByaW50aygiZmxhZ3MyOiAweCV4XG4iLCBwc2ItPmZsYWdzMik7CiAJCWRhdGEtPnJ2byA9IHBzYi0+ZmxhZ3MyICYgMzsKQEAgLTcxMywxMSArNzYwLDEyIEBACiAKIAkJZHByaW50aygibnVtcHN0OiAweCV4XG4iLCBwc2ItPm51bV90YWJsZXMpOwogCQljcHN0ID0gcHNiLT5udW1fdGFibGVzOwotCQlpZiAoKHBzYi0+Y3B1aWQgPT0gMHgwMDAwMGZjMCkgfHwgKHBzYi0+Y3B1aWQgPT0gMHgwMDAwMGZlMCkgKXsKKwkJaWYgKChwc2ItPmNwdWlkID09IDB4MDAwMDBmYzApIHx8CisJCSAgICAocHNiLT5jcHVpZCA9PSAweDAwMDAwZmUwKSkgewogCQkJdGhpc2NwdWlkID0gY3B1aWRfZWF4KENQVUlEX1BST0NFU1NPUl9TSUdOQVRVUkUpOwotCQkJaWYgKCh0aGlzY3B1aWQgPT0gMHgwMDAwMGZjMCkgfHwgKHRoaXNjcHVpZCA9PSAweDAwMDAwZmUwKSApIHsKKwkJCWlmICgodGhpc2NwdWlkID09IDB4MDAwMDBmYzApIHx8CisJCQkgICAgKHRoaXNjcHVpZCA9PSAweDAwMDAwZmUwKSkKIAkJCQljcHN0ID0gMTsKLQkJCX0KIAkJfQogCQlpZiAoY3BzdCAhPSAxKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgRldfQlVHIFBGWCAibnVtcHN0IG11c3QgYmUgMVxuIik7CkBAIC03MzIsNyArNzgwLDggQEAKIAogCQlkYXRhLT5udW1wcyA9IHBzYi0+bnVtcHM7CiAJCWRwcmludGsoIm51bXBzdGF0ZXM6IDB4JXhcbiIsIGRhdGEtPm51bXBzKTsKLQkJcmV0dXJuIGZpbGxfcG93ZXJub3dfdGFibGUoZGF0YSwgKHN0cnVjdCBwc3RfcyAqKShwc2IrMSksIG1heHZpZCk7CisJCXJldHVybiBmaWxsX3Bvd2Vybm93X3RhYmxlKGRhdGEsCisJCQkJKHN0cnVjdCBwc3RfcyAqKShwc2IrMSksIG1heHZpZCk7CiAJfQogCS8qCiAJICogSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIGNvbXBsYWluIHRvIEJJT1MgbWFudWZhY3R1cmVyLiBJZgpAQCAtNzQ1LDI4ICs3OTQsMzEgQEAKIAkgKiBCSU9TIGFuZCBLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUsIHdoaWNoIGlzIGF2YWlsYWJsZSBvbgogCSAqIHd3dy5hbWQuY29tCiAJICovCi0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiQklPUyBlcnJvciAtIG5vIFBTQiBvciBBQ1BJIF9QU1Mgb2JqZWN0c1xuIik7CisJcHJpbnRrKEtFUk5fRVJSIEZXX0JVRyBQRlggIk5vIFBTQiBvciBBQ1BJIF9QU1Mgb2JqZWN0c1xuIik7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLSNpZmRlZiBDT05GSUdfWDg2X1BPV0VSTk9XX0s4X0FDUEkKLXN0YXRpYyB2b2lkIHBvd2Vybm93X2s4X2FjcGlfcHN0X3ZhbHVlcyhzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGluZGV4KQorc3RhdGljIHZvaWQgcG93ZXJub3dfazhfYWNwaV9wc3RfdmFsdWVzKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLAorCQl1bnNpZ25lZCBpbnQgaW5kZXgpCiB7CisJYWNwaV9pbnRlZ2VyIGNvbnRyb2w7CisKIAlpZiAoIWRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCB8fCAoY3B1X2ZhbWlseSA9PSBDUFVfSFdfUFNUQVRFKSkKIAkJcmV0dXJuOwogCi0JZGF0YS0+aXJ0ID0gKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaW5kZXhdLmNvbnRyb2wgPj4gSVJUX1NISUZUKSAmIElSVF9NQVNLOwotCWRhdGEtPnJ2byA9IChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2luZGV4XS5jb250cm9sID4+IFJWT19TSElGVCkgJiBSVk9fTUFTSzsKLQlkYXRhLT5leHR0eXBlID0gKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaW5kZXhdLmNvbnRyb2wgPj4gRVhUX1RZUEVfU0hJRlQpICYgRVhUX1RZUEVfTUFTSzsKLQlkYXRhLT5wbGxsb2NrID0gKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaW5kZXhdLmNvbnRyb2wgPj4gUExMX0xfU0hJRlQpICYgUExMX0xfTUFTSzsKLQlkYXRhLT52aWRtdnMgPSAxIDw8ICgoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpbmRleF0uY29udHJvbCA+PiBNVlNfU0hJRlQpICYgTVZTX01BU0spOwotCWRhdGEtPnZzdGFibGUgPSAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpbmRleF0uY29udHJvbCA+PiBWU1RfU0hJRlQpICYgVlNUX01BU0s7Ci19CisJY29udHJvbCA9IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaW5kZXhdLmNvbnRyb2w7IGRhdGEtPmlydCA9IChjb250cm9sCisJCQk+PiBJUlRfU0hJRlQpICYgSVJUX01BU0s7IGRhdGEtPnJ2byA9IChjb250cm9sID4+CisJCQkJUlZPX1NISUZUKSAmIFJWT19NQVNLOyBkYXRhLT5leHR0eXBlID0gKGNvbnRyb2wKKwkJCQkJPj4gRVhUX1RZUEVfU0hJRlQpICYgRVhUX1RZUEVfTUFTSzsKKwlkYXRhLT5wbGxsb2NrID0gKGNvbnRyb2wgPj4gUExMX0xfU0hJRlQpICYgUExMX0xfTUFTSzsgZGF0YS0+dmlkbXZzID0gMQorCQk8PCAoKGNvbnRyb2wgPj4gTVZTX1NISUZUKSAmIE1WU19NQVNLKTsgZGF0YS0+dnN0YWJsZSA9CisJCShjb250cm9sID4+IFZTVF9TSElGVCkgJiBWU1RfTUFTSzsgfQogCiBzdGF0aWMgaW50IHBvd2Vybm93X2s4X2NwdV9pbml0X2FjcGkoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpwb3dlcm5vd190YWJsZTsKIAlpbnQgcmV0X3ZhbCA9IC1FTk9ERVY7CisJYWNwaV9pbnRlZ2VyIHNwYWNlX2lkOwogCiAJaWYgKGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKCZkYXRhLT5hY3BpX2RhdGEsIGRhdGEtPmNwdSkpIHsKIAkJZHByaW50aygicmVnaXN0ZXIgcGVyZm9ybWFuY2UgZmFpbGVkOiBiYWQgQUNQSSBkYXRhXG4iKTsKQEAgLTc3OSwxMSArODMxLDEyIEBACiAJCWdvdG8gZXJyX291dDsKIAl9CiAKLQlpZiAoKGRhdGEtPmFjcGlfZGF0YS5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSB8fAotCQkoZGF0YS0+YWNwaV9kYXRhLnN0YXR1c19yZWdpc3Rlci5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkpIHsKKwlzcGFjZV9pZCA9IGRhdGEtPmFjcGlfZGF0YS5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkOworCWlmICgoc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpIHx8CisJCShzcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkpIHsKIAkJZHByaW50aygiSW52YWxpZCBjb250cm9sL3N0YXR1cyByZWdpc3RlcnMgKCV4IC0gJXgpXG4iLAogCQkJZGF0YS0+YWNwaV9kYXRhLmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQsCi0JCQlkYXRhLT5hY3BpX2RhdGEuc3RhdHVzX3JlZ2lzdGVyLnNwYWNlX2lkKTsKKwkJCXNwYWNlX2lkKTsKIAkJZ290byBlcnJfb3V0OwogCX0KIApAQCAtODAyLDcgKzg1NSw4IEBACiAJaWYgKHJldF92YWwpCiAJCWdvdG8gZXJyX291dF9tZW07CiAKLQlwb3dlcm5vd190YWJsZVtkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnRdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCXBvd2Vybm93X3RhYmxlW2RhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudF0uZnJlcXVlbmN5ID0KKwkJQ1BVRlJFUV9UQUJMRV9FTkQ7CiAJcG93ZXJub3dfdGFibGVbZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50XS5pbmRleCA9IDA7CiAJZGF0YS0+cG93ZXJub3dfdGFibGUgPSBwb3dlcm5vd190YWJsZTsKIApAQCAtODMwLDEzICs4ODQsMTUgQEAKIGVycl9vdXQ6CiAJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZSgmZGF0YS0+YWNwaV9kYXRhLCBkYXRhLT5jcHUpOwogCi0JLyogZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50IGluZm9ybXMgdXMgYXQgLT5leGl0KCkgd2hldGhlciBBQ1BJIHdhcyB1c2VkICovCisJLyogZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50IGluZm9ybXMgdXMgYXQgLT5leGl0KCkKKwkgKiB3aGV0aGVyIEFDUEkgd2FzIHVzZWQgKi8KIAlkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQgPSAwOwogCiAJcmV0dXJuIHJldF92YWw7CiB9CiAKLXN0YXRpYyBpbnQgZmlsbF9wb3dlcm5vd190YWJsZV9wc3RhdGUoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqcG93ZXJub3dfdGFibGUpCitzdGF0aWMgaW50IGZpbGxfcG93ZXJub3dfdGFibGVfcHN0YXRlKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLAorCQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnBvd2Vybm93X3RhYmxlKQogewogCWludCBpOwogCXUzMiBoaSA9IDAsIGxvID0gMDsKQEAgLTg0OCw4NCArOTA0LDEwMSBAQAogCiAJCWluZGV4ID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb250cm9sICYgSFdfUFNUQVRFX01BU0s7CiAJCWlmIChpbmRleCA+IGRhdGEtPm1heF9od19wc3RhdGUpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlggImludmFsaWQgcHN0YXRlICVkIC0gYmFkIHZhbHVlICVkLlxuIiwgaSwgaW5kZXgpOwotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUGxlYXNlIHJlcG9ydCB0byBCSU9TIG1hbnVmYWN0dXJlclxuIik7Ci0JCQlwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbnZhbGlkIHBzdGF0ZSAlZCAtICIKKwkJCQkJImJhZCB2YWx1ZSAlZC5cbiIsIGksIGluZGV4KTsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIlBsZWFzZSByZXBvcnQgdG8gQklPUyAiCisJCQkJCSJtYW51ZmFjdHVyZXJcbiIpOworCQkJaW52YWxpZGF0ZV9lbnRyeShkYXRhLCBpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXJkbXNyKE1TUl9QU1RBVEVfREVGX0JBU0UgKyBpbmRleCwgbG8sIGhpKTsKIAkJaWYgKCEoaGkgJiBIV19QU1RBVEVfVkFMSURfTUFTSykpIHsKIAkJCWRwcmludGsoImludmFsaWQgcHN0YXRlICVkLCBpZ25vcmluZ1xuIiwgaW5kZXgpOwotCQkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworCQkJaW52YWxpZGF0ZV9lbnRyeShkYXRhLCBpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJcG93ZXJub3dfdGFibGVbaV0uaW5kZXggPSBpbmRleDsKIAotCQlwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKKwkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0KKwkJCWRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmaWxsX3Bvd2Vybm93X3RhYmxlX2ZpZHZpZChzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpwb3dlcm5vd190YWJsZSkKK3N0YXRpYyBpbnQgZmlsbF9wb3dlcm5vd190YWJsZV9maWR2aWQoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsCisJCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqcG93ZXJub3dfdGFibGUpCiB7CiAJaW50IGk7CiAJaW50IGNudGxvZnJlcSA9IDA7CisKIAlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50OyBpKyspIHsKIAkJdTMyIGZpZDsKIAkJdTMyIHZpZDsKKwkJdTMyIGZyZXEsIGluZGV4OworCQlhY3BpX2ludGVnZXIgc3RhdHVzLCBjb250cm9sOwogCiAJCWlmIChkYXRhLT5leHR0eXBlKSB7Ci0JCQlmaWQgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLnN0YXR1cyAmIEVYVF9GSURfTUFTSzsKLQkJCXZpZCA9IChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLnN0YXR1cyA+PiBWSURfU0hJRlQpICYgRVhUX1ZJRF9NQVNLOworCQkJc3RhdHVzID0gIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0uc3RhdHVzOworCQkJZmlkID0gc3RhdHVzICYgRVhUX0ZJRF9NQVNLOworCQkJdmlkID0gKHN0YXR1cyA+PiBWSURfU0hJRlQpICYgRVhUX1ZJRF9NQVNLOwogCQl9IGVsc2UgewotCQkJZmlkID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb250cm9sICYgRklEX01BU0s7Ci0JCQl2aWQgPSAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb250cm9sID4+IFZJRF9TSElGVCkgJiBWSURfTUFTSzsKKwkJCWNvbnRyb2wgPSAgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb250cm9sOworCQkJZmlkID0gY29udHJvbCAmIEZJRF9NQVNLOworCQkJdmlkID0gKGNvbnRyb2wgPj4gVklEX1NISUZUKSAmIFZJRF9NQVNLOwogCQl9CiAKIAkJZHByaW50aygiICAgJWQgOiBmaWQgMHgleCwgdmlkIDB4JXhcbiIsIGksIGZpZCwgdmlkKTsKIAotCQlwb3dlcm5vd190YWJsZVtpXS5pbmRleCA9IGZpZDsgLyogbG93ZXIgOCBiaXRzICovCi0JCXBvd2Vybm93X3RhYmxlW2ldLmluZGV4IHw9ICh2aWQgPDwgOCk7IC8qIHVwcGVyIDggYml0cyAqLwotCQlwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGZpZCk7CisJCWluZGV4ID0gZmlkIHwgKHZpZDw8OCk7CisJCXBvd2Vybm93X3RhYmxlW2ldLmluZGV4ID0gaW5kZXg7CisKKwkJZnJlcSA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZmlkKTsKKwkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gZnJlcTsKIAogCQkvKiB2ZXJpZnkgZnJlcXVlbmN5IGlzIE9LICovCi0JCWlmICgocG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID4gKE1BWF9GUkVRICogMTAwMCkpIHx8Ci0JCQkocG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5IDwgKE1JTl9GUkVRICogMTAwMCkpKSB7Ci0JCQlkcHJpbnRrKCJpbnZhbGlkIGZyZXEgJXUga0h6LCBpZ25vcmluZ1xuIiwgcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5KTsKLQkJCXBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfRU5UUllfSU5WQUxJRDsKKwkJaWYgKChmcmVxID4gKE1BWF9GUkVRICogMTAwMCkpIHx8IChmcmVxIDwgKE1JTl9GUkVRICogMTAwMCkpKSB7CisJCQlkcHJpbnRrKCJpbnZhbGlkIGZyZXEgJXUga0h6LCBpZ25vcmluZ1xuIiwgZnJlcSk7CisJCQlpbnZhbGlkYXRlX2VudHJ5KGRhdGEsIGkpOwogCQkJY29udGludWU7CiAJCX0KIAotCQkvKiB2ZXJpZnkgdm9sdGFnZSBpcyBPSyAtIEJJT1NzIGFyZSB1c2luZyAib2ZmIiB0byBpbmRpY2F0ZSBpbnZhbGlkICovCisJCS8qIHZlcmlmeSB2b2x0YWdlIGlzIE9LIC0KKwkJICogQklPU3MgYXJlIHVzaW5nICJvZmYiIHRvIGluZGljYXRlIGludmFsaWQgKi8KIAkJaWYgKHZpZCA9PSBWSURfT0ZGKSB7CiAJCQlkcHJpbnRrKCJpbnZhbGlkIHZpZCAldSwgaWdub3JpbmdcbiIsIHZpZCk7Ci0JCQlwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCQlpbnZhbGlkYXRlX2VudHJ5KGRhdGEsIGkpOwogCQkJY29udGludWU7CiAJCX0KIAogCQkvKiB2ZXJpZnkgb25seSAxIGVudHJ5IGZyb20gdGhlIGxvIGZyZXF1ZW5jeSB0YWJsZSAqLwogCQlpZiAoZmlkIDwgSElfRklEX1RBQkxFX0JPVFRPTSkgewogCQkJaWYgKGNudGxvZnJlcSkgewotCQkJCS8qIGlmIGJvdGggZW50cmllcyBhcmUgdGhlIHNhbWUsIGlnbm9yZSB0aGlzIG9uZSAuLi4gKi8KLQkJCQlpZiAoKHBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSAhPSBwb3dlcm5vd190YWJsZVtjbnRsb2ZyZXFdLmZyZXF1ZW5jeSkgfHwKLQkJCQkgICAgKHBvd2Vybm93X3RhYmxlW2ldLmluZGV4ICE9IHBvd2Vybm93X3RhYmxlW2NudGxvZnJlcV0uaW5kZXgpKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIlRvbyBtYW55IGxvIGZyZXEgdGFibGUgZW50cmllc1xuIik7CisJCQkJLyogaWYgYm90aCBlbnRyaWVzIGFyZSB0aGUgc2FtZSwKKwkJCQkgKiBpZ25vcmUgdGhpcyBvbmUgLi4uICovCisJCQkJaWYgKChmcmVxICE9IHBvd2Vybm93X3RhYmxlW2NudGxvZnJlcV0uZnJlcXVlbmN5KSB8fAorCQkJCSAgICAoaW5kZXggIT0gcG93ZXJub3dfdGFibGVbY250bG9mcmVxXS5pbmRleCkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJCQkJIlRvbyBtYW55IGxvIGZyZXEgdGFibGUgIgorCQkJCQkJImVudHJpZXNcbiIpOwogCQkJCQlyZXR1cm4gMTsKIAkJCQl9CiAKLQkJCQlkcHJpbnRrKCJkb3VibGUgbG93IGZyZXF1ZW5jeSB0YWJsZSBlbnRyeSwgaWdub3JpbmcgaXQuXG4iKTsKLQkJCQlwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCQkJZHByaW50aygiZG91YmxlIGxvdyBmcmVxdWVuY3kgdGFibGUgZW50cnksICIKKwkJCQkJCSJpZ25vcmluZyBpdC5cbiIpOworCQkJCWludmFsaWRhdGVfZW50cnkoZGF0YSwgaSk7CiAJCQkJY29udGludWU7CiAJCQl9IGVsc2UKIAkJCQljbnRsb2ZyZXEgPSBpOwogCQl9CiAKLQkJaWYgKHBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSAhPSAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDApKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW52YWxpZCBmcmVxIGVudHJpZXMgJXUga0h6IHZzLiAldSBrSHpcbiIsCi0JCQkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5LAotCQkJCSh1bnNpZ25lZCBpbnQpIChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ICogMTAwMCkpOwotCQkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworCQlpZiAoZnJlcSAhPSAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDApKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW52YWxpZCBmcmVxIGVudHJpZXMgIgorCQkJCSIldSBrSHogdnMuICV1IGtIelxuIiwgZnJlcSwKKwkJCQkodW5zaWduZWQgaW50KQorCQkJCShkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5CisJCQkJICogMTAwMCkpOworCQkJaW52YWxpZGF0ZV9lbnRyeShkYXRhLCBpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJfQpAQCAtOTM1LDcgKzEwMDgsOCBAQAogc3RhdGljIHZvaWQgcG93ZXJub3dfazhfY3B1X2V4aXRfYWNwaShzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkKIHsKIAlpZiAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50KQotCQlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKCZkYXRhLT5hY3BpX2RhdGEsIGRhdGEtPmNwdSk7CisJCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoJmRhdGEtPmFjcGlfZGF0YSwKKwkJCQlkYXRhLT5jcHUpOwogCWZyZWVfY3B1bWFza192YXIoZGF0YS0+YWNwaV9kYXRhLnNoYXJlZF9jcHVfbWFwKTsKIH0KIApAQCAtOTUzLDE1ICsxMDI3LDkgQEAKIAlyZXR1cm4gMTAwMCAqIG1heF9sYXRlbmN5OwogfQogCi0jZWxzZQotc3RhdGljIGludCBwb3dlcm5vd19rOF9jcHVfaW5pdF9hY3BpKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhKSB7IHJldHVybiAtRU5PREVWOyB9Ci1zdGF0aWMgdm9pZCBwb3dlcm5vd19rOF9jcHVfZXhpdF9hY3BpKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhKSB7IHJldHVybjsgfQotc3RhdGljIHZvaWQgcG93ZXJub3dfazhfYWNwaV9wc3RfdmFsdWVzKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgaW5kZXgpIHsgcmV0dXJuOyB9Ci1zdGF0aWMgaW50IGdldF90cmFuc2l0aW9uX2xhdGVuY3koc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEpIHsgcmV0dXJuIDA7IH0KLSNlbmRpZiAvKiBDT05GSUdfWDg2X1BPV0VSTk9XX0s4X0FDUEkgKi8KLQogLyogVGFrZSBhIGZyZXF1ZW5jeSwgYW5kIGlzc3VlIHRoZSBmaWQvdmlkIHRyYW5zaXRpb24gY29tbWFuZCAqLwotc3RhdGljIGludCB0cmFuc2l0aW9uX2ZyZXF1ZW5jeV9maWR2aWQoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBpbmRleCkKK3N0YXRpYyBpbnQgdHJhbnNpdGlvbl9mcmVxdWVuY3lfZmlkdmlkKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLAorCQl1bnNpZ25lZCBpbnQgaW5kZXgpCiB7CiAJdTMyIGZpZCA9IDA7CiAJdTMyIHZpZCA9IDA7CkBAIC05ODksNyArMTA1Nyw4IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmICgoZmlkIDwgSElfRklEX1RBQkxFX0JPVFRPTSkgJiYgKGRhdGEtPmN1cnJmaWQgPCBISV9GSURfVEFCTEVfQk9UVE9NKSkgeworCWlmICgoZmlkIDwgSElfRklEX1RBQkxFX0JPVFRPTSkgJiYKKwkgICAgKGRhdGEtPmN1cnJmaWQgPCBISV9GSURfVEFCTEVfQk9UVE9NKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYCiAJCSAgICAgICAiaWdub3JpbmcgaWxsZWdhbCBjaGFuZ2UgaW4gbG8gZnJlcSB0YWJsZS0leCB0byAweCV4XG4iLAogCQkgICAgICAgZGF0YS0+Y3VycmZpZCwgZmlkKTsKQEAgLTEwMTcsNyArMTA4Niw4IEBACiB9CiAKIC8qIFRha2UgYSBmcmVxdWVuY3ksIGFuZCBpc3N1ZSB0aGUgaGFyZHdhcmUgcHN0YXRlIHRyYW5zaXRpb24gY29tbWFuZCAqLwotc3RhdGljIGludCB0cmFuc2l0aW9uX2ZyZXF1ZW5jeV9wc3RhdGUoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBpbmRleCkKK3N0YXRpYyBpbnQgdHJhbnNpdGlvbl9mcmVxdWVuY3lfcHN0YXRlKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLAorCQl1bnNpZ25lZCBpbnQgaW5kZXgpCiB7CiAJdTMyIHBzdGF0ZSA9IDA7CiAJaW50IHJlcywgaTsKQEAgLTEwMjksNyArMTA5OSw4IEBACiAJcHN0YXRlID0gaW5kZXggJiBIV19QU1RBVEVfTUFTSzsKIAlpZiAocHN0YXRlID4gZGF0YS0+bWF4X2h3X3BzdGF0ZSkKIAkJcmV0dXJuIDA7Ci0JZnJlcXMub2xkID0gZmluZF9raHpfZnJlcV9mcm9tX3BzdGF0ZShkYXRhLT5wb3dlcm5vd190YWJsZSwgZGF0YS0+Y3VycnBzdGF0ZSk7CisJZnJlcXMub2xkID0gZmluZF9raHpfZnJlcV9mcm9tX3BzdGF0ZShkYXRhLT5wb3dlcm5vd190YWJsZSwKKwkJCWRhdGEtPmN1cnJwc3RhdGUpOwogCWZyZXFzLm5ldyA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9wc3RhdGUoZGF0YS0+cG93ZXJub3dfdGFibGUsIHBzdGF0ZSk7CiAKIAlmb3JfZWFjaF9jcHVfbWFza19ucihpLCAqKGRhdGEtPmF2YWlsYWJsZV9jb3JlcykpIHsKQEAgLTEwNDgsNyArMTExOSw4IEBACiB9CiAKIC8qIERyaXZlciBlbnRyeSBwb2ludCB0byBzd2l0Y2ggdG8gdGhlIHRhcmdldCBmcmVxdWVuY3kgKi8KLXN0YXRpYyBpbnQgcG93ZXJub3drOF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2wsIHVuc2lnbmVkIHRhcmdmcmVxLCB1bnNpZ25lZCByZWxhdGlvbikKK3N0YXRpYyBpbnQgcG93ZXJub3drOF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2wsCisJCXVuc2lnbmVkIHRhcmdmcmVxLCB1bnNpZ25lZCByZWxhdGlvbikKIHsKIAljcHVtYXNrX3Qgb2xkbWFzazsKIAlzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSA9IHBlcl9jcHUocG93ZXJub3dfZGF0YSwgcG9sLT5jcHUpOwpAQCAtMTA4NywxNCArMTE1OSwxOCBAQAogCQlkcHJpbnRrKCJ0YXJnOiBjdXJyIGZpZCAweCV4LCB2aWQgMHgleFxuIiwKIAkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CiAKLQkJaWYgKChjaGVja3ZpZCAhPSBkYXRhLT5jdXJydmlkKSB8fCAoY2hlY2tmaWQgIT0gZGF0YS0+Y3VycmZpZCkpIHsKKwkJaWYgKChjaGVja3ZpZCAhPSBkYXRhLT5jdXJydmlkKSB8fAorCQkgICAgKGNoZWNrZmlkICE9IGRhdGEtPmN1cnJmaWQpKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPIFBGWAotCQkJCSJlcnJvciAtIG91dCBvZiBzeW5jLCBmaXggMHgleCAweCV4LCB2aWQgMHgleCAweCV4XG4iLAotCQkJCWNoZWNrZmlkLCBkYXRhLT5jdXJyZmlkLCBjaGVja3ZpZCwgZGF0YS0+Y3VycnZpZCk7CisJCQkJImVycm9yIC0gb3V0IG9mIHN5bmMsIGZpeCAweCV4IDB4JXgsICIKKwkJCQkidmlkIDB4JXggMHgleFxuIiwKKwkJCQljaGVja2ZpZCwgZGF0YS0+Y3VycmZpZCwKKwkJCQljaGVja3ZpZCwgZGF0YS0+Y3VycnZpZCk7CiAJCX0KIAl9CiAKLQlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbCwgZGF0YS0+cG93ZXJub3dfdGFibGUsIHRhcmdmcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKKwlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbCwgZGF0YS0+cG93ZXJub3dfdGFibGUsCisJCQkJdGFyZ2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQogCQlnb3RvIGVycl9vdXQ7CiAKIAltdXRleF9sb2NrKCZmaWR2aWRfbXV0ZXgpOwpAQCAtMTExNCw3ICsxMTkwLDggQEAKIAltdXRleF91bmxvY2soJmZpZHZpZF9tdXRleCk7CiAKIAlpZiAoY3B1X2ZhbWlseSA9PSBDUFVfSFdfUFNUQVRFKQotCQlwb2wtPmN1ciA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9wc3RhdGUoZGF0YS0+cG93ZXJub3dfdGFibGUsIG5ld3N0YXRlKTsKKwkJcG9sLT5jdXIgPSBmaW5kX2toel9mcmVxX2Zyb21fcHN0YXRlKGRhdGEtPnBvd2Vybm93X3RhYmxlLAorCQkJCW5ld3N0YXRlKTsKIAllbHNlCiAJCXBvbC0+Y3VyID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZChkYXRhLT5jdXJyZmlkKTsKIAlyZXQgPSAwOwpAQCAtMTE0MSw2ICsxMjE4LDcgQEAKIAlzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YTsKIAljcHVtYXNrX3Qgb2xkbWFzazsKIAlpbnQgcmM7CisJc3RhdGljIGludCBwcmludF9vbmNlOwogCiAJaWYgKCFjcHVfb25saW5lKHBvbC0+Y3B1KSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xMTYzLDMzICsxMjQxLDMxIEBACiAJCSAqIGFuIFVQIHZlcnNpb24sIGFuZCBpcyBkZXByZWNhdGVkIGJ5IEFNRC4KIAkJICovCiAJCWlmIChudW1fb25saW5lX2NwdXMoKSAhPSAxKSB7Ci0jaWZuZGVmIENPTkZJR19BQ1BJX1BST0NFU1NPUgotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQUNQSSBQcm9jZXNzb3Igc3VwcG9ydCBpcyByZXF1aXJlZCAiCi0JCQkgICAgICAgImZvciBTTVAgc3lzdGVtcyBidXQgaXMgYWJzZW50LiBQbGVhc2UgbG9hZCB0aGUgIgotCQkJICAgICAgICJBQ1BJIFByb2Nlc3NvciBtb2R1bGUgYmVmb3JlIHN0YXJ0aW5nIHRoaXMgIgotCQkJICAgICAgICJkcml2ZXIuXG4iKTsKLSNlbHNlCi0JCQlwcmludGsoS0VSTl9FUlIgRldfQlVHIFBGWCAiWW91ciBCSU9TIGRvZXMgbm90IHByb3ZpZGUiCi0JCQkgICAgICAgIiBBQ1BJIF9QU1Mgb2JqZWN0cyBpbiBhIHdheSB0aGF0IExpbnV4ICIKLQkJCSAgICAgICAidW5kZXJzdGFuZHMuIFBsZWFzZSByZXBvcnQgdGhpcyB0byB0aGUgTGludXggIgotCQkJICAgICAgICJBQ1BJIG1haW50YWluZXJzIGFuZCBjb21wbGFpbiB0byB5b3VyIEJJT1MgIgotCQkJICAgICAgICJ2ZW5kb3IuXG4iKTsKLSNlbmRpZgotCQkJa2ZyZWUoZGF0YSk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKKwkJCS8qCisJCQkgKiBSZXBsYWNlIHRoaXMgb25lIHdpdGggcHJpbnRfb25jZSBhcyBzb29uIGFzIHN1Y2ggYQorCQkJICogdGhpbmcgZ2V0cyBpbnRyb2R1Y2VkCisJCQkgKi8KKwkJCWlmICghcHJpbnRfb25jZSkgeworCQkJCVdBUk5fT05DRSgxLCBLRVJOX0VSUiBGV19CVUcgUEZYICJZb3VyIEJJT1MgIgorCQkJCQkiZG9lcyBub3QgcHJvdmlkZSBBQ1BJIF9QU1Mgb2JqZWN0cyAiCisJCQkJCSJpbiBhIHdheSB0aGF0IExpbnV4IHVuZGVyc3RhbmRzLiAiCisJCQkJCSJQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdGhlIExpbnV4IEFDUEkiCisJCQkJCSIgbWFpbnRhaW5lcnMgYW5kIGNvbXBsYWluIHRvIHlvdXIgIgorCQkJCQkiQklPUyB2ZW5kb3IuXG4iKTsKKwkJCQlwcmludF9vbmNlKys7CisJCQl9CisJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAkJaWYgKHBvbC0+Y3B1ICE9IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiBGV19CVUcgUEZYICJObyBBQ1BJIF9QU1Mgb2JqZWN0cyBmb3IgIgogCQkJICAgICAgICJDUFUgb3RoZXIgdGhhbiBDUFUwLiBDb21wbGFpbiB0byB5b3VyIEJJT1MgIgogCQkJICAgICAgICJ2ZW5kb3IuXG4iKTsKLQkJCWtmcmVlKGRhdGEpOwotCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAkJcmMgPSBmaW5kX3BzYl90YWJsZShkYXRhKTsKLQkJaWYgKHJjKSB7Ci0JCQlrZnJlZShkYXRhKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJCWlmIChyYykKKwkJCWdvdG8gZXJyX291dDsKKwogCQkvKiBUYWtlIGEgY3J1ZGUgZ3Vlc3MgaGVyZS4KIAkJICogVGhhdCBndWVzcyB3YXMgaW4gbWljcm9zZWNvbmRzLCBzbyBtdWx0aXBseSB3aXRoIDEwMDAgKi8KIAkJcG9sLT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9ICgKQEAgLTEyMDQsMTYgKzEyODAsMTYgQEAKIAogCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gcG9sLT5jcHUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGltaXRpbmcgdG8gY3B1ICV1IGZhaWxlZFxuIiwgcG9sLT5jcHUpOwotCQlnb3RvIGVycl9vdXQ7CisJCWdvdG8gZXJyX291dF91bm1hc2s7CiAJfQogCiAJaWYgKHBlbmRpbmdfYml0X3N0dWNrKCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGluZyBpbml0LCBjaGFuZ2UgcGVuZGluZyBiaXQgc2V0XG4iKTsKLQkJZ290byBlcnJfb3V0OworCQlnb3RvIGVycl9vdXRfdW5tYXNrOwogCX0KIAogCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKLQkJZ290byBlcnJfb3V0OworCQlnb3RvIGVycl9vdXRfdW5tYXNrOwogCiAJaWYgKGNwdV9mYW1pbHkgPT0gQ1BVX09QVEVST04pCiAJCWZpZHZpZF9tc3JfaW5pdCgpOwpAQCAtMTIyOCw3ICsxMzA0LDggQEAKIAlkYXRhLT5hdmFpbGFibGVfY29yZXMgPSBwb2wtPmNwdXM7CiAKIAlpZiAoY3B1X2ZhbWlseSA9PSBDUFVfSFdfUFNUQVRFKQotCQlwb2wtPmN1ciA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9wc3RhdGUoZGF0YS0+cG93ZXJub3dfdGFibGUsIGRhdGEtPmN1cnJwc3RhdGUpOworCQlwb2wtPmN1ciA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9wc3RhdGUoZGF0YS0+cG93ZXJub3dfdGFibGUsCisJCQkJZGF0YS0+Y3VycnBzdGF0ZSk7CiAJZWxzZQogCQlwb2wtPmN1ciA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7CiAJZHByaW50aygicG9saWN5IGN1cnJlbnQgZnJlcXVlbmN5ICVkIGtIelxuIiwgcG9sLT5jdXIpOwpAQCAtMTI0NSw3ICsxMzIyLDggQEAKIAljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihkYXRhLT5wb3dlcm5vd190YWJsZSwgcG9sLT5jcHUpOwogCiAJaWYgKGNwdV9mYW1pbHkgPT0gQ1BVX0hXX1BTVEFURSkKLQkJZHByaW50aygiY3B1X2luaXQgZG9uZSwgY3VycmVudCBwc3RhdGUgMHgleFxuIiwgZGF0YS0+Y3VycnBzdGF0ZSk7CisJCWRwcmludGsoImNwdV9pbml0IGRvbmUsIGN1cnJlbnQgcHN0YXRlIDB4JXhcbiIsCisJCQkJZGF0YS0+Y3VycnBzdGF0ZSk7CiAJZWxzZQogCQlkcHJpbnRrKCJjcHVfaW5pdCBkb25lLCBjdXJyZW50IGZpZCAweCV4LCB2aWQgMHgleFxuIiwKIAkJCWRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOwpAQCAtMTI1NCwxNSArMTMzMiwxNiBAQAogCiAJcmV0dXJuIDA7CiAKLWVycl9vdXQ6CitlcnJfb3V0X3VubWFzazoKIAlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCAmb2xkbWFzayk7CiAJcG93ZXJub3dfazhfY3B1X2V4aXRfYWNwaShkYXRhKTsKIAorZXJyX291dDoKIAlrZnJlZShkYXRhKTsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgcG93ZXJub3drOF9jcHVfZXhpdCAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2wpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBwb3dlcm5vd2s4X2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9sKQogewogCXN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhID0gcGVyX2NwdShwb3dlcm5vd19kYXRhLCBwb2wtPmNwdSk7CiAKQEAgLTEyNzksNyArMTM1OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcG93ZXJub3drOF9nZXQgKHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgdW5zaWduZWQgaW50IHBvd2Vybm93azhfZ2V0KHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGE7CiAJY3B1bWFza190IG9sZG1hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CkBAIC0xMzE1LDcgKzEzOTQsNyBAQAogCXJldHVybiBraHo7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBwb3dlcm5vd19rOF9hdHRyW10gPSB7CitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciAqcG93ZXJub3dfazhfYXR0cltdID0gewogCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKIAlOVUxMLAogfTsKQEAgLTEzNjAsNyArMTQzOSw4IEBACiAJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmY3B1ZnJlcV9hbWQ2NF9kcml2ZXIpOwogfQogCi1NT0RVTEVfQVVUSE9SKCJQYXVsIERldnJpZW5kdCA8cGF1bC5kZXZyaWVuZHRAYW1kLmNvbT4gYW5kIE1hcmsgTGFuZ3Nkb3JmIDxtYXJrLmxhbmdzZG9yZkBhbWQuY29tPiIpOworTU9EVUxFX0FVVEhPUigiUGF1bCBEZXZyaWVuZHQgPHBhdWwuZGV2cmllbmR0QGFtZC5jb20+IGFuZCAiCisJCSJNYXJrIExhbmdzZG9yZiA8bWFyay5sYW5nc2RvcmZAYW1kLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQU1EIEF0aGxvbiA2NCBhbmQgT3B0ZXJvbiBwcm9jZXNzb3IgZnJlcXVlbmN5IGRyaXZlci4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmggYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguaAppbmRleCA4ZWNjNzViLi42YzY2OThmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguaApAQCAtNDUsMTEgKzQ1LDEwIEBACiAJICogZnJlcXVlbmN5IGlzIGluIGtIeiAqLwogCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAgKnBvd2Vybm93X3RhYmxlOwogCi0jaWZkZWYgQ09ORklHX1g4Nl9QT1dFUk5PV19LOF9BQ1BJCiAJLyogdGhlIGFjcGkgdGFibGUgbmVlZHMgdG8gYmUga2VwdC4gaXQncyBvbmx5IGF2YWlsYWJsZSBpZiBBQ1BJIHdhcwogCSAqIHVzZWQgdG8gZGV0ZXJtaW5lIHZhbGlkIGZyZXF1ZW5jeS92aWQvZmlkIHN0YXRlcyAqLwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSBhY3BpX2RhdGE7Ci0jZW5kaWYKKwogCS8qIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBhc3NvY2lhdGVkIGNvcmVzLCBidXQgbGV0IGNwdWZyZXEKIAkgKiBoYW5kbGUgaG90cGx1ZyBldmVudHMgLSBzbyBqdXN0IHBvaW50IGF0IGNwdWZyZXEgcG9sLT5jcHVzCiAJICogc3RydWN0dXJlICovCkBAIC0yMjIsMTAgKzIyMSw4IEBACiAKIHN0YXRpYyB2b2lkIHBvd2Vybm93X2s4X2FjcGlfcHN0X3ZhbHVlcyhzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGluZGV4KTsKIAotI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzhfQUNQSQogc3RhdGljIGludCBmaWxsX3Bvd2Vybm93X3RhYmxlX3BzdGF0ZShzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpwb3dlcm5vd190YWJsZSk7CiBzdGF0aWMgaW50IGZpbGxfcG93ZXJub3dfdGFibGVfZmlkdmlkKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnBvd2Vybm93X3RhYmxlKTsKLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIGlubGluZSB2b2lkIGRlZmluZV9zaWJsaW5ncyhpbnQgY3B1LCBjcHVtYXNrX3QgY3B1X3NoYXJlZGNvcmVfbWFza1tdKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NjNTIwX2ZyZXEuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zYzUyMF9mcmVxLmMKaW5kZXggNDJkYTliZC4uNDM1YTk5NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NjNTIwX2ZyZXEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc2M1MjBfZnJlcS5jCkBAIC0xOSwxNyArMTksMTkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tc3IuaD4KLSNpbmNsdWRlIDxhc20vdGltZXguaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBNTUNSX0JBU0UJMHhmZmZlZjAwMAkvKiBUaGUgZGVmYXVsdCBiYXNlIGFkZHJlc3MgKi8KICNkZWZpbmUgT0ZGU19DUFVDVEwJMHgyICAgLyogQ1BVIENvbnRyb2wgUmVnaXN0ZXIgKi8KIAogc3RhdGljIF9fdTggX19pb21lbSAqY3B1Y3RsOwogCi0jZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgInNjNTIwX2ZyZXEiLCBtc2cpCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgXAorCQkic2M1MjBfZnJlcSIsIG1zZykKKyNkZWZpbmUgUEZYICJzYzUyMF9mcmVxOiAiCiAKIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgc2M1MjBfZnJlcV90YWJsZVtdID0gewogCXsweDAxLAkxMDAwMDB9LApAQCAtNDMsNyArNDUsOCBAQAogCiAJc3dpdGNoIChjbG9ja3NwZWVkX3JlZyAmIDB4MDMpIHsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgInNjNTIwX2ZyZXE6IGVycm9yOiBjcHVjdGwgcmVnaXN0ZXIgaGFzIHVuZXhwZWN0ZWQgdmFsdWUgJTAyeFxuIiwgY2xvY2tzcGVlZF9yZWcpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJlcnJvcjogY3B1Y3RsIHJlZ2lzdGVyIGhhcyB1bmV4cGVjdGVkICIKKwkJCQkidmFsdWUgJTAyeFxuIiwgY2xvY2tzcGVlZF9yZWcpOwogCWNhc2UgMHgwMToKIAkJcmV0dXJuIDEwMDAwMDsKIAljYXNlIDB4MDI6CkBAIC01MSw3ICs1NCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzYzUyMF9mcmVxX3NldF9jcHVfc3RhdGUgKHVuc2lnbmVkIGludCBzdGF0ZSkKK3N0YXRpYyB2b2lkIHNjNTIwX2ZyZXFfc2V0X2NwdV9zdGF0ZSh1bnNpZ25lZCBpbnQgc3RhdGUpCiB7CiAKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcwlmcmVxczsKQEAgLTc2LDE4ICs3OSwxOSBAQAogCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOwogfTsKIAotc3RhdGljIGludCBzYzUyMF9mcmVxX3ZlcmlmeSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitzdGF0aWMgaW50IHNjNTIwX2ZyZXFfdmVyaWZ5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewogCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCAmc2M1MjBfZnJlcV90YWJsZVswXSk7CiB9CiAKLXN0YXRpYyBpbnQgc2M1MjBfZnJlcV90YXJnZXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorc3RhdGljIGludCBzYzUyMF9mcmVxX3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCiAJCQkgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQogewogCXVuc2lnbmVkIGludCBuZXdzdGF0ZSA9IDA7CiAKLQlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgc2M1MjBfZnJlcV90YWJsZSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQorCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBzYzUyMF9mcmVxX3RhYmxlLAorCQkJCXRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzYzUyMF9mcmVxX3NldF9jcHVfc3RhdGUobmV3c3RhdGUpOwpAQCAtMTE2LDcgKzEyMCw3IEBACiAKIAlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgc2M1MjBfZnJlcV90YWJsZSk7CiAJaWYgKHJlc3VsdCkKLQkJcmV0dXJuIChyZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OwogCiAJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoc2M1MjBfZnJlcV90YWJsZSwgcG9saWN5LT5jcHUpOwogCkBAIC0xMzEsNyArMTM1LDcgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogc2M1MjBfZnJlcV9hdHRyW10gPSB7CitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciAqc2M1MjBfZnJlcV9hdHRyW10gPSB7CiAJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAogCU5VTEwsCiB9OwpAQCAtMTU1LDEzICsxNTksMTMgQEAKIAlpbnQgZXJyOwogCiAJLyogVGVzdCBpZiB3ZSBoYXZlIHRoZSByaWdodCBoYXJkd2FyZSAqLwotCWlmKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQgfHwKLQkJCQljLT54ODYgIT0gNCB8fCBjLT54ODZfbW9kZWwgIT0gOSkgeworCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EIHx8CisJICAgIGMtPng4NiAhPSA0IHx8IGMtPng4Nl9tb2RlbCAhPSA5KSB7CiAJCWRwcmludGsoIm5vIEVsYW4gU0M1MjAgcHJvY2Vzc29yIGZvdW5kIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAljcHVjdGwgPSBpb3JlbWFwKCh1bnNpZ25lZCBsb25nKShNTUNSX0JBU0UgKyBPRkZTX0NQVUNUTCksIDEpOwotCWlmKCFjcHVjdGwpIHsKKwlpZiAoIWNwdWN0bCkgewogCQlwcmludGsoS0VSTl9FUlIgInNjNTIwX2ZyZXE6IGVycm9yOiBmYWlsZWQgdG8gcmVtYXAgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1pY2guYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtaWNoLmMKaW5kZXggZGVkYzFlOS4uOGJiYjExYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1pY2guYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jCkBAIC0zOSw3ICszOSw3IEBACiAKIC8qIHNwZWVkc3RlcF9wcm9jZXNzb3IKICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfcHJvY2Vzc29yID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX3Byb2Nlc3NvcjsKIAogc3RhdGljIHUzMiBwbWJhc2U7CiAKQEAgLTU0LDcgKzU0LDggQEAKIH07CiAKIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJzcGVlZHN0ZXAtaWNoIiwgbXNnKQorI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsIFwKKwkJInNwZWVkc3RlcC1pY2giLCBtc2cpCiAKIAogLyoqCkBAIC02Miw3ICs2Myw3IEBACiAgKgogICogUmV0dXJuczogLUVOT0RFViBpZiBubyByZWdpc3RlciBjb3VsZCBiZSBmb3VuZAogICovCi1zdGF0aWMgaW50IHNwZWVkc3RlcF9maW5kX3JlZ2lzdGVyICh2b2lkKQorc3RhdGljIGludCBzcGVlZHN0ZXBfZmluZF9yZWdpc3Rlcih2b2lkKQogewogCWlmICghc3BlZWRzdGVwX2NoaXBzZXRfZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTkwLDcgKzkxLDcgQEAKICAqCiAgKiAgIFRyaWVzIHRvIGNoYW5nZSB0aGUgU3BlZWRTdGVwIHN0YXRlLgogICovCi1zdGF0aWMgdm9pZCBzcGVlZHN0ZXBfc2V0X3N0YXRlICh1bnNpZ25lZCBpbnQgc3RhdGUpCitzdGF0aWMgdm9pZCBzcGVlZHN0ZXBfc2V0X3N0YXRlKHVuc2lnbmVkIGludCBzdGF0ZSkKIHsKIAl1OCBwbTJfYmxrOwogCXU4IHZhbHVlOwpAQCAtMTMzLDExICsxMzQsMTEgQEAKIAogCWRwcmludGsoInJlYWQgYXQgcG1iYXNlIDB4JXggKyAweDUwIHJldHVybmVkIDB4JXhcbiIsIHBtYmFzZSwgdmFsdWUpOwogCi0JaWYgKHN0YXRlID09ICh2YWx1ZSAmIDB4MSkpIHsKLQkJZHByaW50aygiY2hhbmdlIHRvICV1IE1IeiBzdWNjZWVkZWRcbiIsIChzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3koc3BlZWRzdGVwX3Byb2Nlc3NvcikgLyAxMDAwKSk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiY3B1ZnJlcTogY2hhbmdlIGZhaWxlZCAtIEkvTyBlcnJvclxuIik7Ci0JfQorCWlmIChzdGF0ZSA9PSAodmFsdWUgJiAweDEpKQorCQlkcHJpbnRrKCJjaGFuZ2UgdG8gJXUgTUh6IHN1Y2NlZWRlZFxuIiwKKwkJCXNwZWVkc3RlcF9nZXRfZnJlcXVlbmN5KHNwZWVkc3RlcF9wcm9jZXNzb3IpIC8gMTAwMCk7CisJZWxzZQorCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IGNoYW5nZSBmYWlsZWQgLSBJL08gZXJyb3JcbiIpOwogCiAJcmV0dXJuOwogfQpAQCAtMTQ5LDcgKzE1MCw3IEBACiAgKiAgIFRyaWVzIHRvIGFjdGl2YXRlIHRoZSBTcGVlZFN0ZXAgc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVycy4KICAqIFJldHVybnMgLUVJTlZBTCBvbiBhbiB1bnN1cHBvcnRlZCBjaGlwc2V0LCBhbmQgemVybyBvbiBzdWNjZXNzLgogICovCi1zdGF0aWMgaW50IHNwZWVkc3RlcF9hY3RpdmF0ZSAodm9pZCkKK3N0YXRpYyBpbnQgc3BlZWRzdGVwX2FjdGl2YXRlKHZvaWQpCiB7CiAJdTE2IHZhbHVlID0gMDsKIApAQCAtMTc1LDIwICsxNzYsMTggQEAKICAqIGZ1bmN0aW9ucy4gUmV0dXJucyB0aGUgU1BFRURTVEVQX0NISVBTRVRfLW51bWJlciBmb3IgdGhlIGRldGVjdGVkCiAgKiBjaGlwc2V0LCBvciB6ZXJvIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2RldGVjdF9jaGlwc2V0ICh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZGV0ZWN0X2NoaXBzZXQodm9pZCkKIHsKIAlzcGVlZHN0ZXBfY2hpcHNldF9kZXYgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfVkVORE9SX0lEX0lOVEVMLAogCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzEyLAotCQkJICAgICAgUENJX0FOWV9JRCwKLQkJCSAgICAgIFBDSV9BTllfSUQsCisJCQkgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAogCQkJICAgICAgTlVMTCk7CiAJaWYgKHNwZWVkc3RlcF9jaGlwc2V0X2RldikKIAkJcmV0dXJuIDQ7IC8qIDQtTSAqLwogCiAJc3BlZWRzdGVwX2NoaXBzZXRfZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9JTlRFTCwKIAkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV8xMiwKLQkJCSAgICAgIFBDSV9BTllfSUQsCi0JCQkgICAgICBQQ0lfQU5ZX0lELAorCQkJICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKIAkJCSAgICAgIE5VTEwpOwogCWlmIChzcGVlZHN0ZXBfY2hpcHNldF9kZXYpCiAJCXJldHVybiAzOyAvKiAzLU0gKi8KQEAgLTE5Niw4ICsxOTUsNyBAQAogCiAJc3BlZWRzdGVwX2NoaXBzZXRfZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9JTlRFTCwKIAkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV8xMCwKLQkJCSAgICAgIFBDSV9BTllfSUQsCi0JCQkgICAgICBQQ0lfQU5ZX0lELAorCQkJICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKIAkJCSAgICAgIE5VTEwpOwogCWlmIChzcGVlZHN0ZXBfY2hpcHNldF9kZXYpIHsKIAkJLyogc3BlZWRzdGVwLmMgY2F1c2VzIGxvY2t1cHMgb24gRGVsbCBJbnNwaXJvbnMgODAwMCBhbmQKQEAgLTIwOCw4ICsyMDYsNyBAQAogCiAJCWhvc3RicmlkZ2UgID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9JTlRFTCwKIAkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTVfTUMsCi0JCQkgICAgICBQQ0lfQU5ZX0lELAotCQkJICAgICAgUENJX0FOWV9JRCwKKwkJCSAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCiAJCQkgICAgICBOVUxMKTsKIAogCQlpZiAoIWhvc3RicmlkZ2UpCkBAIC0yMzYsNyArMjMzLDcgQEAKIAogCWNwdXNfYWxsb3dlZCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKIAlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBjcHVzKTsKLQlzcGVlZCA9IHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShzcGVlZHN0ZXBfcHJvY2Vzc29yKTsKKwlzcGVlZCA9IHNwZWVkc3RlcF9nZXRfZnJlcXVlbmN5KHNwZWVkc3RlcF9wcm9jZXNzb3IpOwogCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZjcHVzX2FsbG93ZWQpOwogCWRwcmludGsoImRldGVjdGVkICV1IGtIeiBhcyBjdXJyZW50IGZyZXF1ZW5jeVxuIiwgc3BlZWQpOwogCXJldHVybiBzcGVlZDsKQEAgLTI1MSwxMSArMjQ4LDEyIEBACiAgKiBzcGVlZHN0ZXBfdGFyZ2V0IC0gc2V0IGEgbmV3IENQVUZyZXEgcG9saWN5CiAgKiBAcG9saWN5OiBuZXcgcG9saWN5CiAgKiBAdGFyZ2V0X2ZyZXE6IHRoZSB0YXJnZXQgZnJlcXVlbmN5Ci0gKiBAcmVsYXRpb246IGhvdyB0aGF0IGZyZXF1ZW5jeSByZWxhdGVzIHRvIGFjaGlldmVkIGZyZXF1ZW5jeSAoQ1BVRlJFUV9SRUxBVElPTl9MIG9yIENQVUZSRVFfUkVMQVRJT05fSCkKKyAqIEByZWxhdGlvbjogaG93IHRoYXQgZnJlcXVlbmN5IHJlbGF0ZXMgdG8gYWNoaWV2ZWQgZnJlcXVlbmN5CisgKgkoQ1BVRlJFUV9SRUxBVElPTl9MIG9yIENQVUZSRVFfUkVMQVRJT05fSCkKICAqCiAgKiBTZXRzIGEgbmV3IENQVUZyZXEgcG9saWN5LgogICovCi1zdGF0aWMgaW50IHNwZWVkc3RlcF90YXJnZXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorc3RhdGljIGludCBzcGVlZHN0ZXBfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAogCQkJICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCiAJCQkgICAgIHVuc2lnbmVkIGludCByZWxhdGlvbikKIHsKQEAgLTI2NCw3ICsyNjIsOCBAQAogCWNwdW1hc2tfdCBjcHVzX2FsbG93ZWQ7CiAJaW50IGk7CiAKLQlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgJnNwZWVkc3RlcF9mcmVxc1swXSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQorCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmc3BlZWRzdGVwX2ZyZXFzWzBdLAorCQkJCXRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmcmVxcy5vbGQgPSBfc3BlZWRzdGVwX2dldChwb2xpY3ktPmNwdXMpOwpAQCAtMzA4LDcgKzMwNyw3IEBACiAgKiBMaW1pdCBtdXN0IGJlIHdpdGhpbiBzcGVlZHN0ZXBfbG93X2ZyZXEgYW5kIHNwZWVkc3RlcF9oaWdoX2ZyZXEsIHdpdGgKICAqIGF0IGxlYXN0IG9uZSBib3JkZXIgaW5jbHVkZWQuCiAgKi8KLXN0YXRpYyBpbnQgc3BlZWRzdGVwX3ZlcmlmeSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitzdGF0aWMgaW50IHNwZWVkc3RlcF92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CiAJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksICZzcGVlZHN0ZXBfZnJlcXNbMF0pOwogfQpAQCAtMzQ0LDcgKzM0Myw4IEBACiAJCXJldHVybiAtRUlPOwogCiAJZHByaW50aygiY3VycmVudGx5IGF0ICVzIHNwZWVkIHNldHRpbmcgLSAlaSBNSHpcbiIsCi0JCShzcGVlZCA9PSBzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0xPV10uZnJlcXVlbmN5KSA/ICJsb3ciIDogImhpZ2giLAorCQkoc3BlZWQgPT0gc3BlZWRzdGVwX2ZyZXFzW1NQRUVEU1RFUF9MT1ddLmZyZXF1ZW5jeSkKKwkJPyAibG93IiA6ICJoaWdoIiwKIAkJKHNwZWVkIC8gMTAwMCkpOwogCiAJLyogY3B1aW5mbyBhbmQgZGVmYXVsdCBwb2xpY3kgdmFsdWVzICovCkBAIC0zNTIsOSArMzUyLDkgQEAKIAogCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBzcGVlZHN0ZXBfZnJlcXMpOwogCWlmIChyZXN1bHQpCi0JCXJldHVybiAocmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKIAotICAgICAgICBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihzcGVlZHN0ZXBfZnJlcXMsIHBvbGljeS0+Y3B1KTsKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihzcGVlZHN0ZXBfZnJlcXMsIHBvbGljeS0+Y3B1KTsKIAogCXJldHVybiAwOwogfQpAQCAtMzY2LDcgKzM2Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBzcGVlZHN0ZXBfYXR0cltdID0geworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgKnNwZWVkc3RlcF9hdHRyW10gPSB7CiAJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAogCU5VTEwsCiB9OwpAQCAtMzk2LDEzICszOTYsMTUgQEAKIAkvKiBkZXRlY3QgcHJvY2Vzc29yICovCiAJc3BlZWRzdGVwX3Byb2Nlc3NvciA9IHNwZWVkc3RlcF9kZXRlY3RfcHJvY2Vzc29yKCk7CiAJaWYgKCFzcGVlZHN0ZXBfcHJvY2Vzc29yKSB7Ci0JCWRwcmludGsoIkludGVsKFIpIFNwZWVkU3RlcChUTSkgY2FwYWJsZSBwcm9jZXNzb3Igbm90IGZvdW5kXG4iKTsKKwkJZHByaW50aygiSW50ZWwoUikgU3BlZWRTdGVwKFRNKSBjYXBhYmxlIHByb2Nlc3NvciAiCisJCQkJIm5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCS8qIGRldGVjdCBjaGlwc2V0ICovCiAJaWYgKCFzcGVlZHN0ZXBfZGV0ZWN0X2NoaXBzZXQoKSkgewotCQlkcHJpbnRrKCJJbnRlbChSKSBTcGVlZFN0ZXAoVE0pIGZvciB0aGlzIGNoaXBzZXQgbm90ICh5ZXQpIGF2YWlsYWJsZS5cbiIpOworCQlkcHJpbnRrKCJJbnRlbChSKSBTcGVlZFN0ZXAoVE0pIGZvciB0aGlzIGNoaXBzZXQgbm90ICIKKwkJCQkiKHlldCkgYXZhaWxhYmxlLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNDMxLDkgKzQzMywxMSBAQAogfQogCiAKLU1PRFVMRV9BVVRIT1IgKCJEYXZlIEpvbmVzIDxkYXZlakByZWRoYXQuY29tPiwgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OICgiU3BlZWRzdGVwIGRyaXZlciBmb3IgSW50ZWwgbW9iaWxlIHByb2Nlc3NvcnMgb24gY2hpcHNldHMgd2l0aCBJQ0gtTSBzb3V0aGJyaWRnZXMuIik7Ci1NT0RVTEVfTElDRU5TRSAoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRGF2ZSBKb25lcyA8ZGF2ZWpAcmVkaGF0LmNvbT4sICIKKwkJIkRvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3BlZWRzdGVwIGRyaXZlciBmb3IgSW50ZWwgbW9iaWxlIHByb2Nlc3NvcnMgb24gY2hpcHNldHMgIgorCQkid2l0aCBJQ0gtTSBzb3V0aGJyaWRnZXMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIG1vZHVsZV9pbml0KHNwZWVkc3RlcF9pbml0KTsKIG1vZHVsZV9leGl0KHNwZWVkc3RlcF9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCmluZGV4IGNkYWM3ZDYuLjJlM2M2ODYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuYwpAQCAtMTYsMTIgKzE2LDE2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS90c2MuaD4KICNpbmNsdWRlICJzcGVlZHN0ZXAtbGliLmgiCiAKLSNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAic3BlZWRzdGVwLWxpYiIsIG1zZykKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCBcCisJCSJzcGVlZHN0ZXAtbGliIiwgbXNnKQorCisjZGVmaW5lIFBGWCAic3BlZWRzdGVwLWxpYjogIgogCiAjaWZkZWYgQ09ORklHX1g4Nl9TUEVFRFNURVBfUkVMQVhFRF9DQVBfQ0hFQ0sKLXN0YXRpYyBpbnQgcmVsYXhlZF9jaGVjayA9IDA7CitzdGF0aWMgaW50IHJlbGF4ZWRfY2hlY2s7CiAjZWxzZQogI2RlZmluZSByZWxheGVkX2NoZWNrIDAKICNlbmRpZgpAQCAtMzAsMTQgKzM0LDE0IEBACiAgKiAgICAgICAgICAgICAgICAgICBHRVQgUFJPQ0VTU09SIENPUkUgU1BFRUQgSU4gS0haICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHBlbnRpdW0zX2dldF9mcmVxdWVuY3kgKHVuc2lnbmVkIGludCBwcm9jZXNzb3IpCitzdGF0aWMgdW5zaWduZWQgaW50IHBlbnRpdW0zX2dldF9mcmVxdWVuY3kodW5zaWduZWQgaW50IHByb2Nlc3NvcikKIHsKLSAgICAgICAgLyogU2VlIHRhYmxlIDE0IG9mIHAzX2RzLnBkZiBhbmQgdGFibGUgMjIgb2YgMjk4MzQwMDMucGRmICovCisJLyogU2VlIHRhYmxlIDE0IG9mIHAzX2RzLnBkZiBhbmQgdGFibGUgMjIgb2YgMjk4MzQwMDMucGRmICovCiAJc3RydWN0IHsKIAkJdW5zaWduZWQgaW50IHJhdGlvOwkvKiBGcmVxdWVuY3kgTXVsdGlwbGllciAoeDEwKSAqLwogCQl1OCBiaXRtYXA7CQkvKiBwb3dlciBvbiBjb25maWd1cmF0aW9uIGJpdHMKIAkJCQkJWzI3LCAyNToyMl0gKGluIE1TUiAweDJhKSAqLwotCX0gbXNyX2RlY29kZV9tdWx0IFtdID0geworCX0gbXNyX2RlY29kZV9tdWx0W10gPSB7CiAJCXsgMzAsIDB4MDEgfSwKIAkJeyAzNSwgMHgwNSB9LAogCQl7IDQwLCAweDAyIH0sCkBAIC01Miw3ICs1Niw3IEBACiAJCXsgODUsIDB4MjYgfSwKIAkJeyA5MCwgMHgyMCB9LAogCQl7IDEwMCwgMHgyYiB9LAotCQl7IDAsIDB4ZmYgfSAgICAgLyogZXJyb3Igb3IgdW5rbm93biB2YWx1ZSAqLworCQl7IDAsIDB4ZmYgfQkvKiBlcnJvciBvciB1bmtub3duIHZhbHVlICovCiAJfTsKIAogCS8qIFBJSUkoLU0pIEZTQiBzZXR0aW5nczogc2VlIHRhYmxlIGIxLWIgb2YgMjQ1NDcyMDYucGRmICovCkBAIC02MCw3ICs2NCw3IEBACiAJCXVuc2lnbmVkIGludCB2YWx1ZTsJLyogRnJvbnQgU2lkZSBCdXMgc3BlZWQgaW4gTUh6ICovCiAJCXU4IGJpdG1hcDsJCS8qIHBvd2VyIG9uIGNvbmZpZ3VyYXRpb24gYml0cyBbMTg6IDE5XQogCQkJCQkoaW4gTVNSIDB4MmEpICovCi0JfSBtc3JfZGVjb2RlX2ZzYiBbXSA9IHsKKwl9IG1zcl9kZWNvZGVfZnNiW10gPSB7CiAJCXsgIDY2LCAweDAgfSwKIAkJeyAxMDAsIDB4MiB9LAogCQl7IDEzMywgMHgxIH0sCkBAIC04NSw3ICs4OSw3IEBACiAJfQogCiAJLyogZGVjb2RlIHRoZSBtdWx0aXBsaWVyICovCi0JaWYgKHByb2Nlc3NvciA9PSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQ19FQVJMWSkgeworCWlmIChwcm9jZXNzb3IgPT0gU1BFRURTVEVQX0NQVV9QSUlJX0NfRUFSTFkpIHsKIAkJZHByaW50aygid29ya2Fyb3VuZCBmb3IgZWFybHkgUElJSXNcbiIpOwogCQltc3JfbG8gJj0gMHgwM2MwMDAwMDsKIAl9IGVsc2UKQEAgLTk3LDkgKzEwMSwxMCBAQAogCQlqKys7CiAJfQogCi0JZHByaW50aygic3BlZWQgaXMgJXVcbiIsIChtc3JfZGVjb2RlX211bHRbal0ucmF0aW8gKiBtc3JfZGVjb2RlX2ZzYltpXS52YWx1ZSAqIDEwMCkpOworCWRwcmludGsoInNwZWVkIGlzICV1XG4iLAorCQkobXNyX2RlY29kZV9tdWx0W2pdLnJhdGlvICogbXNyX2RlY29kZV9mc2JbaV0udmFsdWUgKiAxMDApKTsKIAotCXJldHVybiAobXNyX2RlY29kZV9tdWx0W2pdLnJhdGlvICogbXNyX2RlY29kZV9mc2JbaV0udmFsdWUgKiAxMDApOworCXJldHVybiBtc3JfZGVjb2RlX211bHRbal0ucmF0aW8gKiBtc3JfZGVjb2RlX2ZzYltpXS52YWx1ZSAqIDEwMDsKIH0KIAogCkBAIC0xMTIsMjAgKzExNywyMyBAQAogCiAJLyogc2VlIHRhYmxlIEItMiBvZiAyNDU0NzIxMi5wZGYgKi8KIAlpZiAobXNyX2xvICYgMHgwMDA0MDAwMCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAic3BlZWRzdGVwLWxpYjogUE0gLSBpbnZhbGlkIEZTQjogMHgleCAweCV4XG4iLCBtc3JfbG8sIG1zcl90bXApOworCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIlBNIC0gaW52YWxpZCBGU0I6IDB4JXggMHgleFxuIiwKKwkJCQltc3JfbG8sIG1zcl90bXApOwogCQlyZXR1cm4gMDsKIAl9CiAKIAltc3JfdG1wID0gKG1zcl9sbyA+PiAyMikgJiAweDFmOwotCWRwcmludGsoImJpdHMgMjItMjYgYXJlIDB4JXgsIHNwZWVkIGlzICV1XG4iLCBtc3JfdG1wLCAobXNyX3RtcCAqIDEwMCAqIDEwMDApKTsKKwlkcHJpbnRrKCJiaXRzIDIyLTI2IGFyZSAweCV4LCBzcGVlZCBpcyAldVxuIiwKKwkJCW1zcl90bXAsIChtc3JfdG1wICogMTAwICogMTAwMCkpOwogCi0JcmV0dXJuIChtc3JfdG1wICogMTAwICogMTAwMCk7CisJcmV0dXJuIG1zcl90bXAgKiAxMDAgKiAxMDAwOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHBlbnRpdW1fY29yZV9nZXRfZnJlcXVlbmN5KHZvaWQpCiB7CiAJdTMyIGZzYiA9IDA7CiAJdTMyIG1zcl9sbywgbXNyX3RtcDsKKwlpbnQgcmV0OwogCiAJcmRtc3IoTVNSX0ZTQl9GUkVRLCBtc3JfbG8sIG1zcl90bXApOwogCS8qIHNlZSB0YWJsZSBCLTIgb2YgMjUzNjY5MjAucGRmICovCkBAIC0xNTMsMTIgKzE2MSwxNSBAQAogCX0KIAogCXJkbXNyKE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OLCBtc3JfbG8sIG1zcl90bXApOwotCWRwcmludGsoIlBDT1JFIC0gTVNSX0lBMzJfRUJMX0NSX1BPV0VST046IDB4JXggMHgleFxuIiwgbXNyX2xvLCBtc3JfdG1wKTsKKwlkcHJpbnRrKCJQQ09SRSAtIE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OOiAweCV4IDB4JXhcbiIsCisJCQltc3JfbG8sIG1zcl90bXApOwogCiAJbXNyX3RtcCA9IChtc3JfbG8gPj4gMjIpICYgMHgxZjsKLQlkcHJpbnRrKCJiaXRzIDIyLTI2IGFyZSAweCV4LCBzcGVlZCBpcyAldVxuIiwgbXNyX3RtcCwgKG1zcl90bXAgKiBmc2IpKTsKKwlkcHJpbnRrKCJiaXRzIDIyLTI2IGFyZSAweCV4LCBzcGVlZCBpcyAldVxuIiwKKwkJCW1zcl90bXAsIChtc3JfdG1wICogZnNiKSk7CiAKLQlyZXR1cm4gKG1zcl90bXAgKiBmc2IpOworCXJldCA9IChtc3JfdG1wICogZnNiKTsKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTE2Nyw2ICsxNzgsMTYgQEAKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmYm9vdF9jcHVfZGF0YTsKIAl1MzIgbXNyX2xvLCBtc3JfaGksIG11bHQ7CiAJdW5zaWduZWQgaW50IGZzYiA9IDA7CisJdW5zaWduZWQgaW50IHJldDsKKwl1OCBmc2JfY29kZTsKKworCS8qIFBlbnRpdW0gNCBNb2RlbCAwIGFuZCAxIGRvIG5vdCBoYXZlIHRoZSBDb3JlIENsb2NrIEZyZXF1ZW5jeQorCSAqIHRvIFN5c3RlbSBCdXMgRnJlcXVlbmN5IFJhdGlvIEZpZWxkIGluIHRoZSBQcm9jZXNzb3IgRnJlcXVlbmN5CisJICogQ29uZmlndXJhdGlvbiBSZWdpc3RlciBvZiB0aGUgTVNSLiBUaGVyZWZvcmUgdGhlIGN1cnJlbnQKKwkgKiBmcmVxdWVuY3kgY2Fubm90IGJlIGNhbGN1bGF0ZWQgYW5kIGhhcyB0byBiZSBtZWFzdXJlZC4KKwkgKi8KKwlpZiAoYy0+eDg2X21vZGVsIDwgMikKKwkJcmV0dXJuIGNwdV9raHo7CiAKIAlyZG1zcigweDJjLCBtc3JfbG8sIG1zcl9oaSk7CiAKQEAgLTE3Nyw2MiArMTk4LDYxIEBACiAJICogcmV2aXNpb24gIzEyIGluIFRhYmxlIEItMTogTVNScyBpbiB0aGUgUGVudGl1bSA0IGFuZAogCSAqIEludGVsIFhlb24gUHJvY2Vzc29ycywgb24gcGFnZSBCLTQgYW5kIEItNS4KIAkgKi8KLQlpZiAoYy0+eDg2X21vZGVsIDwgMikKKwlmc2JfY29kZSA9IChtc3JfbG8gPj4gMTYpICYgMHg3OworCXN3aXRjaCAoZnNiX2NvZGUpIHsKKwljYXNlIDA6CiAJCWZzYiA9IDEwMCAqIDEwMDA7Ci0JZWxzZSB7Ci0JCXU4IGZzYl9jb2RlID0gKG1zcl9sbyA+PiAxNikgJiAweDc7Ci0JCXN3aXRjaCAoZnNiX2NvZGUpIHsKLQkJY2FzZSAwOgotCQkJZnNiID0gMTAwICogMTAwMDsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlmc2IgPSAxMzMzMyAqIDEwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCWZzYiA9IDIwMCAqIDEwMDA7Ci0JCQlicmVhazsKLQkJfQorCQlicmVhazsKKwljYXNlIDE6CisJCWZzYiA9IDEzMzMzICogMTA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZnNiID0gMjAwICogMTAwMDsKKwkJYnJlYWs7CiAJfQogCiAJaWYgKCFmc2IpCi0JCXByaW50ayhLRVJOX0RFQlVHICJzcGVlZHN0ZXAtbGliOiBjb3VsZG4ndCBkZXRlY3QgRlNCIHNwZWVkLiBQbGVhc2Ugc2VuZCBhbiBlLW1haWwgdG8gPGxpbnV4QGJyb2RvLmRlPlxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiY291bGRuJ3QgZGV0ZWN0IEZTQiBzcGVlZC4gIgorCQkJCSJQbGVhc2Ugc2VuZCBhbiBlLW1haWwgdG8gPGxpbnV4QGJyb2RvLmRlPlxuIik7CiAKIAkvKiBNdWx0aXBsaWVyLiAqLwogCW11bHQgPSBtc3JfbG8gPj4gMjQ7CiAKLQlkcHJpbnRrKCJQNCAtIEZTQiAldSBrSHo7IE11bHRpcGxpZXIgJXU7IFNwZWVkICV1IGtIelxuIiwgZnNiLCBtdWx0LCAoZnNiICogbXVsdCkpOworCWRwcmludGsoIlA0IC0gRlNCICV1IGtIejsgTXVsdGlwbGllciAldTsgU3BlZWQgJXUga0h6XG4iLAorCQkJZnNiLCBtdWx0LCAoZnNiICogbXVsdCkpOwogCi0JcmV0dXJuIChmc2IgKiBtdWx0KTsKKwlyZXQgPSAoZnNiICogbXVsdCk7CisJcmV0dXJuIHJldDsKIH0KIAogCi11bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KHVuc2lnbmVkIGludCBwcm9jZXNzb3IpCit1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2dldF9mcmVxdWVuY3kodW5zaWduZWQgaW50IHByb2Nlc3NvcikKIHsKIAlzd2l0Y2ggKHByb2Nlc3NvcikgewotCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QQ09SRToKKwljYXNlIFNQRUVEU1RFUF9DUFVfUENPUkU6CiAJCXJldHVybiBwZW50aXVtX2NvcmVfZ2V0X2ZyZXF1ZW5jeSgpOwotCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QTToKKwljYXNlIFNQRUVEU1RFUF9DUFVfUE06CiAJCXJldHVybiBwZW50aXVtTV9nZXRfZnJlcXVlbmN5KCk7Ci0JY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0RDoKLQljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUDRNOgorCWNhc2UgU1BFRURTVEVQX0NQVV9QNEQ6CisJY2FzZSBTUEVFRFNURVBfQ1BVX1A0TToKIAkJcmV0dXJuIHBlbnRpdW00X2dldF9mcmVxdWVuY3koKTsKLQljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9UOgotCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX0M6Ci0JY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQ19FQVJMWToKKwljYXNlIFNQRUVEU1RFUF9DUFVfUElJSV9UOgorCWNhc2UgU1BFRURTVEVQX0NQVV9QSUlJX0M6CisJY2FzZSBTUEVFRFNURVBfQ1BVX1BJSUlfQ19FQVJMWToKIAkJcmV0dXJuIHBlbnRpdW0zX2dldF9mcmVxdWVuY3kocHJvY2Vzc29yKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKIAl9OwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNwZWVkc3RlcF9nZXRfZnJlcXVlbmN5KTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgREVURUNUIFNQRUVEU1RFUC1DQVBBQkxFIFBST0NFU1NPUiAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IgKHZvaWQpCit1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3Iodm9pZCkKIHsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoMCk7CiAJdTMyIGVieCwgbXNyX2xvLCBtc3JfaGk7CkBAIC0yNjEsNyArMjgxLDcgQEAKIAkJCSAqIHNhbXBsZSBoYXMgZWJ4ID0gMHgwZiwgcHJvZHVjdGlvbiBoYXMgMHgwZS4KIAkJCSAqLwogCQkJaWYgKChlYnggPT0gMHgwZSkgfHwgKGVieCA9PSAweDBmKSkKLQkJCQlyZXR1cm4gU1BFRURTVEVQX1BST0NFU1NPUl9QNE07CisJCQkJcmV0dXJuIFNQRUVEU1RFUF9DUFVfUDRNOwogCQkJYnJlYWs7CiAJCWNhc2UgNzoKIAkJCS8qCkBAIC0yNzIsNyArMjkyLDcgQEAKIAkJCSAqIHNhbXBsZXMgYXJlIG9ubHkgb2YgQi1zdGVwcGluZy4uLgogCQkJICovCiAJCQlpZiAoZWJ4ID09IDB4MGUpCi0JCQkJcmV0dXJuIFNQRUVEU1RFUF9QUk9DRVNTT1JfUDRNOworCQkJCXJldHVybiBTUEVFRFNURVBfQ1BVX1A0TTsKIAkJCWJyZWFrOwogCQljYXNlIDk6CiAJCQkvKgpAQCAtMjg4LDEwICszMDgsMTMgQEAKIAkJCSAqIE0tUDQtTXMgbWF5IGhhdmUgZWl0aGVyIGVieD0weGUgb3IgMHhmIFtzZWUgYWJvdmVdCiAJCQkgKiBNLVA0LzUzMyBoYXZlIGVpdGhlciBlYng9MHhlIG9yIDB4Zi4gWzI1MzE3NjA3LnBkZl0KIAkJCSAqIGFsc28sIE0tUDRNIEhUcyBoYXZlIGVieD0weDgsIHRvbwotCQkJICogRm9yIG5vdywgdGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgbW9kZWxfaWQgc3RyaW5nCisJCQkgKiBGb3Igbm93LCB0aGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSBtb2RlbF9pZAorCQkJICogc3RyaW5nCiAJCQkgKi8KLQkJCWlmICgoZWJ4ID09IDB4MGUpIHx8IChzdHJzdHIoYy0+eDg2X21vZGVsX2lkLCJNb2JpbGUgSW50ZWwoUikgUGVudGl1bShSKSA0IikgIT0gTlVMTCkpCi0JCQkJcmV0dXJuIFNQRUVEU1RFUF9QUk9DRVNTT1JfUDRNOworCQkJaWYgKChlYnggPT0gMHgwZSkgfHwKKwkJCQkoc3Ryc3RyKGMtPng4Nl9tb2RlbF9pZCwKKwkJCQkgICAgIk1vYmlsZSBJbnRlbChSKSBQZW50aXVtKFIpIDQiKSAhPSBOVUxMKSkKKwkJCQlyZXR1cm4gU1BFRURTVEVQX0NQVV9QNE07CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwpAQCAtMzAxLDcgKzMyNCw4IEBACiAKIAlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgewogCWNhc2UgMHgwQjogLyogSW50ZWwgUElJSSBbVHVhbGF0aW5dICovCi0JCS8qIGNwdWlkX2VieCgxKSBpcyAweDA0IGZvciBkZXNrdG9wIFBJSUksIDB4MDYgZm9yIG1vYmlsZSBQSUlJLU0gKi8KKwkJLyogY3B1aWRfZWJ4KDEpIGlzIDB4MDQgZm9yIGRlc2t0b3AgUElJSSwKKwkJICogMHgwNiBmb3IgbW9iaWxlIFBJSUktTSAqLwogCQllYnggPSBjcHVpZF9lYngoMHgwMDAwMDAwMSk7CiAJCWRwcmludGsoImVieCBpcyAleFxuIiwgZWJ4KTsKIApAQCAtMzEzLDE0ICszMzcsMTUgQEAKIAkJLyogU28gZmFyIGFsbCBQSUlJLU0gcHJvY2Vzc29ycyBzdXBwb3J0IFNwZWVkU3RlcC4gU2VlCiAJCSAqIEludGVsJ3MgMjQ1NDA2NDAucGRmIG9mIEp1bmUgMjAwMwogCQkgKi8KLQkJcmV0dXJuIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9UOworCQlyZXR1cm4gU1BFRURTVEVQX0NQVV9QSUlJX1Q7CiAKIAljYXNlIDB4MDg6IC8qIEludGVsIFBJSUkgW0NvcHBlcm1pbmVdICovCiAKIAkJLyogYWxsIG1vYmlsZSBQSUlJIENvcHBlcm1pbmVzIGhhdmUgRlNCIDEwMCBNSHoKIAkJICogPT0+IHNvcnQgb3V0IGEgZmV3IGRlc2t0b3AgUElJSXMuICovCiAJCXJkbXNyKE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OLCBtc3JfbG8sIG1zcl9oaSk7Ci0JCWRwcmludGsoIkNvcHBlcm1pbmU6IE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OIGlzIDB4JXgsIDB4JXhcbiIsIG1zcl9sbywgbXNyX2hpKTsKKwkJZHByaW50aygiQ29wcGVybWluZTogTVNSX0lBMzJfRUJMX0NSX1BPV0VST04gaXMgMHgleCwgMHgleFxuIiwKKwkJCQltc3JfbG8sIG1zcl9oaSk7CiAJCW1zcl9sbyAmPSAweDAwYzAwMDA7CiAJCWlmIChtc3JfbG8gIT0gMHgwMDgwMDAwKQogCQkJcmV0dXJuIDA7CkBAIC0zMzIsMTMgKzM1NywxNSBAQAogCQkgKiBiaXQgNTYgb3IgNTcgaXMgc2V0CiAJCSAqLwogCQlyZG1zcihNU1JfSUEzMl9QTEFURk9STV9JRCwgbXNyX2xvLCBtc3JfaGkpOwotCQlkcHJpbnRrKCJDb3BwZXJtaW5lOiBNU1JfSUEzMl9QTEFURk9STSBJRCBpcyAweCV4LCAweCV4XG4iLCBtc3JfbG8sIG1zcl9oaSk7Ci0JCWlmICgobXNyX2hpICYgKDE8PDE4KSkgJiYgKHJlbGF4ZWRfY2hlY2sgPyAxIDogKG1zcl9oaSAmICgzPDwyNCkpKSkgeworCQlkcHJpbnRrKCJDb3BwZXJtaW5lOiBNU1JfSUEzMl9QTEFURk9STSBJRCBpcyAweCV4LCAweCV4XG4iLAorCQkJCW1zcl9sbywgbXNyX2hpKTsKKwkJaWYgKChtc3JfaGkgJiAoMTw8MTgpKSAmJgorCQkgICAgKHJlbGF4ZWRfY2hlY2sgPyAxIDogKG1zcl9oaSAmICgzPDwyNCkpKSkgewogCQkJaWYgKGMtPng4Nl9tYXNrID09IDB4MDEpIHsKIAkJCQlkcHJpbnRrKCJlYXJseSBQSUlJIHZlcnNpb25cbiIpOwotCQkJCXJldHVybiBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQ19FQVJMWTsKKwkJCQlyZXR1cm4gU1BFRURTVEVQX0NQVV9QSUlJX0NfRUFSTFk7CiAJCQl9IGVsc2UKLQkJCQlyZXR1cm4gU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX0M7CisJCQkJcmV0dXJuIFNQRUVEU1RFUF9DUFVfUElJSV9DOwogCQl9CiAKIAlkZWZhdWx0OgpAQCAtMzY5LDcgKzM5Niw3IEBACiAJZHByaW50aygidHJ5aW5nIHRvIGRldGVybWluZSBib3RoIHNwZWVkc1xuIik7CiAKIAkvKiBnZXQgY3VycmVudCBzcGVlZCAqLwotCXByZXZfc3BlZWQgPSBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3kocHJvY2Vzc29yKTsKKwlwcmV2X3NwZWVkID0gc3BlZWRzdGVwX2dldF9mcmVxdWVuY3kocHJvY2Vzc29yKTsKIAlpZiAoIXByZXZfc3BlZWQpCiAJCXJldHVybiAtRUlPOwogCkBAIC0zNzksNyArNDA2LDcgQEAKIAogCS8qIHN3aXRjaCB0byBsb3cgc3RhdGUgKi8KIAlzZXRfc3RhdGUoU1BFRURTVEVQX0xPVyk7Ci0JKmxvd19zcGVlZCA9IHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShwcm9jZXNzb3IpOworCSpsb3dfc3BlZWQgPSBzcGVlZHN0ZXBfZ2V0X2ZyZXF1ZW5jeShwcm9jZXNzb3IpOwogCWlmICghKmxvd19zcGVlZCkgewogCQlyZXQgPSAtRUlPOwogCQlnb3RvIG91dDsKQEAgLTM5OCw3ICs0MjUsNyBAQAogCWlmICh0cmFuc2l0aW9uX2xhdGVuY3kpCiAJCWRvX2dldHRpbWVvZmRheSgmdHYyKTsKIAotCSpoaWdoX3NwZWVkID0gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KHByb2Nlc3Nvcik7CisJKmhpZ2hfc3BlZWQgPSBzcGVlZHN0ZXBfZ2V0X2ZyZXF1ZW5jeShwcm9jZXNzb3IpOwogCWlmICghKmhpZ2hfc3BlZWQpIHsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXQ7CkBAIC00MjYsOSArNDUzLDEyIEBACiAJCS8qIGNoZWNrIGlmIHRoZSBsYXRlbmN5IG1lYXN1cmVtZW50IGlzIHRvbyBoaWdoIG9yIHRvbyBsb3cKIAkJICogYW5kIHNldCBpdCB0byBhIHNhZmUgdmFsdWUgKDUwMHVTZWMpIGluIHRoYXQgY2FzZQogCQkgKi8KLQkJaWYgKCp0cmFuc2l0aW9uX2xhdGVuY3kgPiAxMDAwMDAwMCB8fCAqdHJhbnNpdGlvbl9sYXRlbmN5IDwgNTAwMDApIHsKLQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJzcGVlZHN0ZXA6IGZyZXF1ZW5jeSB0cmFuc2l0aW9uIG1lYXN1cmVkIHNlZW1zIG91dCBvZiAiCi0JCQkJCSJyYW5nZSAoJXUgblNlYyksIGZhbGxpbmcgYmFjayB0byBhIHNhZmUgb25lIG9mICV1IG5TZWMuXG4iLAorCQlpZiAoKnRyYW5zaXRpb25fbGF0ZW5jeSA+IDEwMDAwMDAwIHx8CisJCSAgICAqdHJhbnNpdGlvbl9sYXRlbmN5IDwgNTAwMDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJmcmVxdWVuY3kgdHJhbnNpdGlvbiAiCisJCQkJCSJtZWFzdXJlZCBzZWVtcyBvdXQgb2YgcmFuZ2UgKCV1ICIKKwkJCQkJIm5TZWMpLCBmYWxsaW5nIGJhY2sgdG8gYSBzYWZlIG9uZSBvZiIKKwkJCQkJIiV1IG5TZWMuXG4iLAogCQkJCQkqdHJhbnNpdGlvbl9sYXRlbmN5LCA1MDAwMDApOwogCQkJKnRyYW5zaXRpb25fbGF0ZW5jeSA9IDUwMDAwMDsKIAkJfQpAQCAtNDM2LDE1ICs0NjYsMTYgQEAKIAogb3V0OgogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gKHJldCk7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwZWVkc3RlcF9nZXRfZnJlcXMpOwogCiAjaWZkZWYgQ09ORklHX1g4Nl9TUEVFRFNURVBfUkVMQVhFRF9DQVBfQ0hFQ0sKIG1vZHVsZV9wYXJhbShyZWxheGVkX2NoZWNrLCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhyZWxheGVkX2NoZWNrLCAiRG9uJ3QgZG8gYWxsIGNoZWNrcyBmb3Igc3BlZWRzdGVwIGNhcGFiaWxpdHkuIik7CitNT0RVTEVfUEFSTV9ERVNDKHJlbGF4ZWRfY2hlY2ssCisJCSJEb24ndCBkbyBhbGwgY2hlY2tzIGZvciBzcGVlZHN0ZXAgY2FwYWJpbGl0eS4iKTsKICNlbmRpZgogCi1NT0RVTEVfQVVUSE9SICgiRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OICgiTGlicmFyeSBmb3IgSW50ZWwgU3BlZWRTdGVwIDEgb3IgMiBjcHVmcmVxIGRyaXZlcnMuIik7Ci1NT0RVTEVfTElDRU5TRSAoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMaWJyYXJ5IGZvciBJbnRlbCBTcGVlZFN0ZXAgMSBvciAyIGNwdWZyZXEgZHJpdmVycy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmggYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5oCmluZGV4IGIxMWJjYzYuLjJiNmMwNGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmgKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuaApAQCAtMTIsMTcgKzEyLDE3IEBACiAKIC8qIHByb2Nlc3NvcnMgKi8KIAotI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQ19FQVJMWQkweDAwMDAwMDAxICAvKiBDb3BwZXJtaW5lIGNvcmUgKi8KLSNkZWZpbmUgU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX0MJCTB4MDAwMDAwMDIgIC8qIENvcHBlcm1pbmUgY29yZSAqLwotI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfVAkJMHgwMDAwMDAwMyAgLyogVHVhbGF0aW4gY29yZSAqLwotI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0TQkJCTB4MDAwMDAwMDQgIC8qIFA0LU0gICovCisjZGVmaW5lIFNQRUVEU1RFUF9DUFVfUElJSV9DX0VBUkxZCTB4MDAwMDAwMDEgIC8qIENvcHBlcm1pbmUgY29yZSAqLworI2RlZmluZSBTUEVFRFNURVBfQ1BVX1BJSUlfQwkJMHgwMDAwMDAwMiAgLyogQ29wcGVybWluZSBjb3JlICovCisjZGVmaW5lIFNQRUVEU1RFUF9DUFVfUElJSV9UCQkweDAwMDAwMDAzICAvKiBUdWFsYXRpbiBjb3JlICovCisjZGVmaW5lIFNQRUVEU1RFUF9DUFVfUDRNCQkweDAwMDAwMDA0ICAvKiBQNC1NICAqLwogCiAvKiB0aGUgZm9sbG93aW5nIHByb2Nlc3NvcnMgYXJlIG5vdCBzcGVlZHN0ZXAtY2FwYWJsZSBhbmQgYXJlIG5vdCBhdXRvLWRldGVjdGVkCiAgKiBpbiBzcGVlZHN0ZXBfZGV0ZWN0X3Byb2Nlc3NvcigpLiBIb3dldmVyLCB0aGVpciBzcGVlZCBjYW4gYmUgZGV0ZWN0ZWQgdXNpbmcKLSAqIHRoZSBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3koKSBjYWxsLiAqLwotI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BNCQkJMHhGRkZGRkYwMyAgLyogUGVudGl1bSBNICAqLwotI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0RAkJCTB4RkZGRkZGMDQgIC8qIGRlc2t0b3AgUDQgICovCi0jZGVmaW5lIFNQRUVEU1RFUF9QUk9DRVNTT1JfUENPUkUJCTB4RkZGRkZGMDUgIC8qIENvcmUgKi8KKyAqIHRoZSBzcGVlZHN0ZXBfZ2V0X2ZyZXF1ZW5jeSgpIGNhbGwuICovCisjZGVmaW5lIFNQRUVEU1RFUF9DUFVfUE0JCTB4RkZGRkZGMDMgIC8qIFBlbnRpdW0gTSAgKi8KKyNkZWZpbmUgU1BFRURTVEVQX0NQVV9QNEQJCTB4RkZGRkZGMDQgIC8qIGRlc2t0b3AgUDQgICovCisjZGVmaW5lIFNQRUVEU1RFUF9DUFVfUENPUkUJCTB4RkZGRkZGMDUgIC8qIENvcmUgKi8KIAogLyogc3BlZWRzdGVwIHN0YXRlcyAtLSBvbmx5IHR3byBvZiB0aGVtICovCiAKQEAgLTM0LDcgKzM0LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IgKHZvaWQpOwogCiAvKiBkZXRlY3QgdGhlIGN1cnJlbnQgc3BlZWQgKGluIGtoeikgb2YgdGhlIHByb2Nlc3NvciAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3kodW5zaWduZWQgaW50IHByb2Nlc3Nvcik7CitleHRlcm4gdW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXRfZnJlcXVlbmN5KHVuc2lnbmVkIGludCBwcm9jZXNzb3IpOwogCiAKIC8qIGRldGVjdCB0aGUgbG93IGFuZCBoaWdoIHNwZWVkcyBvZiB0aGUgcHJvY2Vzc29yLiBUaGUgY2FsbGJhY2sKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jCmluZGV4IDhhODVjOTMuLmJlZmVhMDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1zbWkuYwpAQCAtMTksOCArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9pc3QuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgInNwZWVkc3RlcC1saWIuaCIKIApAQCAtMzAsMTIgKzMwLDEyIEBACiAgKiBJZiB1c2VyIGdpdmVzIGl0LCB0aGVzZSBhcmUgdXNlZC4KICAqCiAgKi8KLXN0YXRpYyBpbnQgc21pX3BvcnQgPSAwOwotc3RhdGljIGludCBzbWlfY21kID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc21pX3NpZyA9IDA7CitzdGF0aWMgaW50IHNtaV9wb3J0Oworc3RhdGljIGludCBzbWlfY21kOworc3RhdGljIHVuc2lnbmVkIGludCBzbWlfc2lnOwogCiAvKiBpbmZvIGFib3V0IHRoZSBwcm9jZXNzb3IgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX3Byb2Nlc3NvciA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHNwZWVkc3RlcF9wcm9jZXNzb3I7CiAKIC8qCiAgKiBUaGVyZSBhcmUgb25seSB0d28gZnJlcXVlbmN5IHN0YXRlcyBmb3IgZWFjaCBwcm9jZXNzb3IuIFZhbHVlcwpAQCAtNTYsMTIgKzU2LDEzIEBACiAgKiBvZiBETUEgYWN0aXZpdHkgZ29pbmcgb24/ICovCiAjZGVmaW5lIFNNSV9UUklFUyA1CiAKLSNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAic3BlZWRzdGVwLXNtaSIsIG1zZykKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCBcCisJCSJzcGVlZHN0ZXAtc21pIiwgbXNnKQogCiAvKioKICAqIHNwZWVkc3RlcF9zbWlfb3duZXJzaGlwCiAgKi8KLXN0YXRpYyBpbnQgc3BlZWRzdGVwX3NtaV9vd25lcnNoaXAgKHZvaWQpCitzdGF0aWMgaW50IHNwZWVkc3RlcF9zbWlfb3duZXJzaGlwKHZvaWQpCiB7CiAJdTMyIGNvbW1hbmQsIHJlc3VsdCwgbWFnaWMsIGR1bW15OwogCXUzMiBmdW5jdGlvbiA9IEdFVF9TUEVFRFNURVBfT1dORVI7CkBAIC03MCwxNiArNzEsMTggQEAKIAljb21tYW5kID0gKHNtaV9zaWcgJiAweGZmZmZmZjAwKSB8IChzbWlfY21kICYgMHhmZik7CiAJbWFnaWMgPSB2aXJ0X3RvX3BoeXMobWFnaWNfZGF0YSk7CiAKLQlkcHJpbnRrKCJ0cnlpbmcgdG8gb2J0YWluIG93bmVyc2hpcCB3aXRoIGNvbW1hbmQgJXggYXQgcG9ydCAleFxuIiwgY29tbWFuZCwgc21pX3BvcnQpOworCWRwcmludGsoInRyeWluZyB0byBvYnRhaW4gb3duZXJzaGlwIHdpdGggY29tbWFuZCAleCBhdCBwb3J0ICV4XG4iLAorCQkJY29tbWFuZCwgc21pX3BvcnQpOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSJwdXNoICUlZWJwXG4iCiAJCSJvdXQgJSVhbCwgKCUlZHgpXG4iCiAJCSJwb3AgJSVlYnBcbiIKLQkJOiAiPUQiIChyZXN1bHQpLCAiPWEiIChkdW1teSksICI9YiIgKGR1bW15KSwgIj1jIiAoZHVtbXkpLCAiPWQiIChkdW1teSksCi0JCQkiPVMiIChkdW1teSkKKwkJOiAiPUQiIChyZXN1bHQpLAorCQkgICI9YSIgKGR1bW15KSwgIj1iIiAoZHVtbXkpLCAiPWMiIChkdW1teSksICI9ZCIgKGR1bW15KSwKKwkJICAiPVMiIChkdW1teSkKIAkJOiAiYSIgKGNvbW1hbmQpLCAiYiIgKGZ1bmN0aW9uKSwgImMiICgwKSwgImQiIChzbWlfcG9ydCksCi0JCQkiRCIgKDApLCAiUyIgKG1hZ2ljKQorCQkgICJEIiAoMCksICJTIiAobWFnaWMpCiAJCTogIm1lbW9yeSIKIAkpOwogCkBAIC05NywxMCArMTAwLDEwIEBACiAgKiBldmVuIGhhbmdzIFtjZi4gYnVnbWUub3NkbC5vcmcgIyAxNDIyXSBvbiBlYXJsaWVyIHN5c3RlbXMuIEVtcGlyaWNhbCB0ZXN0aW5nCiAgKiBzaG93cyB0aGF0IHRoZSBsYXR0ZXIgb2NjdXJzIGlmICEoaXN0X2luZm8uZXZlbnQgJiAweEZGRkYpLgogICovCi1zdGF0aWMgaW50IHNwZWVkc3RlcF9zbWlfZ2V0X2ZyZXFzICh1bnNpZ25lZCBpbnQgKmxvdywgdW5zaWduZWQgaW50ICpoaWdoKQorc3RhdGljIGludCBzcGVlZHN0ZXBfc21pX2dldF9mcmVxcyh1bnNpZ25lZCBpbnQgKmxvdywgdW5zaWduZWQgaW50ICpoaWdoKQogewogCXUzMiBjb21tYW5kLCByZXN1bHQgPSAwLCBlZGksIGhpZ2hfbWh6LCBsb3dfbWh6LCBkdW1teTsKLQl1MzIgc3RhdGU9MDsKKwl1MzIgc3RhdGUgPSAwOwogCXUzMiBmdW5jdGlvbiA9IEdFVF9TUEVFRFNURVBfRlJFUVM7CiAKIAlpZiAoIShpc3RfaW5mby5ldmVudCAmIDB4RkZGRikpIHsKQEAgLTExMCwxNyArMTEzLDI1IEBACiAKIAljb21tYW5kID0gKHNtaV9zaWcgJiAweGZmZmZmZjAwKSB8IChzbWlfY21kICYgMHhmZik7CiAKLQlkcHJpbnRrKCJ0cnlpbmcgdG8gZGV0ZXJtaW5lIGZyZXF1ZW5jaWVzIHdpdGggY29tbWFuZCAleCBhdCBwb3J0ICV4XG4iLCBjb21tYW5kLCBzbWlfcG9ydCk7CisJZHByaW50aygidHJ5aW5nIHRvIGRldGVybWluZSBmcmVxdWVuY2llcyB3aXRoIGNvbW1hbmQgJXggYXQgcG9ydCAleFxuIiwKKwkJCWNvbW1hbmQsIHNtaV9wb3J0KTsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCQkicHVzaCAlJWVicFxuIgogCQkib3V0ICUlYWwsICglJWR4KVxuIgogCQkicG9wICUlZWJwIgotCQk6ICI9YSIgKHJlc3VsdCksICI9YiIgKGhpZ2hfbWh6KSwgIj1jIiAobG93X21oeiksICI9ZCIgKHN0YXRlKSwgIj1EIiAoZWRpKSwgIj1TIiAoZHVtbXkpCi0JCTogImEiIChjb21tYW5kKSwgImIiIChmdW5jdGlvbiksICJjIiAoc3RhdGUpLCAiZCIgKHNtaV9wb3J0KSwgIlMiICgwKSwgIkQiICgwKQorCQk6ICI9YSIgKHJlc3VsdCksCisJCSAgIj1iIiAoaGlnaF9taHopLAorCQkgICI9YyIgKGxvd19taHopLAorCQkgICI9ZCIgKHN0YXRlKSwgIj1EIiAoZWRpKSwgIj1TIiAoZHVtbXkpCisJCTogImEiIChjb21tYW5kKSwKKwkJICAiYiIgKGZ1bmN0aW9uKSwKKwkJICAiYyIgKHN0YXRlKSwKKwkJICAiZCIgKHNtaV9wb3J0KSwgIlMiICgwKSwgIkQiICgwKQogCSk7CiAKLQlkcHJpbnRrKCJyZXN1bHQgJXgsIGxvd19mcmVxICV1LCBoaWdoX2ZyZXEgJXVcbiIsIHJlc3VsdCwgbG93X21oeiwgaGlnaF9taHopOworCWRwcmludGsoInJlc3VsdCAleCwgbG93X2ZyZXEgJXUsIGhpZ2hfZnJlcSAldVxuIiwKKwkJCXJlc3VsdCwgbG93X21oeiwgaGlnaF9taHopOwogCiAJLyogYWJvcnQgaWYgcmVzdWx0cyBhcmUgb2J2aW91c2x5IGluY29ycmVjdC4uLiAqLwogCWlmICgoaGlnaF9taHogKyBsb3dfbWh6KSA8IDYwMCkKQEAgLTEzNywyNiArMTQ4LDMwIEBACiAgKiBAc3RhdGU6IHByb2Nlc3NvciBmcmVxdWVuY3kgc3RhdGUgKFNQRUVEU1RFUF9MT1cgb3IgU1BFRURTVEVQX0hJR0gpCiAgKgogICovCi1zdGF0aWMgaW50IHNwZWVkc3RlcF9nZXRfc3RhdGUgKHZvaWQpCitzdGF0aWMgaW50IHNwZWVkc3RlcF9nZXRfc3RhdGUodm9pZCkKIHsKLQl1MzIgZnVuY3Rpb249R0VUX1NQRUVEU1RFUF9TVEFURTsKKwl1MzIgZnVuY3Rpb24gPSBHRVRfU1BFRURTVEVQX1NUQVRFOwogCXUzMiByZXN1bHQsIHN0YXRlLCBlZGksIGNvbW1hbmQsIGR1bW15OwogCiAJY29tbWFuZCA9IChzbWlfc2lnICYgMHhmZmZmZmYwMCkgfCAoc21pX2NtZCAmIDB4ZmYpOwogCi0JZHByaW50aygidHJ5aW5nIHRvIGRldGVybWluZSBjdXJyZW50IHNldHRpbmcgd2l0aCBjb21tYW5kICV4IGF0IHBvcnQgJXhcbiIsIGNvbW1hbmQsIHNtaV9wb3J0KTsKKwlkcHJpbnRrKCJ0cnlpbmcgdG8gZGV0ZXJtaW5lIGN1cnJlbnQgc2V0dGluZyB3aXRoIGNvbW1hbmQgJXggIgorCQkiYXQgcG9ydCAleFxuIiwgY29tbWFuZCwgc21pX3BvcnQpOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSJwdXNoICUlZWJwXG4iCiAJCSJvdXQgJSVhbCwgKCUlZHgpXG4iCiAJCSJwb3AgJSVlYnBcbiIKLQkJOiAiPWEiIChyZXN1bHQpLCAiPWIiIChzdGF0ZSksICI9RCIgKGVkaSksICI9YyIgKGR1bW15KSwgIj1kIiAoZHVtbXkpLCAiPVMiIChkdW1teSkKLQkJOiAiYSIgKGNvbW1hbmQpLCAiYiIgKGZ1bmN0aW9uKSwgImMiICgwKSwgImQiIChzbWlfcG9ydCksICJTIiAoMCksICJEIiAoMCkKKwkJOiAiPWEiIChyZXN1bHQpLAorCQkgICI9YiIgKHN0YXRlKSwgIj1EIiAoZWRpKSwKKwkJICAiPWMiIChkdW1teSksICI9ZCIgKGR1bW15KSwgIj1TIiAoZHVtbXkpCisJCTogImEiIChjb21tYW5kKSwgImIiIChmdW5jdGlvbiksICJjIiAoMCksCisJCSAgImQiIChzbWlfcG9ydCksICJTIiAoMCksICJEIiAoMCkKIAkpOwogCiAJZHByaW50aygic3RhdGUgaXMgJXgsIHJlc3VsdCBpcyAleFxuIiwgc3RhdGUsIHJlc3VsdCk7CiAKLQlyZXR1cm4gKHN0YXRlICYgMSk7CisJcmV0dXJuIHN0YXRlICYgMTsKIH0KIAogCkBAIC0xNjUsMTEgKzE4MCwxMSBAQAogICogQHN0YXRlOiBuZXcgcHJvY2Vzc29yIGZyZXF1ZW5jeSBzdGF0ZSAoU1BFRURTVEVQX0xPVyBvciBTUEVFRFNURVBfSElHSCkKICAqCiAgKi8KLXN0YXRpYyB2b2lkIHNwZWVkc3RlcF9zZXRfc3RhdGUgKHVuc2lnbmVkIGludCBzdGF0ZSkKK3N0YXRpYyB2b2lkIHNwZWVkc3RlcF9zZXRfc3RhdGUodW5zaWduZWQgaW50IHN0YXRlKQogewogCXVuc2lnbmVkIGludCByZXN1bHQgPSAwLCBjb21tYW5kLCBuZXdfc3RhdGUsIGR1bW15OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGZ1bmN0aW9uPVNFVF9TUEVFRFNURVBfU1RBVEU7CisJdW5zaWduZWQgaW50IGZ1bmN0aW9uID0gU0VUX1NQRUVEU1RFUF9TVEFURTsKIAl1bnNpZ25lZCBpbnQgcmV0cnkgPSAwOwogCiAJaWYgKHN0YXRlID4gMHgxKQpAQCAtMTgwLDExICsxOTUsMTQgQEAKIAogCWNvbW1hbmQgPSAoc21pX3NpZyAmIDB4ZmZmZmZmMDApIHwgKHNtaV9jbWQgJiAweGZmKTsKIAotCWRwcmludGsoInRyeWluZyB0byBzZXQgZnJlcXVlbmN5IHRvIHN0YXRlICV1IHdpdGggY29tbWFuZCAleCBhdCBwb3J0ICV4XG4iLCBzdGF0ZSwgY29tbWFuZCwgc21pX3BvcnQpOworCWRwcmludGsoInRyeWluZyB0byBzZXQgZnJlcXVlbmN5IHRvIHN0YXRlICV1ICIKKwkJIndpdGggY29tbWFuZCAleCBhdCBwb3J0ICV4XG4iLAorCQlzdGF0ZSwgY29tbWFuZCwgc21pX3BvcnQpOwogCiAJZG8gewogCQlpZiAocmV0cnkpIHsKLQkJCWRwcmludGsoInJldHJ5ICV1LCBwcmV2aW91cyByZXN1bHQgJXUsIHdhaXRpbmcuLi5cbiIsIHJldHJ5LCByZXN1bHQpOworCQkJZHByaW50aygicmV0cnkgJXUsIHByZXZpb3VzIHJlc3VsdCAldSwgd2FpdGluZy4uLlxuIiwKKwkJCQkJcmV0cnksIHJlc3VsdCk7CiAJCQltZGVsYXkocmV0cnkgKiA1MCk7CiAJCX0KIAkJcmV0cnkrKzsKQEAgLTE5MiwyMCArMjEwLDI2IEBACiAJCQkicHVzaCAlJWVicFxuIgogCQkJIm91dCAlJWFsLCAoJSVkeClcbiIKIAkJCSJwb3AgJSVlYnAiCi0JCQk6ICI9YiIgKG5ld19zdGF0ZSksICI9RCIgKHJlc3VsdCksICI9YyIgKGR1bW15KSwgIj1hIiAoZHVtbXkpLAotCQkJCSI9ZCIgKGR1bW15KSwgIj1TIiAoZHVtbXkpCi0JCQk6ICJhIiAoY29tbWFuZCksICJiIiAoZnVuY3Rpb24pLCAiYyIgKHN0YXRlKSwgImQiIChzbWlfcG9ydCksICJTIiAoMCksICJEIiAoMCkKKwkJCTogIj1iIiAobmV3X3N0YXRlKSwgIj1EIiAocmVzdWx0KSwKKwkJCSAgIj1jIiAoZHVtbXkpLCAiPWEiIChkdW1teSksCisJCQkgICI9ZCIgKGR1bW15KSwgIj1TIiAoZHVtbXkpCisJCQk6ICJhIiAoY29tbWFuZCksICJiIiAoZnVuY3Rpb24pLCAiYyIgKHN0YXRlKSwKKwkJCSAgImQiIChzbWlfcG9ydCksICJTIiAoMCksICJEIiAoMCkKIAkJCSk7CiAJfSB3aGlsZSAoKG5ld19zdGF0ZSAhPSBzdGF0ZSkgJiYgKHJldHJ5IDw9IFNNSV9UUklFUykpOwogCiAJLyogZW5hYmxlIElSUXMgKi8KIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKLQlpZiAobmV3X3N0YXRlID09IHN0YXRlKSB7Ci0JCWRwcmludGsoImNoYW5nZSB0byAldSBNSHogc3VjY2VlZGVkIGFmdGVyICV1IHRyaWVzIHdpdGggcmVzdWx0ICV1XG4iLCAoc3BlZWRzdGVwX2ZyZXFzW25ld19zdGF0ZV0uZnJlcXVlbmN5IC8gMTAwMCksIHJldHJ5LCByZXN1bHQpOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogY2hhbmdlIHRvIHN0YXRlICV1IGZhaWxlZCB3aXRoIG5ld19zdGF0ZSAldSBhbmQgcmVzdWx0ICV1XG4iLCBzdGF0ZSwgbmV3X3N0YXRlLCByZXN1bHQpOwotCX0KKwlpZiAobmV3X3N0YXRlID09IHN0YXRlKQorCQlkcHJpbnRrKCJjaGFuZ2UgdG8gJXUgTUh6IHN1Y2NlZWRlZCBhZnRlciAldSB0cmllcyAiCisJCQkid2l0aCByZXN1bHQgJXVcbiIsCisJCQkoc3BlZWRzdGVwX2ZyZXFzW25ld19zdGF0ZV0uZnJlcXVlbmN5IC8gMTAwMCksCisJCQlyZXRyeSwgcmVzdWx0KTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogY2hhbmdlIHRvIHN0YXRlICV1ICIKKwkJCSJmYWlsZWQgd2l0aCBuZXdfc3RhdGUgJXUgYW5kIHJlc3VsdCAldVxuIiwKKwkJCXN0YXRlLCBuZXdfc3RhdGUsIHJlc3VsdCk7CiAKIAlyZXR1cm47CiB9CkBAIC0yMTksMTMgKzI0MywxNCBAQAogICoKICAqIFNldHMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kvZnJlcS4KICAqLwotc3RhdGljIGludCBzcGVlZHN0ZXBfdGFyZ2V0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKK3N0YXRpYyBpbnQgc3BlZWRzdGVwX3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCXVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwgdW5zaWduZWQgaW50IHJlbGF0aW9uKQogewogCXVuc2lnbmVkIGludCBuZXdzdGF0ZSA9IDA7CiAJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CiAKLQlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgJnNwZWVkc3RlcF9mcmVxc1swXSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQorCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmc3BlZWRzdGVwX2ZyZXFzWzBdLAorCQkJCXRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmcmVxcy5vbGQgPSBzcGVlZHN0ZXBfZnJlcXNbc3BlZWRzdGVwX2dldF9zdGF0ZSgpXS5mcmVxdWVuY3k7CkBAIC0yNTAsNyArMjc1LDcgQEAKICAqIExpbWl0IG11c3QgYmUgd2l0aGluIHNwZWVkc3RlcF9sb3dfZnJlcSBhbmQgc3BlZWRzdGVwX2hpZ2hfZnJlcSwgd2l0aAogICogYXQgbGVhc3Qgb25lIGJvcmRlciBpbmNsdWRlZC4KICAqLwotc3RhdGljIGludCBzcGVlZHN0ZXBfdmVyaWZ5IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3N0YXRpYyBpbnQgc3BlZWRzdGVwX3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgJnNwZWVkc3RlcF9mcmVxc1swXSk7CiB9CkBAIC0yNTksNyArMjg0LDggQEAKIHN0YXRpYyBpbnQgc3BlZWRzdGVwX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgaW50IHNwZWVkLHN0YXRlOworCXVuc2lnbmVkIGludCBzcGVlZCwgc3RhdGU7CisJdW5zaWduZWQgaW50ICpsb3csICpoaWdoOwogCiAJLyogY2FwYWJpbGl0eSBjaGVjayAqLwogCWlmIChwb2xpY3ktPmNwdSAhPSAwKQpAQCAtMjcyLDE5ICsyOTgsMjMgQEAKIAl9CiAKIAkvKiBkZXRlY3QgbG93IGFuZCBoaWdoIGZyZXF1ZW5jeSAqLwotCXJlc3VsdCA9IHNwZWVkc3RlcF9zbWlfZ2V0X2ZyZXFzKCZzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0xPV10uZnJlcXVlbmN5LAotCQkJCSZzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0hJR0hdLmZyZXF1ZW5jeSk7CisJbG93ID0gJnNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfTE9XXS5mcmVxdWVuY3k7CisJaGlnaCA9ICZzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0hJR0hdLmZyZXF1ZW5jeTsKKworCXJlc3VsdCA9IHNwZWVkc3RlcF9zbWlfZ2V0X2ZyZXFzKGxvdywgaGlnaCk7CiAJaWYgKHJlc3VsdCkgewotCQkvKiBmYWxsIGJhY2sgdG8gc3BlZWRzdGVwX2xpYi5jIGRlY3Rpb24gbWVjaGFuaXNtOiB0cnkgYm90aCBzdGF0ZXMgb3V0ICovCi0JCWRwcmludGsoImNvdWxkIG5vdCBkZXRlY3QgbG93IGFuZCBoaWdoIGZyZXF1ZW5jaWVzIGJ5IFNNSSBjYWxsLlxuIik7CisJCS8qIGZhbGwgYmFjayB0byBzcGVlZHN0ZXBfbGliLmMgZGVjdGlvbiBtZWNoYW5pc206CisJCSAqIHRyeSBib3RoIHN0YXRlcyBvdXQgKi8KKwkJZHByaW50aygiY291bGQgbm90IGRldGVjdCBsb3cgYW5kIGhpZ2ggZnJlcXVlbmNpZXMgIgorCQkJCSJieSBTTUkgY2FsbC5cbiIpOwogCQlyZXN1bHQgPSBzcGVlZHN0ZXBfZ2V0X2ZyZXFzKHNwZWVkc3RlcF9wcm9jZXNzb3IsCi0JCQkJJnNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfTE9XXS5mcmVxdWVuY3ksCi0JCQkJJnNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfSElHSF0uZnJlcXVlbmN5LAorCQkJCWxvdywgaGlnaCwKIAkJCQlOVUxMLAogCQkJCSZzcGVlZHN0ZXBfc2V0X3N0YXRlKTsKIAogCQlpZiAocmVzdWx0KSB7Ci0JCQlkcHJpbnRrKCJjb3VsZCBub3QgZGV0ZWN0IHR3byBkaWZmZXJlbnQgc3BlZWRzIC0tIGFib3J0aW5nLlxuIik7CisJCQlkcHJpbnRrKCJjb3VsZCBub3QgZGV0ZWN0IHR3byBkaWZmZXJlbnQgc3BlZWRzIgorCQkJCQkiIC0tIGFib3J0aW5nLlxuIik7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9IGVsc2UKIAkJCWRwcmludGsoIndvcmthcm91bmQgd29ya2VkLlxuIik7CkBAIC0yOTUsNyArMzI1LDggQEAKIAlzcGVlZCA9IHNwZWVkc3RlcF9mcmVxc1tzdGF0ZV0uZnJlcXVlbmN5OwogCiAJZHByaW50aygiY3VycmVudGx5IGF0ICVzIHNwZWVkIHNldHRpbmcgLSAlaSBNSHpcbiIsCi0JCShzcGVlZCA9PSBzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0xPV10uZnJlcXVlbmN5KSA/ICJsb3ciIDogImhpZ2giLAorCQkoc3BlZWQgPT0gc3BlZWRzdGVwX2ZyZXFzW1NQRUVEU1RFUF9MT1ddLmZyZXF1ZW5jeSkKKwkJPyAibG93IiA6ICJoaWdoIiwKIAkJKHNwZWVkIC8gMTAwMCkpOwogCiAJLyogY3B1aW5mbyBhbmQgZGVmYXVsdCBwb2xpY3kgdmFsdWVzICovCkBAIC0zMDQsNyArMzM1LDcgQEAKIAogCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBzcGVlZHN0ZXBfZnJlcXMpOwogCWlmIChyZXN1bHQpCi0JCXJldHVybiAocmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKIAogCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKHNwZWVkc3RlcF9mcmVxcywgcG9saWN5LT5jcHUpOwogCkBAIC0zMjEsNyArMzUyLDcgQEAKIHsKIAlpZiAoY3B1KQogCQlyZXR1cm4gLUVOT0RFVjsKLQlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KHNwZWVkc3RlcF9wcm9jZXNzb3IpOworCXJldHVybiBzcGVlZHN0ZXBfZ2V0X2ZyZXF1ZW5jeShzcGVlZHN0ZXBfcHJvY2Vzc29yKTsKIH0KIAogCkBAIC0zMzUsNyArMzY2LDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogc3BlZWRzdGVwX2F0dHJbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyICpzcGVlZHN0ZXBfYXR0cltdID0gewogCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKIAlOVUxMLAogfTsKQEAgLTM2NCwyMSArMzk1LDIzIEBACiAJc3BlZWRzdGVwX3Byb2Nlc3NvciA9IHNwZWVkc3RlcF9kZXRlY3RfcHJvY2Vzc29yKCk7CiAKIAlzd2l0Y2ggKHNwZWVkc3RlcF9wcm9jZXNzb3IpIHsKLQljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9UOgotCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX0M6Ci0JY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQ19FQVJMWToKKwljYXNlIFNQRUVEU1RFUF9DUFVfUElJSV9UOgorCWNhc2UgU1BFRURTVEVQX0NQVV9QSUlJX0M6CisJY2FzZSBTUEVFRFNURVBfQ1BVX1BJSUlfQ19FQVJMWToKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc3BlZWRzdGVwX3Byb2Nlc3NvciA9IDA7CiAJfQogCiAJaWYgKCFzcGVlZHN0ZXBfcHJvY2Vzc29yKSB7Ci0JCWRwcmludGsgKCJObyBzdXBwb3J0ZWQgSW50ZWwgQ1BVIGRldGVjdGVkLlxuIik7CisJCWRwcmludGsoIk5vIHN1cHBvcnRlZCBJbnRlbCBDUFUgZGV0ZWN0ZWQuXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JZHByaW50aygic2lnbmF0dXJlOjB4JS44bHgsIGNvbW1hbmQ6MHglLjhseCwgZXZlbnQ6MHglLjhseCwgcGVyZl9sZXZlbDoweCUuOGx4LlxuIiwKLQkJaXN0X2luZm8uc2lnbmF0dXJlLCBpc3RfaW5mby5jb21tYW5kLCBpc3RfaW5mby5ldmVudCwgaXN0X2luZm8ucGVyZl9sZXZlbCk7CisJZHByaW50aygic2lnbmF0dXJlOjB4JS44bHgsIGNvbW1hbmQ6MHglLjhseCwgIgorCQkiZXZlbnQ6MHglLjhseCwgcGVyZl9sZXZlbDoweCUuOGx4LlxuIiwKKwkJaXN0X2luZm8uc2lnbmF0dXJlLCBpc3RfaW5mby5jb21tYW5kLAorCQlpc3RfaW5mby5ldmVudCwgaXN0X2luZm8ucGVyZl9sZXZlbCk7CiAKIAkvKiBFcnJvciBpZiBubyBJU1QtU01JIEJJT1Mgb3Igbm8gUEFSTQogCQkgc2lnPSAnSVNHRScgYWthICdJbnRlbCBTcGVlZHN0ZXAgR2F0ZSBFJyAqLwpAQCAtNDE2LDE3ICs0NDksMjAgQEAKIAljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZzcGVlZHN0ZXBfZHJpdmVyKTsKIH0KIAotbW9kdWxlX3BhcmFtKHNtaV9wb3J0LCAgaW50LCAwNDQ0KTsKLW1vZHVsZV9wYXJhbShzbWlfY21kLCAgIGludCwgMDQ0NCk7Ci1tb2R1bGVfcGFyYW0oc21pX3NpZywgIHVpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHNtaV9wb3J0LCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHNtaV9jbWQsICBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHNtaV9zaWcsIHVpbnQsIDA0NDQpOwogCi1NT0RVTEVfUEFSTV9ERVNDKHNtaV9wb3J0LCAiT3ZlcnJpZGUgdGhlIEJJT1MtZ2l2ZW4gSVNUIHBvcnQgd2l0aCB0aGlzIHZhbHVlIC0tIEludGVsJ3MgZGVmYXVsdCBzZXR0aW5nIGlzIDB4YjIiKTsKLU1PRFVMRV9QQVJNX0RFU0Moc21pX2NtZCwgIk92ZXJyaWRlIHRoZSBCSU9TLWdpdmVuIElTVCBjb21tYW5kIHdpdGggdGhpcyB2YWx1ZSAtLSBJbnRlbCdzIGRlZmF1bHQgc2V0dGluZyBpcyAweDgyIik7Ci1NT0RVTEVfUEFSTV9ERVNDKHNtaV9zaWcsICJTZXQgdG8gMSB0byBmYWtlIHRoZSBJU1Qgc2lnbmF0dXJlIHdoZW4gdXNpbmcgdGhlIFNNSSBpbnRlcmZhY2UuIik7CitNT0RVTEVfUEFSTV9ERVNDKHNtaV9wb3J0LCAiT3ZlcnJpZGUgdGhlIEJJT1MtZ2l2ZW4gSVNUIHBvcnQgd2l0aCB0aGlzIHZhbHVlICIKKwkJIi0tIEludGVsJ3MgZGVmYXVsdCBzZXR0aW5nIGlzIDB4YjIiKTsKK01PRFVMRV9QQVJNX0RFU0Moc21pX2NtZCwgIk92ZXJyaWRlIHRoZSBCSU9TLWdpdmVuIElTVCBjb21tYW5kIHdpdGggdGhpcyB2YWx1ZSAiCisJCSItLSBJbnRlbCdzIGRlZmF1bHQgc2V0dGluZyBpcyAweDgyIik7CitNT0RVTEVfUEFSTV9ERVNDKHNtaV9zaWcsICJTZXQgdG8gMSB0byBmYWtlIHRoZSBJU1Qgc2lnbmF0dXJlIHdoZW4gdXNpbmcgdGhlICIKKwkJIlNNSSBpbnRlcmZhY2UuIik7CiAKLU1PRFVMRV9BVVRIT1IgKCJIaXJvc2hpIE1pdXJhIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04gKCJTcGVlZHN0ZXAgZHJpdmVyIGZvciBJU1QgYXBwbGV0IFNNSSBpbnRlcmZhY2UuIik7Ci1NT0RVTEVfTElDRU5TRSAoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSGlyb3NoaSBNaXVyYSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVlZHN0ZXAgZHJpdmVyIGZvciBJU1QgYXBwbGV0IFNNSSBpbnRlcmZhY2UuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIG1vZHVsZV9pbml0KHNwZWVkc3RlcF9pbml0KTsKIG1vZHVsZV9leGl0KHNwZWVkc3RlcF9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90c2MuYyBiL2FyY2gveDg2L2tlcm5lbC90c2MuYwppbmRleCBkNWNlYmI1Li5iOGU3YWFmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RzYy5jCkBAIC01NDMsOCArNTQzLDYgQEAKIAlyZXR1cm4gdHNjX3BpdF9taW47CiB9CiAKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0vKiBPbmx5IGNhbGxlZCBmcm9tIHRoZSBQb3dlcm5vdyBLNyBjcHUgZnJlcSBkcml2ZXIgKi8KIGludCByZWNhbGlicmF0ZV9jcHVfa2h6KHZvaWQpCiB7CiAjaWZuZGVmIENPTkZJR19TTVAKQEAgLTU2Niw3ICs1NjQsNiBAQAogCiBFWFBPUlRfU1lNQk9MKHJlY2FsaWJyYXRlX2NwdV9raHopOwogCi0jZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwogCiAvKiBBY2NlbGVyYXRvcnMgZm9yIHNjaGVkX2Nsb2NrKCkKICAqIGNvbnZlcnQgZnJvbSBjeWNsZXMoNjRiaXRzKSA9PiBuYW5vc2Vjb25kcyAoNjRiaXRzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggZDZkYWYzYy4uZDI3MGU4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC0xMDQsNyArMTA0LDggQEAKIAogCiAvKiBpbnRlcm5hbCBwcm90b3R5cGVzICovCi1zdGF0aWMgaW50IF9fY3B1ZnJlcV9nb3Zlcm5vcihzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgdW5zaWduZWQgaW50IGV2ZW50KTsKK3N0YXRpYyBpbnQgX19jcHVmcmVxX2dvdmVybm9yKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQl1bnNpZ25lZCBpbnQgZXZlbnQpOwogc3RhdGljIHVuc2lnbmVkIGludCBfX2NwdWZyZXFfZ2V0KHVuc2lnbmVkIGludCBjcHUpOwogc3RhdGljIHZvaWQgaGFuZGxlX3VwZGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCkBAIC0xMjgsNyArMTI5LDcgQEAKIHB1cmVfaW5pdGNhbGwoaW5pdF9jcHVmcmVxX3RyYW5zaXRpb25fbm90aWZpZXJfbGlzdCk7CiAKIHN0YXRpYyBMSVNUX0hFQUQoY3B1ZnJlcV9nb3Zlcm5vcl9saXN0KTsKLXN0YXRpYyBERUZJTkVfTVVURVggKGNwdWZyZXFfZ292ZXJub3JfbXV0ZXgpOworc3RhdGljIERFRklORV9NVVRFWChjcHVmcmVxX2dvdmVybm9yX211dGV4KTsKIAogc3RydWN0IGNwdWZyZXFfcG9saWN5ICpjcHVmcmVxX2NwdV9nZXQodW5zaWduZWQgaW50IGNwdSkKIHsKQEAgLTM3MSw3ICszNzIsNyBAQAogCXN0cnVjdCBjcHVmcmVxX2dvdmVybm9yICp0OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmY3B1ZnJlcV9nb3Zlcm5vcl9saXN0LCBnb3Zlcm5vcl9saXN0KQotCQlpZiAoIXN0cm5pY21wKHN0cl9nb3Zlcm5vcix0LT5uYW1lLENQVUZSRVFfTkFNRV9MRU4pKQorCQlpZiAoIXN0cm5pY21wKHN0cl9nb3Zlcm5vciwgdC0+bmFtZSwgQ1BVRlJFUV9OQU1FX0xFTikpCiAJCQlyZXR1cm4gdDsKIAogCXJldHVybiBOVUxMOwpAQCAtNDI5LDE1ICs0MzAsMTEgQEAKIAogCQltdXRleF91bmxvY2soJmNwdWZyZXFfZ292ZXJub3JfbXV0ZXgpOwogCX0KLSAgb3V0Ogorb3V0OgogCXJldHVybiBlcnI7CiB9CiAKIAotLyogZHJpdmVycy9iYXNlL2NwdS5jICovCi1leHRlcm4gc3RydWN0IHN5c2Rldl9jbGFzcyBjcHVfc3lzZGV2X2NsYXNzOwotCi0KIC8qKgogICogY3B1ZnJlcV9wZXJfY3B1X2F0dHJfcmVhZCgpIC8gc2hvd18jI2ZpbGVfbmFtZSgpIC0KICAqIHByaW50IG91dCBjcHVmcmVxIGluZm9ybWF0aW9uCkBAIC00NTAsMTEgKzQ0NywxMiBAQAogc3RhdGljIHNzaXplX3Qgc2hvd18jI2ZpbGVfbmFtZQkJCQlcCiAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikJCVwKIHsJCQkJCQkJXAotCXJldHVybiBzcHJpbnRmIChidWYsICIldVxuIiwgcG9saWN5LT5vYmplY3QpOwlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHBvbGljeS0+b2JqZWN0KTsJXAogfQogCiBzaG93X29uZShjcHVpbmZvX21pbl9mcmVxLCBjcHVpbmZvLm1pbl9mcmVxKTsKIHNob3dfb25lKGNwdWluZm9fbWF4X2ZyZXEsIGNwdWluZm8ubWF4X2ZyZXEpOworc2hvd19vbmUoY3B1aW5mb190cmFuc2l0aW9uX2xhdGVuY3ksIGNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5KTsKIHNob3dfb25lKHNjYWxpbmdfbWluX2ZyZXEsIG1pbik7CiBzaG93X29uZShzY2FsaW5nX21heF9mcmVxLCBtYXgpOwogc2hvd19vbmUoc2NhbGluZ19jdXJfZnJlcSwgY3VyKTsKQEAgLTQ3Niw3ICs0NzQsNyBAQAogCWlmIChyZXQpCQkJCQkJCVwKIAkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAogCQkJCQkJCQkJXAotCXJldCA9IHNzY2FuZiAoYnVmLCAiJXUiLCAmbmV3X3BvbGljeS5vYmplY3QpOwkJCVwKKwlyZXQgPSBzc2NhbmYoYnVmLCAiJXUiLCAmbmV3X3BvbGljeS5vYmplY3QpOwkJCVwKIAlpZiAocmV0ICE9IDEpCQkJCQkJCVwKIAkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAogCQkJCQkJCQkJXApAQCAtNDg2LDggKzQ4NCw4IEBACiAJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwkJCQkJXAogfQogCi1zdG9yZV9vbmUoc2NhbGluZ19taW5fZnJlcSxtaW4pOwotc3RvcmVfb25lKHNjYWxpbmdfbWF4X2ZyZXEsbWF4KTsKK3N0b3JlX29uZShzY2FsaW5nX21pbl9mcmVxLCBtaW4pOworc3RvcmVfb25lKHNjYWxpbmdfbWF4X2ZyZXEsIG1heCk7CiAKIC8qKgogICogc2hvd19jcHVpbmZvX2N1cl9mcmVxIC0gY3VycmVudCBDUFUgZnJlcXVlbmN5IGFzIGRldGVjdGVkIGJ5IGhhcmR3YXJlCkBAIC01MDcsMTIgKzUwNSwxMyBAQAogICovCiBzdGF0aWMgc3NpemVfdCBzaG93X3NjYWxpbmdfZ292ZXJub3Ioc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKIHsKLQlpZihwb2xpY3ktPnBvbGljeSA9PSBDUFVGUkVRX1BPTElDWV9QT1dFUlNBVkUpCisJaWYgKHBvbGljeS0+cG9saWN5ID09IENQVUZSRVFfUE9MSUNZX1BPV0VSU0FWRSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAicG93ZXJzYXZlXG4iKTsKIAllbHNlIGlmIChwb2xpY3ktPnBvbGljeSA9PSBDUFVGUkVRX1BPTElDWV9QRVJGT1JNQU5DRSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAicGVyZm9ybWFuY2VcbiIpOwogCWVsc2UgaWYgKHBvbGljeS0+Z292ZXJub3IpCi0JCXJldHVybiBzY25wcmludGYoYnVmLCBDUFVGUkVRX05BTUVfTEVOLCAiJXNcbiIsIHBvbGljeS0+Z292ZXJub3ItPm5hbWUpOworCQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgQ1BVRlJFUV9OQU1FX0xFTiwgIiVzXG4iLAorCQkJCXBvbGljeS0+Z292ZXJub3ItPm5hbWUpOwogCXJldHVybiAtRUlOVkFMOwogfQogCkBAIC01MzEsNyArNTMwLDcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gc3NjYW5mIChidWYsICIlMTVzIiwgc3RyX2dvdmVybm9yKTsKKwlyZXQgPSBzc2NhbmYoYnVmLCAiJTE1cyIsIHN0cl9nb3Zlcm5vcik7CiAJaWYgKHJldCAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNTc1LDcgKzU3NCw4IEBACiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmY3B1ZnJlcV9nb3Zlcm5vcl9saXN0LCBnb3Zlcm5vcl9saXN0KSB7Ci0JCWlmIChpID49IChzc2l6ZV90KSAoKFBBR0VfU0laRSAvIHNpemVvZihjaGFyKSkgLSAoQ1BVRlJFUV9OQU1FX0xFTiArIDIpKSkKKwkJaWYgKGkgPj0gKHNzaXplX3QpICgoUEFHRV9TSVpFIC8gc2l6ZW9mKGNoYXIpKQorCQkgICAgLSAoQ1BVRlJFUV9OQU1FX0xFTiArIDIpKSkKIAkJCWdvdG8gb3V0OwogCQlpICs9IHNjbnByaW50ZigmYnVmW2ldLCBDUFVGUkVRX05BTUVfTEVOLCAiJXMgIiwgdC0+bmFtZSk7CiAJfQpAQCAtNTk0LDcgKzU5NCw3IEBACiAJCQlpICs9IHNjbnByaW50ZigmYnVmW2ldLCAoUEFHRV9TSVpFIC0gaSAtIDIpLCAiICIpOwogCQlpICs9IHNjbnByaW50ZigmYnVmW2ldLCAoUEFHRV9TSVpFIC0gaSAtIDIpLCAiJXUiLCBjcHUpOwogCQlpZiAoaSA+PSAoUEFHRV9TSVpFIC0gNSkpCi0JCSAgICBicmVhazsKKwkJCWJyZWFrOwogCX0KIAlpICs9IHNwcmludGYoJmJ1ZltpXSwgIlxuIik7CiAJcmV0dXJuIGk7CkBAIC02NjAsNiArNjYwLDcgQEAKIGRlZmluZV9vbmVfcm8wNDAwKGNwdWluZm9fY3VyX2ZyZXEpOwogZGVmaW5lX29uZV9ybyhjcHVpbmZvX21pbl9mcmVxKTsKIGRlZmluZV9vbmVfcm8oY3B1aW5mb19tYXhfZnJlcSk7CitkZWZpbmVfb25lX3JvKGNwdWluZm9fdHJhbnNpdGlvbl9sYXRlbmN5KTsKIGRlZmluZV9vbmVfcm8oc2NhbGluZ19hdmFpbGFibGVfZ292ZXJub3JzKTsKIGRlZmluZV9vbmVfcm8oc2NhbGluZ19kcml2ZXIpOwogZGVmaW5lX29uZV9ybyhzY2FsaW5nX2N1cl9mcmVxKTsKQEAgLTY3Myw2ICs2NzQsNyBAQAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRlZmF1bHRfYXR0cnNbXSA9IHsKIAkmY3B1aW5mb19taW5fZnJlcS5hdHRyLAogCSZjcHVpbmZvX21heF9mcmVxLmF0dHIsCisJJmNwdWluZm9fdHJhbnNpdGlvbl9sYXRlbmN5LmF0dHIsCiAJJnNjYWxpbmdfbWluX2ZyZXEuYXR0ciwKIAkmc2NhbGluZ19tYXhfZnJlcS5hdHRyLAogCSZhZmZlY3RlZF9jcHVzLmF0dHIsCkBAIC02ODQsMTAgKzY4NiwxMCBAQAogCU5VTEwKIH07CiAKLSNkZWZpbmUgdG9fcG9saWN5KGspIGNvbnRhaW5lcl9vZihrLHN0cnVjdCBjcHVmcmVxX3BvbGljeSxrb2JqKQotI2RlZmluZSB0b19hdHRyKGEpIGNvbnRhaW5lcl9vZihhLHN0cnVjdCBmcmVxX2F0dHIsYXR0cikKKyNkZWZpbmUgdG9fcG9saWN5KGspIGNvbnRhaW5lcl9vZihrLCBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3ksIGtvYmopCisjZGVmaW5lIHRvX2F0dHIoYSkgY29udGFpbmVyX29mKGEsIHN0cnVjdCBmcmVxX2F0dHIsIGF0dHIpCiAKLXN0YXRpYyBzc2l6ZV90IHNob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIgLGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9IHRvX3BvbGljeShrb2JqKTsKIAlzdHJ1Y3QgZnJlcV9hdHRyICpmYXR0ciA9IHRvX2F0dHIoYXR0cik7CkBAIC04NTMsMTAgKzg1NSwxMCBAQAogCQlpZiAoY3B1ID09IGopCiAJCQljb250aW51ZTsKIAotCQkvKiBjaGVjayBmb3IgZXhpc3RpbmcgYWZmZWN0ZWQgQ1BVcy4gIFRoZXkgbWF5IG5vdCBiZSBhd2FyZQotCQkgKiBvZiBpdCBkdWUgdG8gQ1BVIEhvdHBsdWcuCisJCS8qIENoZWNrIGZvciBleGlzdGluZyBhZmZlY3RlZCBDUFVzLgorCQkgKiBUaGV5IG1heSBub3QgYmUgYXdhcmUgb2YgaXQgZHVlIHRvIENQVSBIb3RwbHVnLgogCQkgKi8KLQkJbWFuYWdlZF9wb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQoaik7CQkvLyBGSVhNRTogV2hlcmUgaXMgdGhpcyByZWxlYXNlZD8gIFdoYXQgYWJvdXQgZXJyb3IgcGF0aHM/CisJCW1hbmFnZWRfcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0KGopOwkJLyogRklYTUU6IFdoZXJlIGlzIHRoaXMgcmVsZWFzZWQ/ICBXaGF0IGFib3V0IGVycm9yIHBhdGhzPyAqLwogCQlpZiAodW5saWtlbHkobWFuYWdlZF9wb2xpY3kpKSB7CiAKIAkJCS8qIFNldCBwcm9wZXIgcG9saWN5X2NwdSAqLwpAQCAtMTEyNyw4ICsxMTI5LDggQEAKICAqCUBvbGRfZnJlcTogQ1BVIGZyZXF1ZW5jeSB0aGUga2VybmVsIHRoaW5rcyB0aGUgQ1BVIHJ1bnMgYXQKICAqCUBuZXdfZnJlcTogQ1BVIGZyZXF1ZW5jeSB0aGUgQ1BVIGFjdHVhbGx5IHJ1bnMgYXQKICAqCi0gKglXZSBhZGp1c3QgdG8gY3VycmVudCBmcmVxdWVuY3kgZmlyc3QsIGFuZCBuZWVkIHRvIGNsZWFuIHVwIGxhdGVyLiBTbyBlaXRoZXIgY2FsbAotICoJdG8gY3B1ZnJlcV91cGRhdGVfcG9saWN5KCkgb3Igc2NoZWR1bGUgaGFuZGxlX3VwZGF0ZSgpKS4KKyAqCVdlIGFkanVzdCB0byBjdXJyZW50IGZyZXF1ZW5jeSBmaXJzdCwgYW5kIG5lZWQgdG8gY2xlYW4gdXAgbGF0ZXIuCisgKglTbyBlaXRoZXIgY2FsbCB0byBjcHVmcmVxX3VwZGF0ZV9wb2xpY3koKSBvciBzY2hlZHVsZSBoYW5kbGVfdXBkYXRlKCkpLgogICovCiBzdGF0aWMgdm9pZCBjcHVmcmVxX291dF9vZl9zeW5jKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCBvbGRfZnJlcSwKIAkJCQl1bnNpZ25lZCBpbnQgbmV3X2ZyZXEpCkBAIC0xNjEwLDcgKzE2MTIsOCBAQAogCiAvKioKICAqIGNwdWZyZXFfZ2V0X3BvbGljeSAtIGdldCB0aGUgY3VycmVudCBjcHVmcmVxX3BvbGljeQotICogQHBvbGljeTogc3RydWN0IGNwdWZyZXFfcG9saWN5IGludG8gd2hpY2ggdGhlIGN1cnJlbnQgY3B1ZnJlcV9wb2xpY3kgaXMgd3JpdHRlbgorICogQHBvbGljeTogc3RydWN0IGNwdWZyZXFfcG9saWN5IGludG8gd2hpY2ggdGhlIGN1cnJlbnQgY3B1ZnJlcV9wb2xpY3kKKyAqCWlzIHdyaXR0ZW4KICAqCiAgKiBSZWFkcyB0aGUgY3VycmVudCBjcHVmcmVxIHBvbGljeS4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYwppbmRleCAwMzIwOTYyLi4yZWNkOTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYwpAQCAtNCw3ICs0LDcgQEAKICAqICBDb3B5cmlnaHQgKEMpICAyMDAxIFJ1c3NlbGwgS2luZwogICogICAgICAgICAgICAoQykgIDIwMDMgVmVua2F0ZXNoIFBhbGxpcGFkaSA8dmVua2F0ZXNoLnBhbGxpcGFkaUBpbnRlbC5jb20+LgogICogICAgICAgICAgICAgICAgICAgICAgSnVuIE5ha2FqaW1hIDxqdW4ubmFrYWppbWFAaW50ZWwuY29tPgotICogICAgICAgICAgICAoQykgIDIwMDQgQWxleGFuZGVyIENsb3V0ZXIgPGFsZXgta2VybmVsQGRpZ3Jpei5vcmcudWs+CisgKiAgICAgICAgICAgIChDKSAgMjAwOSBBbGV4YW5kZXIgQ2xvdXRlciA8YWxleEBkaWdyaXoub3JnLnVrPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMTMsMjIgKzEzLDE3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgva21vZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKIC8qCiAgKiBkYnMgaXMgdXNlZCBpbiB0aGlzIGZpbGUgYXMgYSBzaG9ydGZvcm0gZm9yIGRlbWFuZGJhc2VkIHN3aXRjaGluZwogICogSXQgaGVscHMgdG8ga2VlcCB2YXJpYWJsZSBuYW1lcyBzbWFsbGVyLCBzaW1wbGVyCkBAIC00MywxOSArMzgsMzEgQEAKICAqIGxhdGVuY3kgb2YgdGhlIHByb2Nlc3Nvci4gVGhlIGdvdmVybm9yIHdpbGwgd29yayBvbiBhbnkgcHJvY2Vzc29yIHdpdGgKICAqIHRyYW5zaXRpb24gbGF0ZW5jeSA8PSAxMG1TLCB1c2luZyBhcHByb3ByaWF0ZSBzYW1wbGluZwogICogcmF0ZS4KLSAqIEZvciBDUFVzIHdpdGggdHJhbnNpdGlvbiBsYXRlbmN5ID4gMTBtUyAobW9zdGx5IGRyaXZlcnMKLSAqIHdpdGggQ1BVRlJFUV9FVEVSTkFMKSwgdGhpcyBnb3Zlcm5vciB3aWxsIG5vdCB3b3JrLgorICogRm9yIENQVXMgd2l0aCB0cmFuc2l0aW9uIGxhdGVuY3kgPiAxMG1TIChtb3N0bHkgZHJpdmVycyB3aXRoIENQVUZSRVFfRVRFUk5BTCkKKyAqIHRoaXMgZ292ZXJub3Igd2lsbCBub3Qgd29yay4KICAqIEFsbCB0aW1lcyBoZXJlIGFyZSBpbiB1Uy4KICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBkZWZfc2FtcGxpbmdfcmF0ZTsKICNkZWZpbmUgTUlOX1NBTVBMSU5HX1JBVEVfUkFUSU8JCQkoMikKIC8qIGZvciBjb3JyZWN0IHN0YXRpc3RpY3MsIHdlIG5lZWQgYXQgbGVhc3QgMTAgdGlja3MgYmV0d2VlbiBlYWNoIG1lYXN1cmUgKi8KLSNkZWZpbmUgTUlOX1NUQVRfU0FNUExJTkdfUkFURQkJCVwKKyNkZWZpbmUgTUlOX1NUQVRfU0FNUExJTkdfUkFURSAJCQlcCiAJCQkoTUlOX1NBTVBMSU5HX1JBVEVfUkFUSU8gKiBqaWZmaWVzX3RvX3VzZWNzKDEwKSkKICNkZWZpbmUgTUlOX1NBTVBMSU5HX1JBVEUJCQlcCiAJCQkoZGVmX3NhbXBsaW5nX3JhdGUgLyBNSU5fU0FNUExJTkdfUkFURV9SQVRJTykKKy8qIEFib3ZlIE1JTl9TQU1QTElOR19SQVRFIHdpbGwgdmFuaXNoIHdpdGggaXRzIHN5c2ZzIGZpbGUgc29vbgorICogRGVmaW5lIHRoZSBtaW5pbWFsIHNldHRhYmxlIHNhbXBsaW5nIHJhdGUgdG8gdGhlIGdyZWF0ZXIgb2Y6CisgKiAgIC0gIkhXIHRyYW5zaXRpb24gbGF0ZW5jeSIgKiAxMDAgKHNhbWUgYXMgZGVmYXVsdCBzYW1wbGluZyAvIDEwKQorICogICAtIE1JTl9TVEFUX1NBTVBMSU5HX1JBVEUKKyAqIFRvIGF2b2lkIHRoYXQgdXNlcnNwYWNlIHNob290cyBpdHNlbGYuCisqLworc3RhdGljIHVuc2lnbmVkIGludCBtaW5pbXVtX3NhbXBsaW5nX3JhdGUodm9pZCkKK3sKKwlyZXR1cm4gbWF4KGRlZl9zYW1wbGluZ19yYXRlIC8gMTAsIE1JTl9TVEFUX1NBTVBMSU5HX1JBVEUpOworfQorCisvKiBUaGlzIHdpbGwgYWxzbyB2YW5pc2ggc29vbiB3aXRoIHJlbW92aW5nIHNhbXBsaW5nX3JhdGVfbWF4ICovCiAjZGVmaW5lIE1BWF9TQU1QTElOR19SQVRFCQkJKDUwMCAqIGRlZl9zYW1wbGluZ19yYXRlKQotI2RlZmluZSBERUZfU0FNUExJTkdfUkFURV9MQVRFTkNZX01VTFRJUExJRVIJKDEwMDApCisjZGVmaW5lIExBVEVOQ1lfTVVMVElQTElFUgkJCSgxMDAwKQogI2RlZmluZSBERUZfU0FNUExJTkdfRE9XTl9GQUNUT1IJCSgxKQogI2RlZmluZSBNQVhfU0FNUExJTkdfRE9XTl9GQUNUT1IJCSgxMCkKICNkZWZpbmUgVFJBTlNJVElPTl9MQVRFTkNZX0xJTUlUCQkoMTAgKiAxMDAwICogMTAwMCkKQEAgLTYzLDEyICs3MCwxNSBAQAogc3RhdGljIHZvaWQgZG9fZGJzX3RpbWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIHN0cnVjdCBjcHVfZGJzX2luZm9fcyB7CisJY3B1dGltZTY0X3QgcHJldl9jcHVfaWRsZTsKKwljcHV0aW1lNjRfdCBwcmV2X2NwdV93YWxsOworCWNwdXRpbWU2NF90IHByZXZfY3B1X25pY2U7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpjdXJfcG9saWN5OwotCXVuc2lnbmVkIGludCBwcmV2X2NwdV9pZGxlX3VwOwotCXVuc2lnbmVkIGludCBwcmV2X2NwdV9pZGxlX2Rvd247Ci0JdW5zaWduZWQgaW50IGVuYWJsZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CiAJdW5zaWduZWQgaW50IGRvd25fc2tpcDsKIAl1bnNpZ25lZCBpbnQgcmVxdWVzdGVkX2ZyZXE7CisJaW50IGNwdTsKKwl1bnNpZ25lZCBpbnQgZW5hYmxlOjE7CiB9Owogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfZGJzX2luZm9fcywgY3B1X2Ric19pbmZvKTsKIApAQCAtODIsMTkgKzkyLDE4IEBACiAgKiBjcHVfaG90cGx1ZyBsb2NrIHNob3VsZCBiZSB0YWtlbiBiZWZvcmUgdGhhdC4gTm90ZSB0aGF0IGNwdV9ob3RwbHVnIGxvY2sKICAqIGlzIHJlY3Vyc2l2ZSBmb3IgdGhlIHNhbWUgcHJvY2Vzcy4gLVZlbmtpCiAgKi8KLXN0YXRpYyBERUZJTkVfTVVURVggKGRic19tdXRleCk7Ci1zdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksoZGJzX3dvcmssIGRvX2Ric190aW1lcik7CitzdGF0aWMgREVGSU5FX01VVEVYKGRic19tdXRleCk7CiAKLXN0cnVjdCBkYnNfdHVuZXJzIHsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqa2NvbnNlcnZhdGl2ZV93cTsKKworc3RhdGljIHN0cnVjdCBkYnNfdHVuZXJzIHsKIAl1bnNpZ25lZCBpbnQgc2FtcGxpbmdfcmF0ZTsKIAl1bnNpZ25lZCBpbnQgc2FtcGxpbmdfZG93bl9mYWN0b3I7CiAJdW5zaWduZWQgaW50IHVwX3RocmVzaG9sZDsKIAl1bnNpZ25lZCBpbnQgZG93bl90aHJlc2hvbGQ7CiAJdW5zaWduZWQgaW50IGlnbm9yZV9uaWNlOwogCXVuc2lnbmVkIGludCBmcmVxX3N0ZXA7Ci19OwotCi1zdGF0aWMgc3RydWN0IGRic190dW5lcnMgZGJzX3R1bmVyc19pbnMgPSB7Cit9IGRic190dW5lcnNfaW5zID0gewogCS51cF90aHJlc2hvbGQgPSBERUZfRlJFUVVFTkNZX1VQX1RIUkVTSE9MRCwKIAkuZG93bl90aHJlc2hvbGQgPSBERUZfRlJFUVVFTkNZX0RPV05fVEhSRVNIT0xELAogCS5zYW1wbGluZ19kb3duX2ZhY3RvciA9IERFRl9TQU1QTElOR19ET1dOX0ZBQ1RPUiwKQEAgLTEwMiwxOCArMTExLDM3IEBACiAJLmZyZXFfc3RlcCA9IDUsCiB9OwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfY3B1X2lkbGVfdGltZSh1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIGlubGluZSBjcHV0aW1lNjRfdCBnZXRfY3B1X2lkbGVfdGltZV9qaWZmeSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkJCWNwdXRpbWU2NF90ICp3YWxsKQogewotCXVuc2lnbmVkIGludCBhZGRfbmljZSA9IDAsIHJldDsKKwljcHV0aW1lNjRfdCBpZGxlX3RpbWU7CisJY3B1dGltZTY0X3QgY3VyX3dhbGxfdGltZTsKKwljcHV0aW1lNjRfdCBidXN5X3RpbWU7CiAKLQlpZiAoZGJzX3R1bmVyc19pbnMuaWdub3JlX25pY2UpCi0JCWFkZF9uaWNlID0ga3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5uaWNlOworCWN1cl93YWxsX3RpbWUgPSBqaWZmaWVzNjRfdG9fY3B1dGltZTY0KGdldF9qaWZmaWVzXzY0KCkpOworCWJ1c3lfdGltZSA9IGNwdXRpbWU2NF9hZGQoa3N0YXRfY3B1KGNwdSkuY3B1c3RhdC51c2VyLAorCQkJa3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5zeXN0ZW0pOwogCi0JcmV0ID0ga3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5pZGxlICsKLQkJa3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5pb3dhaXQgKwotCQlhZGRfbmljZTsKKwlidXN5X3RpbWUgPSBjcHV0aW1lNjRfYWRkKGJ1c3lfdGltZSwga3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5pcnEpOworCWJ1c3lfdGltZSA9IGNwdXRpbWU2NF9hZGQoYnVzeV90aW1lLCBrc3RhdF9jcHUoY3B1KS5jcHVzdGF0LnNvZnRpcnEpOworCWJ1c3lfdGltZSA9IGNwdXRpbWU2NF9hZGQoYnVzeV90aW1lLCBrc3RhdF9jcHUoY3B1KS5jcHVzdGF0LnN0ZWFsKTsKKwlidXN5X3RpbWUgPSBjcHV0aW1lNjRfYWRkKGJ1c3lfdGltZSwga3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5uaWNlKTsKIAotCXJldHVybiByZXQ7CisJaWRsZV90aW1lID0gY3B1dGltZTY0X3N1YihjdXJfd2FsbF90aW1lLCBidXN5X3RpbWUpOworCWlmICh3YWxsKQorCQkqd2FsbCA9IGN1cl93YWxsX3RpbWU7CisKKwlyZXR1cm4gaWRsZV90aW1lOworfQorCitzdGF0aWMgaW5saW5lIGNwdXRpbWU2NF90IGdldF9jcHVfaWRsZV90aW1lKHVuc2lnbmVkIGludCBjcHUsIGNwdXRpbWU2NF90ICp3YWxsKQoreworCXU2NCBpZGxlX3RpbWUgPSBnZXRfY3B1X2lkbGVfdGltZV91cyhjcHUsIHdhbGwpOworCisJaWYgKGlkbGVfdGltZSA9PSAtMVVMTCkKKwkJcmV0dXJuIGdldF9jcHVfaWRsZV90aW1lX2ppZmZ5KGNwdSwgd2FsbCk7CisKKwlyZXR1cm4gaWRsZV90aW1lOwogfQogCiAvKiBrZWVwIHRyYWNrIG9mIGZyZXF1ZW5jeSB0cmFuc2l0aW9ucyAqLwpAQCAtMTI1LDEwICsxNTMsMjEgQEAKIAlzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgKnRoaXNfZGJzX2luZm8gPSAmcGVyX2NwdShjcHVfZGJzX2luZm8sCiAJCQkJCQkJZnJlcS0+Y3B1KTsKIAorCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5OworCiAJaWYgKCF0aGlzX2Ric19pbmZvLT5lbmFibGUpCiAJCXJldHVybiAwOwogCi0JdGhpc19kYnNfaW5mby0+cmVxdWVzdGVkX2ZyZXEgPSBmcmVxLT5uZXc7CisJcG9saWN5ID0gdGhpc19kYnNfaW5mby0+Y3VyX3BvbGljeTsKKworCS8qCisJICogd2Ugb25seSBjYXJlIGlmIG91ciBpbnRlcm5hbGx5IHRyYWNrZWQgZnJlcSBtb3ZlcyBvdXRzaWRlCisJICogdGhlICd2YWxpZCcgcmFuZ2VzIG9mIGZyZXFlbmN5IGF2YWlsYWJsZSB0byB1cyBvdGhlcndpc2UKKwkgKiB3ZSBkbyBub3QgY2hhbmdlIGl0CisJKi8KKwlpZiAodGhpc19kYnNfaW5mby0+cmVxdWVzdGVkX2ZyZXEgPiBwb2xpY3ktPm1heAorCQkJfHwgdGhpc19kYnNfaW5mby0+cmVxdWVzdGVkX2ZyZXEgPCBwb2xpY3ktPm1pbikKKwkJdGhpc19kYnNfaW5mby0+cmVxdWVzdGVkX2ZyZXEgPSBmcmVxLT5uZXc7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0MCwxNiArMTc5LDMxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogc3lzZnMgaW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzc2l6ZV90IHNob3dfc2FtcGxpbmdfcmF0ZV9tYXgoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZiAoYnVmLCAiJXVcbiIsIE1BWF9TQU1QTElOR19SQVRFKTsKKwlzdGF0aWMgaW50IHByaW50X29uY2U7CisKKwlpZiAoIXByaW50X29uY2UpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVRlJFUTogY29uc2VydmF0aXZlIHNhbXBsaW5nX3JhdGVfbWF4ICIKKwkJICAgICAgICJzeXNmcyBmaWxlIGlzIGRlcHJlY2F0ZWQgLSB1c2VkIGJ5OiAlc1xuIiwKKwkJICAgICAgIGN1cnJlbnQtPmNvbW0pOworCQlwcmludF9vbmNlID0gMTsKKwl9CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIE1BWF9TQU1QTElOR19SQVRFKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2hvd19zYW1wbGluZ19yYXRlX21pbihzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmIChidWYsICIldVxuIiwgTUlOX1NBTVBMSU5HX1JBVEUpOworCXN0YXRpYyBpbnQgcHJpbnRfb25jZTsKKworCWlmICghcHJpbnRfb25jZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJDUFVGUkVROiBjb25zZXJ2YXRpdmUgc2FtcGxpbmdfcmF0ZV9tYXggIgorCQkgICAgICAgInN5c2ZzIGZpbGUgaXMgZGVwcmVjYXRlZCAtIHVzZWQgYnk6ICVzXG4iLCBjdXJyZW50LT5jb21tKTsKKwkJcHJpbnRfb25jZSA9IDE7CisJfQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBNSU5fU0FNUExJTkdfUkFURSk7CiB9CiAKLSNkZWZpbmUgZGVmaW5lX29uZV9ybyhfbmFtZSkJCQkJXAotc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgX25hbWUgPQkJCQlcCisjZGVmaW5lIGRlZmluZV9vbmVfcm8oX25hbWUpCQlcCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciBfbmFtZSA9CQlcCiBfX0FUVFIoX25hbWUsIDA0NDQsIHNob3dfIyNfbmFtZSwgTlVMTCkKIAogZGVmaW5lX29uZV9ybyhzYW1wbGluZ19yYXRlX21heCk7CkBAIC0xNzQsNyArMjI4LDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgaW5wdXQ7CiAJaW50IHJldDsKLQlyZXQgPSBzc2NhbmYgKGJ1ZiwgIiV1IiwgJmlucHV0KTsKKwlyZXQgPSBzc2NhbmYoYnVmLCAiJXUiLCAmaW5wdXQpOworCiAJaWYgKHJldCAhPSAxIHx8IGlucHV0ID4gTUFYX1NBTVBMSU5HX0RPV05fRkFDVE9SIHx8IGlucHV0IDwgMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE5MCwxNSArMjQ1LDEzIEBACiB7CiAJdW5zaWduZWQgaW50IGlucHV0OwogCWludCByZXQ7Ci0JcmV0ID0gc3NjYW5mIChidWYsICIldSIsICZpbnB1dCk7CisJcmV0ID0gc3NjYW5mKGJ1ZiwgIiV1IiwgJmlucHV0KTsKKworCWlmIChyZXQgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZkYnNfbXV0ZXgpOwotCWlmIChyZXQgIT0gMSB8fCBpbnB1dCA+IE1BWF9TQU1QTElOR19SQVRFIHx8IGlucHV0IDwgTUlOX1NBTVBMSU5HX1JBVEUpIHsKLQkJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkYnNfdHVuZXJzX2lucy5zYW1wbGluZ19yYXRlID0gaW5wdXQ7CisJZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSA9IG1heChpbnB1dCwgbWluaW11bV9zYW1wbGluZ19yYXRlKCkpOwogCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKIAogCXJldHVybiBjb3VudDsKQEAgLTIwOSwxMCArMjYyLDExIEBACiB7CiAJdW5zaWduZWQgaW50IGlucHV0OwogCWludCByZXQ7Ci0JcmV0ID0gc3NjYW5mIChidWYsICIldSIsICZpbnB1dCk7CisJcmV0ID0gc3NjYW5mKGJ1ZiwgIiV1IiwgJmlucHV0KTsKIAogCW11dGV4X2xvY2soJmRic19tdXRleCk7Ci0JaWYgKHJldCAhPSAxIHx8IGlucHV0ID4gMTAwIHx8IGlucHV0IDw9IGRic190dW5lcnNfaW5zLmRvd25fdGhyZXNob2xkKSB7CisJaWYgKHJldCAhPSAxIHx8IGlucHV0ID4gMTAwIHx8CisJCQlpbnB1dCA8PSBkYnNfdHVuZXJzX2lucy5kb3duX3RocmVzaG9sZCkgewogCQltdXRleF91bmxvY2soJmRic19tdXRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTIyOCwxMCArMjgyLDEyIEBACiB7CiAJdW5zaWduZWQgaW50IGlucHV0OwogCWludCByZXQ7Ci0JcmV0ID0gc3NjYW5mIChidWYsICIldSIsICZpbnB1dCk7CisJcmV0ID0gc3NjYW5mKGJ1ZiwgIiV1IiwgJmlucHV0KTsKIAogCW11dGV4X2xvY2soJmRic19tdXRleCk7Ci0JaWYgKHJldCAhPSAxIHx8IGlucHV0ID4gMTAwIHx8IGlucHV0ID49IGRic190dW5lcnNfaW5zLnVwX3RocmVzaG9sZCkgeworCS8qIGNhbm5vdCBiZSBsb3dlciB0aGFuIDExIG90aGVyd2lzZSBmcmVxIHdpbGwgbm90IGZhbGwgKi8KKwlpZiAocmV0ICE9IDEgfHwgaW5wdXQgPCAxMSB8fCBpbnB1dCA+IDEwMCB8fAorCQkJaW5wdXQgPj0gZGJzX3R1bmVyc19pbnMudXBfdGhyZXNob2xkKSB7CiAJCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjY0LDEyICszMjAsMTQgQEAKIAl9CiAJZGJzX3R1bmVyc19pbnMuaWdub3JlX25pY2UgPSBpbnB1dDsKIAotCS8qIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgcHJldl9jcHVfaWRsZV91cCBhbmQgcHJldl9jcHVfaWRsZV9kb3duICovCisJLyogd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBwcmV2X2NwdV9pZGxlICovCiAJZm9yX2VhY2hfb25saW5lX2NwdShqKSB7Ci0JCXN0cnVjdCBjcHVfZGJzX2luZm9fcyAqal9kYnNfaW5mbzsKLQkJal9kYnNfaW5mbyA9ICZwZXJfY3B1KGNwdV9kYnNfaW5mbywgaik7Ci0JCWpfZGJzX2luZm8tPnByZXZfY3B1X2lkbGVfdXAgPSBnZXRfY3B1X2lkbGVfdGltZShqKTsKLQkJal9kYnNfaW5mby0+cHJldl9jcHVfaWRsZV9kb3duID0gal9kYnNfaW5mby0+cHJldl9jcHVfaWRsZV91cDsKKwkJc3RydWN0IGNwdV9kYnNfaW5mb19zICpkYnNfaW5mbzsKKwkJZGJzX2luZm8gPSAmcGVyX2NwdShjcHVfZGJzX2luZm8sIGopOworCQlkYnNfaW5mby0+cHJldl9jcHVfaWRsZSA9IGdldF9jcHVfaWRsZV90aW1lKGosCisJCQkJCQkmZGJzX2luZm8tPnByZXZfY3B1X3dhbGwpOworCQlpZiAoZGJzX3R1bmVyc19pbnMuaWdub3JlX25pY2UpCisJCQlkYnNfaW5mby0+cHJldl9jcHVfbmljZSA9IGtzdGF0X2NwdShqKS5jcHVzdGF0Lm5pY2U7CiAJfQogCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKIApAQCAtMjgxLDcgKzMzOSw2IEBACiB7CiAJdW5zaWduZWQgaW50IGlucHV0OwogCWludCByZXQ7Ci0KIAlyZXQgPSBzc2NhbmYoYnVmLCAiJXUiLCAmaW5wdXQpOwogCiAJaWYgKHJldCAhPSAxKQpAQCAtMzEwLDcgKzM2Nyw3IEBACiBkZWZpbmVfb25lX3J3KGlnbm9yZV9uaWNlX2xvYWQpOwogZGVmaW5lX29uZV9ydyhmcmVxX3N0ZXApOwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGRic19hdHRyaWJ1dGVzW10gPSB7CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGJzX2F0dHJpYnV0ZXNbXSA9IHsKIAkmc2FtcGxpbmdfcmF0ZV9tYXguYXR0ciwKIAkmc2FtcGxpbmdfcmF0ZV9taW4uYXR0ciwKIAkmc2FtcGxpbmdfcmF0ZS5hdHRyLApAQCAtMzI5LDU1ICszODYsNzggQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIHN5c2ZzIGVuZCAqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIGRic19jaGVja19jcHUoaW50IGNwdSkKK3N0YXRpYyB2b2lkIGRic19jaGVja19jcHUoc3RydWN0IGNwdV9kYnNfaW5mb19zICp0aGlzX2Ric19pbmZvKQogewotCXVuc2lnbmVkIGludCBpZGxlX3RpY2tzLCB1cF9pZGxlX3RpY2tzLCBkb3duX2lkbGVfdGlja3M7Ci0JdW5zaWduZWQgaW50IHRtcF9pZGxlX3RpY2tzLCB0b3RhbF9pZGxlX3RpY2tzOworCXVuc2lnbmVkIGludCBsb2FkID0gMDsKIAl1bnNpZ25lZCBpbnQgZnJlcV90YXJnZXQ7Ci0JdW5zaWduZWQgaW50IGZyZXFfZG93bl9zYW1wbGluZ19yYXRlOwotCXN0cnVjdCBjcHVfZGJzX2luZm9fcyAqdGhpc19kYnNfaW5mbyA9ICZwZXJfY3B1KGNwdV9kYnNfaW5mbywgY3B1KTsKLQlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeTsKIAotCWlmICghdGhpc19kYnNfaW5mby0+ZW5hYmxlKQotCQlyZXR1cm47CisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3k7CisJdW5zaWduZWQgaW50IGo7CiAKIAlwb2xpY3kgPSB0aGlzX2Ric19pbmZvLT5jdXJfcG9saWN5OwogCiAJLyoKLQkgKiBUaGUgZGVmYXVsdCBzYWZlIHJhbmdlIGlzIDIwJSB0byA4MCUKLQkgKiBFdmVyeSBzYW1wbGluZ19yYXRlLCB3ZSBjaGVjawotCSAqCS0gSWYgY3VycmVudCBpZGxlIHRpbWUgaXMgbGVzcyB0aGFuIDIwJSwgdGhlbiB3ZSB0cnkgdG8KLQkgKgkgIGluY3JlYXNlIGZyZXF1ZW5jeQotCSAqIEV2ZXJ5IHNhbXBsaW5nX3JhdGUqc2FtcGxpbmdfZG93bl9mYWN0b3IsIHdlIGNoZWNrCi0JICoJLSBJZiBjdXJyZW50IGlkbGUgdGltZSBpcyBtb3JlIHRoYW4gODAlLCB0aGVuIHdlIHRyeSB0bwotCSAqCSAgZGVjcmVhc2UgZnJlcXVlbmN5CisJICogRXZlcnkgc2FtcGxpbmdfcmF0ZSwgd2UgY2hlY2ssIGlmIGN1cnJlbnQgaWRsZSB0aW1lIGlzIGxlc3MKKwkgKiB0aGFuIDIwJSAoZGVmYXVsdCksIHRoZW4gd2UgdHJ5IHRvIGluY3JlYXNlIGZyZXF1ZW5jeQorCSAqIEV2ZXJ5IHNhbXBsaW5nX3JhdGUqc2FtcGxpbmdfZG93bl9mYWN0b3IsIHdlIGNoZWNrLCBpZiBjdXJyZW50CisJICogaWRsZSB0aW1lIGlzIG1vcmUgdGhhbiA4MCUsIHRoZW4gd2UgdHJ5IHRvIGRlY3JlYXNlIGZyZXF1ZW5jeQogCSAqCiAJICogQW55IGZyZXF1ZW5jeSBpbmNyZWFzZSB0YWtlcyBpdCB0byB0aGUgbWF4aW11bSBmcmVxdWVuY3kuCiAJICogRnJlcXVlbmN5IHJlZHVjdGlvbiBoYXBwZW5zIGF0IG1pbmltdW0gc3RlcHMgb2YKLQkgKiA1JSAoZGVmYXVsdCkgb2YgbWF4X2ZyZXF1ZW5jeQorCSAqIDUlIChkZWZhdWx0KSBvZiBtYXhpbXVtIGZyZXF1ZW5jeQogCSAqLwogCi0JLyogQ2hlY2sgZm9yIGZyZXF1ZW5jeSBpbmNyZWFzZSAqLwotCWlkbGVfdGlja3MgPSBVSU5UX01BWDsKKwkvKiBHZXQgQWJzb2x1dGUgTG9hZCAqLworCWZvcl9lYWNoX2NwdShqLCBwb2xpY3ktPmNwdXMpIHsKKwkJc3RydWN0IGNwdV9kYnNfaW5mb19zICpqX2Ric19pbmZvOworCQljcHV0aW1lNjRfdCBjdXJfd2FsbF90aW1lLCBjdXJfaWRsZV90aW1lOworCQl1bnNpZ25lZCBpbnQgaWRsZV90aW1lLCB3YWxsX3RpbWU7CisKKwkJal9kYnNfaW5mbyA9ICZwZXJfY3B1KGNwdV9kYnNfaW5mbywgaik7CisKKwkJY3VyX2lkbGVfdGltZSA9IGdldF9jcHVfaWRsZV90aW1lKGosICZjdXJfd2FsbF90aW1lKTsKKworCQl3YWxsX3RpbWUgPSAodW5zaWduZWQgaW50KSBjcHV0aW1lNjRfc3ViKGN1cl93YWxsX3RpbWUsCisJCQkJal9kYnNfaW5mby0+cHJldl9jcHVfd2FsbCk7CisJCWpfZGJzX2luZm8tPnByZXZfY3B1X3dhbGwgPSBjdXJfd2FsbF90aW1lOworCisJCWlkbGVfdGltZSA9ICh1bnNpZ25lZCBpbnQpIGNwdXRpbWU2NF9zdWIoY3VyX2lkbGVfdGltZSwKKwkJCQlqX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlKTsKKwkJal9kYnNfaW5mby0+cHJldl9jcHVfaWRsZSA9IGN1cl9pZGxlX3RpbWU7CisKKwkJaWYgKGRic190dW5lcnNfaW5zLmlnbm9yZV9uaWNlKSB7CisJCQljcHV0aW1lNjRfdCBjdXJfbmljZTsKKwkJCXVuc2lnbmVkIGxvbmcgY3VyX25pY2VfamlmZmllczsKKworCQkJY3VyX25pY2UgPSBjcHV0aW1lNjRfc3ViKGtzdGF0X2NwdShqKS5jcHVzdGF0Lm5pY2UsCisJCQkJCSBqX2Ric19pbmZvLT5wcmV2X2NwdV9uaWNlKTsKKwkJCS8qCisJCQkgKiBBc3N1bXB0aW9uOiBuaWNlIHRpbWUgYmV0d2VlbiBzYW1wbGluZyBwZXJpb2RzIHdpbGwKKwkJCSAqIGJlIGxlc3MgdGhhbiAyXjMyIGppZmZpZXMgZm9yIDMyIGJpdCBzeXMKKwkJCSAqLworCQkJY3VyX25pY2VfamlmZmllcyA9ICh1bnNpZ25lZCBsb25nKQorCQkJCQljcHV0aW1lNjRfdG9famlmZmllczY0KGN1cl9uaWNlKTsKKworCQkJal9kYnNfaW5mby0+cHJldl9jcHVfbmljZSA9IGtzdGF0X2NwdShqKS5jcHVzdGF0Lm5pY2U7CisJCQlpZGxlX3RpbWUgKz0gamlmZmllc190b191c2VjcyhjdXJfbmljZV9qaWZmaWVzKTsKKwkJfQorCisJCWlmICh1bmxpa2VseSghd2FsbF90aW1lIHx8IHdhbGxfdGltZSA8IGlkbGVfdGltZSkpCisJCQljb250aW51ZTsKKworCQlsb2FkID0gMTAwICogKHdhbGxfdGltZSAtIGlkbGVfdGltZSkgLyB3YWxsX3RpbWU7CisJfQorCisJLyoKKwkgKiBicmVhayBvdXQgaWYgd2UgJ2Nhbm5vdCcgcmVkdWNlIHRoZSBzcGVlZCBhcyB0aGUgdXNlciBtaWdodAorCSAqIHdhbnQgZnJlcV9zdGVwIHRvIGJlIHplcm8KKwkgKi8KKwlpZiAoZGJzX3R1bmVyc19pbnMuZnJlcV9zdGVwID09IDApCisJCXJldHVybjsKIAogCS8qIENoZWNrIGZvciBmcmVxdWVuY3kgaW5jcmVhc2UgKi8KLQl0b3RhbF9pZGxlX3RpY2tzID0gZ2V0X2NwdV9pZGxlX3RpbWUoY3B1KTsKLQl0bXBfaWRsZV90aWNrcyA9IHRvdGFsX2lkbGVfdGlja3MgLQotCQl0aGlzX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlX3VwOwotCXRoaXNfZGJzX2luZm8tPnByZXZfY3B1X2lkbGVfdXAgPSB0b3RhbF9pZGxlX3RpY2tzOwotCi0JaWYgKHRtcF9pZGxlX3RpY2tzIDwgaWRsZV90aWNrcykKLQkJaWRsZV90aWNrcyA9IHRtcF9pZGxlX3RpY2tzOwotCi0JLyogU2NhbGUgaWRsZSB0aWNrcyBieSAxMDAgYW5kIGNvbXBhcmUgd2l0aCB1cCBhbmQgZG93biB0aWNrcyAqLwotCWlkbGVfdGlja3MgKj0gMTAwOwotCXVwX2lkbGVfdGlja3MgPSAoMTAwIC0gZGJzX3R1bmVyc19pbnMudXBfdGhyZXNob2xkKSAqCi0JCQl1c2Vjc190b19qaWZmaWVzKGRic190dW5lcnNfaW5zLnNhbXBsaW5nX3JhdGUpOwotCi0JaWYgKGlkbGVfdGlja3MgPCB1cF9pZGxlX3RpY2tzKSB7CisJaWYgKGxvYWQgPiBkYnNfdHVuZXJzX2lucy51cF90aHJlc2hvbGQpIHsKIAkJdGhpc19kYnNfaW5mby0+ZG93bl9za2lwID0gMDsKLQkJdGhpc19kYnNfaW5mby0+cHJldl9jcHVfaWRsZV9kb3duID0KLQkJCXRoaXNfZGJzX2luZm8tPnByZXZfY3B1X2lkbGVfdXA7CiAKIAkJLyogaWYgd2UgYXJlIGFscmVhZHkgYXQgZnVsbCBzcGVlZCB0aGVuIGJyZWFrIG91dCBlYXJseSAqLwogCQlpZiAodGhpc19kYnNfaW5mby0+cmVxdWVzdGVkX2ZyZXEgPT0gcG9saWN5LT5tYXgpCkBAIC0zOTgsNDkgKzQ3OCwyNCBAQAogCQlyZXR1cm47CiAJfQogCi0JLyogQ2hlY2sgZm9yIGZyZXF1ZW5jeSBkZWNyZWFzZSAqLwotCXRoaXNfZGJzX2luZm8tPmRvd25fc2tpcCsrOwotCWlmICh0aGlzX2Ric19pbmZvLT5kb3duX3NraXAgPCBkYnNfdHVuZXJzX2lucy5zYW1wbGluZ19kb3duX2ZhY3RvcikKLQkJcmV0dXJuOwotCi0JLyogQ2hlY2sgZm9yIGZyZXF1ZW5jeSBkZWNyZWFzZSAqLwotCXRvdGFsX2lkbGVfdGlja3MgPSB0aGlzX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlX3VwOwotCXRtcF9pZGxlX3RpY2tzID0gdG90YWxfaWRsZV90aWNrcyAtCi0JCXRoaXNfZGJzX2luZm8tPnByZXZfY3B1X2lkbGVfZG93bjsKLQl0aGlzX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlX2Rvd24gPSB0b3RhbF9pZGxlX3RpY2tzOwotCi0JaWYgKHRtcF9pZGxlX3RpY2tzIDwgaWRsZV90aWNrcykKLQkJaWRsZV90aWNrcyA9IHRtcF9pZGxlX3RpY2tzOwotCi0JLyogU2NhbGUgaWRsZSB0aWNrcyBieSAxMDAgYW5kIGNvbXBhcmUgd2l0aCB1cCBhbmQgZG93biB0aWNrcyAqLwotCWlkbGVfdGlja3MgKj0gMTAwOwotCXRoaXNfZGJzX2luZm8tPmRvd25fc2tpcCA9IDA7Ci0KLQlmcmVxX2Rvd25fc2FtcGxpbmdfcmF0ZSA9IGRic190dW5lcnNfaW5zLnNhbXBsaW5nX3JhdGUgKgotCQlkYnNfdHVuZXJzX2lucy5zYW1wbGluZ19kb3duX2ZhY3RvcjsKLQlkb3duX2lkbGVfdGlja3MgPSAoMTAwIC0gZGJzX3R1bmVyc19pbnMuZG93bl90aHJlc2hvbGQpICoKLQkJdXNlY3NfdG9famlmZmllcyhmcmVxX2Rvd25fc2FtcGxpbmdfcmF0ZSk7Ci0KLQlpZiAoaWRsZV90aWNrcyA+IGRvd25faWRsZV90aWNrcykgewotCQkvKgotCQkgKiBpZiB3ZSBhcmUgYWxyZWFkeSBhdCB0aGUgbG93ZXN0IHNwZWVkIHRoZW4gYnJlYWsgb3V0IGVhcmx5Ci0JCSAqIG9yIGlmIHdlICdjYW5ub3QnIHJlZHVjZSB0aGUgc3BlZWQgYXMgdGhlIHVzZXIgbWlnaHQgd2FudAotCQkgKiBmcmVxX3RhcmdldCB0byBiZSB6ZXJvCi0JCSAqLwotCQlpZiAodGhpc19kYnNfaW5mby0+cmVxdWVzdGVkX2ZyZXEgPT0gcG9saWN5LT5taW4KLQkJCQl8fCBkYnNfdHVuZXJzX2lucy5mcmVxX3N0ZXAgPT0gMCkKLQkJCXJldHVybjsKLQorCS8qCisJICogVGhlIG9wdGltYWwgZnJlcXVlbmN5IGlzIHRoZSBmcmVxdWVuY3kgdGhhdCBpcyB0aGUgbG93ZXN0IHRoYXQKKwkgKiBjYW4gc3VwcG9ydCB0aGUgY3VycmVudCBDUFUgdXNhZ2Ugd2l0aG91dCB0cmlnZ2VyaW5nIHRoZSB1cAorCSAqIHBvbGljeS4gVG8gYmUgc2FmZSwgd2UgZm9jdXMgMTAgcG9pbnRzIHVuZGVyIHRoZSB0aHJlc2hvbGQuCisJICovCisJaWYgKGxvYWQgPCAoZGJzX3R1bmVyc19pbnMuZG93bl90aHJlc2hvbGQgLSAxMCkpIHsKIAkJZnJlcV90YXJnZXQgPSAoZGJzX3R1bmVyc19pbnMuZnJlcV9zdGVwICogcG9saWN5LT5tYXgpIC8gMTAwOwogCi0JCS8qIG1heCBmcmVxIGNhbm5vdCBiZSBsZXNzIHRoYW4gMTAwLiBCdXQgd2hvIGtub3dzLi4uLiAqLwotCQlpZiAodW5saWtlbHkoZnJlcV90YXJnZXQgPT0gMCkpCi0JCQlmcmVxX3RhcmdldCA9IDU7Ci0KIAkJdGhpc19kYnNfaW5mby0+cmVxdWVzdGVkX2ZyZXEgLT0gZnJlcV90YXJnZXQ7CiAJCWlmICh0aGlzX2Ric19pbmZvLT5yZXF1ZXN0ZWRfZnJlcSA8IHBvbGljeS0+bWluKQogCQkJdGhpc19kYnNfaW5mby0+cmVxdWVzdGVkX2ZyZXEgPSBwb2xpY3ktPm1pbjsKIAorCQkvKgorCQkgKiBpZiB3ZSBjYW5ub3QgcmVkdWNlIHRoZSBmcmVxdWVuY3kgYW55bW9yZSwgYnJlYWsgb3V0IGVhcmx5CisJCSAqLworCQlpZiAocG9saWN5LT5jdXIgPT0gcG9saWN5LT5taW4pCisJCQlyZXR1cm47CisKIAkJX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocG9saWN5LCB0aGlzX2Ric19pbmZvLT5yZXF1ZXN0ZWRfZnJlcSwKIAkJCQlDUFVGUkVRX1JFTEFUSU9OX0gpOwogCQlyZXR1cm47CkBAIC00NDksMjcgKzUwNCw0NSBAQAogCiBzdGF0aWMgdm9pZCBkb19kYnNfdGltZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCWludCBpOwotCW11dGV4X2xvY2soJmRic19tdXRleCk7Ci0JZm9yX2VhY2hfb25saW5lX2NwdShpKQotCQlkYnNfY2hlY2tfY3B1KGkpOwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGJzX3dvcmssCi0JCQl1c2Vjc190b19qaWZmaWVzKGRic190dW5lcnNfaW5zLnNhbXBsaW5nX3JhdGUpKTsKLQltdXRleF91bmxvY2soJmRic19tdXRleCk7CisJc3RydWN0IGNwdV9kYnNfaW5mb19zICpkYnNfaW5mbyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY3B1X2Ric19pbmZvX3MsIHdvcmsud29yayk7CisJdW5zaWduZWQgaW50IGNwdSA9IGRic19pbmZvLT5jcHU7CisKKwkvKiBXZSB3YW50IGFsbCBDUFVzIHRvIGRvIHNhbXBsaW5nIG5lYXJseSBvbiBzYW1lIGppZmZ5ICovCisJaW50IGRlbGF5ID0gdXNlY3NfdG9famlmZmllcyhkYnNfdHVuZXJzX2lucy5zYW1wbGluZ19yYXRlKTsKKworCWRlbGF5IC09IGppZmZpZXMgJSBkZWxheTsKKworCWlmIChsb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKCFkYnNfaW5mby0+ZW5hYmxlKSB7CisJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKKwkJcmV0dXJuOworCX0KKworCWRic19jaGVja19jcHUoZGJzX2luZm8pOworCisJcXVldWVfZGVsYXllZF93b3JrX29uKGNwdSwga2NvbnNlcnZhdGl2ZV93cSwgJmRic19pbmZvLT53b3JrLCBkZWxheSk7CisJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGJzX3RpbWVyX2luaXQodm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYnNfdGltZXJfaW5pdChzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgKmRic19pbmZvKQogewotCWluaXRfdGltZXJfZGVmZXJyYWJsZSgmZGJzX3dvcmsudGltZXIpOwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGJzX3dvcmssCi0JCQl1c2Vjc190b19qaWZmaWVzKGRic190dW5lcnNfaW5zLnNhbXBsaW5nX3JhdGUpKTsKLQlyZXR1cm47CisJLyogV2Ugd2FudCBhbGwgQ1BVcyB0byBkbyBzYW1wbGluZyBuZWFybHkgb24gc2FtZSBqaWZmeSAqLworCWludCBkZWxheSA9IHVzZWNzX3RvX2ppZmZpZXMoZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSk7CisJZGVsYXkgLT0gamlmZmllcyAlIGRlbGF5OworCisJZGJzX2luZm8tPmVuYWJsZSA9IDE7CisJSU5JVF9ERUxBWUVEX1dPUktfREVGRVJSQUJMRSgmZGJzX2luZm8tPndvcmssIGRvX2Ric190aW1lcik7CisJcXVldWVfZGVsYXllZF93b3JrX29uKGRic19pbmZvLT5jcHUsIGtjb25zZXJ2YXRpdmVfd3EsICZkYnNfaW5mby0+d29yaywKKwkJCQlkZWxheSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkYnNfdGltZXJfZXhpdCh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIGRic190aW1lcl9leGl0KHN0cnVjdCBjcHVfZGJzX2luZm9fcyAqZGJzX2luZm8pCiB7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmZGJzX3dvcmspOwotCXJldHVybjsKKwlkYnNfaW5mby0+ZW5hYmxlID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZkYnNfaW5mby0+d29yayk7CiB9CiAKIHN0YXRpYyBpbnQgY3B1ZnJlcV9nb3Zlcm5vcl9kYnMoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCkBAIC01MDMsMTEgKzU3NiwxMyBAQAogCQkJal9kYnNfaW5mbyA9ICZwZXJfY3B1KGNwdV9kYnNfaW5mbywgaik7CiAJCQlqX2Ric19pbmZvLT5jdXJfcG9saWN5ID0gcG9saWN5OwogCi0JCQlqX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlX3VwID0gZ2V0X2NwdV9pZGxlX3RpbWUoY3B1KTsKLQkJCWpfZGJzX2luZm8tPnByZXZfY3B1X2lkbGVfZG93bgotCQkJCT0gal9kYnNfaW5mby0+cHJldl9jcHVfaWRsZV91cDsKKwkJCWpfZGJzX2luZm8tPnByZXZfY3B1X2lkbGUgPSBnZXRfY3B1X2lkbGVfdGltZShqLAorCQkJCQkJJmpfZGJzX2luZm8tPnByZXZfY3B1X3dhbGwpOworCQkJaWYgKGRic190dW5lcnNfaW5zLmlnbm9yZV9uaWNlKSB7CisJCQkJal9kYnNfaW5mby0+cHJldl9jcHVfbmljZSA9CisJCQkJCQlrc3RhdF9jcHUoaikuY3B1c3RhdC5uaWNlOworCQkJfQogCQl9Ci0JCXRoaXNfZGJzX2luZm8tPmVuYWJsZSA9IDE7CiAJCXRoaXNfZGJzX2luZm8tPmRvd25fc2tpcCA9IDA7CiAJCXRoaXNfZGJzX2luZm8tPnJlcXVlc3RlZF9mcmVxID0gcG9saWN5LT5jdXI7CiAKQEAgLTUyMywzOCArNTk4LDM2IEBACiAJCQlpZiAobGF0ZW5jeSA9PSAwKQogCQkJCWxhdGVuY3kgPSAxOwogCi0JCQlkZWZfc2FtcGxpbmdfcmF0ZSA9IDEwICogbGF0ZW5jeSAqCi0JCQkJCURFRl9TQU1QTElOR19SQVRFX0xBVEVOQ1lfTVVMVElQTElFUjsKLQotCQkJaWYgKGRlZl9zYW1wbGluZ19yYXRlIDwgTUlOX1NUQVRfU0FNUExJTkdfUkFURSkKLQkJCQlkZWZfc2FtcGxpbmdfcmF0ZSA9IE1JTl9TVEFUX1NBTVBMSU5HX1JBVEU7CisJCQlkZWZfc2FtcGxpbmdfcmF0ZSA9CisJCQkJbWF4KGxhdGVuY3kgKiBMQVRFTkNZX01VTFRJUExJRVIsCisJCQkJICAgIE1JTl9TVEFUX1NBTVBMSU5HX1JBVEUpOwogCiAJCQlkYnNfdHVuZXJzX2lucy5zYW1wbGluZ19yYXRlID0gZGVmX3NhbXBsaW5nX3JhdGU7CiAKLQkJCWRic190aW1lcl9pbml0KCk7CiAJCQljcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKAogCQkJCQkmZGJzX2NwdWZyZXFfbm90aWZpZXJfYmxvY2ssCiAJCQkJCUNQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7CiAJCX0KKwkJZGJzX3RpbWVyX2luaXQodGhpc19kYnNfaW5mbyk7CiAKIAkJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOworCiAJCWJyZWFrOwogCiAJY2FzZSBDUFVGUkVRX0dPVl9TVE9QOgogCQltdXRleF9sb2NrKCZkYnNfbXV0ZXgpOwotCQl0aGlzX2Ric19pbmZvLT5lbmFibGUgPSAwOworCQlkYnNfdGltZXJfZXhpdCh0aGlzX2Ric19pbmZvKTsKIAkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwb2xpY3ktPmtvYmosICZkYnNfYXR0cl9ncm91cCk7CiAJCWRic19lbmFibGUtLTsKKwogCQkvKgogCQkgKiBTdG9wIHRoZSB0aW1lcnNjaGVkdWxlIHdvcmssIHdoZW4gdGhpcyBnb3Zlcm5vcgogCQkgKiBpcyB1c2VkIGZvciBmaXJzdCB0aW1lCiAJCSAqLwotCQlpZiAoZGJzX2VuYWJsZSA9PSAwKSB7Ci0JCQlkYnNfdGltZXJfZXhpdCgpOworCQlpZiAoZGJzX2VuYWJsZSA9PSAwKQogCQkJY3B1ZnJlcV91bnJlZ2lzdGVyX25vdGlmaWVyKAogCQkJCQkmZGJzX2NwdWZyZXFfbm90aWZpZXJfYmxvY2ssCiAJCQkJCUNQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7Ci0JCX0KIAogCQltdXRleF91bmxvY2soJmRic19tdXRleCk7CiAKQEAgLTU3MSw2ICs2NDQsNyBAQAogCQkJCQl0aGlzX2Ric19pbmZvLT5jdXJfcG9saWN5LAogCQkJCQlwb2xpY3ktPm1pbiwgQ1BVRlJFUV9SRUxBVElPTl9MKTsKIAkJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOworCiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKQEAgLTU4OCwyMyArNjYyLDMzIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfZ292X2Ric19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZ292ZXJub3IoJmNwdWZyZXFfZ292X2NvbnNlcnZhdGl2ZSk7CisJaW50IGVycjsKKworCWtjb25zZXJ2YXRpdmVfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJrY29uc2VydmF0aXZlIik7CisJaWYgKCFrY29uc2VydmF0aXZlX3dxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ3JlYXRpb24gb2Yga2NvbnNlcnZhdGl2ZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwllcnIgPSBjcHVmcmVxX3JlZ2lzdGVyX2dvdmVybm9yKCZjcHVmcmVxX2dvdl9jb25zZXJ2YXRpdmUpOworCWlmIChlcnIpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGtjb25zZXJ2YXRpdmVfd3EpOworCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNwdWZyZXFfZ292X2Ric19leGl0KHZvaWQpCiB7Ci0JLyogTWFrZSBzdXJlIHRoYXQgdGhlIHNjaGVkdWxlZCB3b3JrIGlzIGluZGVlZCBub3QgcnVubmluZyAqLwotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0KIAljcHVmcmVxX3VucmVnaXN0ZXJfZ292ZXJub3IoJmNwdWZyZXFfZ292X2NvbnNlcnZhdGl2ZSk7CisJZGVzdHJveV93b3JrcXVldWUoa2NvbnNlcnZhdGl2ZV93cSk7CiB9CiAKIAotTU9EVUxFX0FVVEhPUiAoIkFsZXhhbmRlciBDbG91dGVyIDxhbGV4LWtlcm5lbEBkaWdyaXoub3JnLnVrPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OICgiJ2NwdWZyZXFfY29uc2VydmF0aXZlJyAtIEEgZHluYW1pYyBjcHVmcmVxIGdvdmVybm9yIGZvciAiCitNT0RVTEVfQVVUSE9SKCJBbGV4YW5kZXIgQ2xvdXRlciA8YWxleEBkaWdyaXoub3JnLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCInY3B1ZnJlcV9jb25zZXJ2YXRpdmUnIC0gQSBkeW5hbWljIGNwdWZyZXEgZ292ZXJub3IgZm9yICIKIAkJIkxvdyBMYXRlbmN5IEZyZXF1ZW5jeSBUcmFuc2l0aW9uIGNhcGFibGUgcHJvY2Vzc29ycyAiCiAJCSJvcHRpbWlzZWQgZm9yIHVzZSBpbiBhIGJhdHRlcnkgZW52aXJvbm1lbnQiKTsKLU1PRFVMRV9MSUNFTlNFICgiR1BMIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfQ09OU0VSVkFUSVZFCiBmc19pbml0Y2FsbChjcHVmcmVxX2dvdl9kYnNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYwppbmRleCA2ZjQ1YjE2Li4zMzhmNDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogLyoKICAqIGRicyBpcyB1c2VkIGluIHRoaXMgZmlsZSBhcyBhIHNob3J0Zm9ybSBmb3IgZGVtYW5kYmFzZWQgc3dpdGNoaW5nCkBAIC01MSw4ICs1MiwyMCBAQAogCQkJKE1JTl9TQU1QTElOR19SQVRFX1JBVElPICogamlmZmllc190b191c2VjcygxMCkpCiAjZGVmaW5lIE1JTl9TQU1QTElOR19SQVRFCQkJXAogCQkJKGRlZl9zYW1wbGluZ19yYXRlIC8gTUlOX1NBTVBMSU5HX1JBVEVfUkFUSU8pCisvKiBBYm92ZSBNSU5fU0FNUExJTkdfUkFURSB3aWxsIHZhbmlzaCB3aXRoIGl0cyBzeXNmcyBmaWxlIHNvb24KKyAqIERlZmluZSB0aGUgbWluaW1hbCBzZXR0YWJsZSBzYW1wbGluZyByYXRlIHRvIHRoZSBncmVhdGVyIG9mOgorICogICAtICJIVyB0cmFuc2l0aW9uIGxhdGVuY3kiICogMTAwIChzYW1lIGFzIGRlZmF1bHQgc2FtcGxpbmcgLyAxMCkKKyAqICAgLSBNSU5fU1RBVF9TQU1QTElOR19SQVRFCisgKiBUbyBhdm9pZCB0aGF0IHVzZXJzcGFjZSBzaG9vdHMgaXRzZWxmLgorKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWluaW11bV9zYW1wbGluZ19yYXRlKHZvaWQpCit7CisJcmV0dXJuIG1heChkZWZfc2FtcGxpbmdfcmF0ZSAvIDEwLCBNSU5fU1RBVF9TQU1QTElOR19SQVRFKTsKK30KKworLyogVGhpcyB3aWxsIGFsc28gdmFuaXNoIHNvb24gd2l0aCByZW1vdmluZyBzYW1wbGluZ19yYXRlX21heCAqLwogI2RlZmluZSBNQVhfU0FNUExJTkdfUkFURQkJCSg1MDAgKiBkZWZfc2FtcGxpbmdfcmF0ZSkKLSNkZWZpbmUgREVGX1NBTVBMSU5HX1JBVEVfTEFURU5DWV9NVUxUSVBMSUVSCSgxMDAwKQorI2RlZmluZSBMQVRFTkNZX01VTFRJUExJRVIJCQkoMTAwMCkKICNkZWZpbmUgVFJBTlNJVElPTl9MQVRFTkNZX0xJTUlUCQkoMTAgKiAxMDAwICogMTAwMCkKIAogc3RhdGljIHZvaWQgZG9fZGJzX3RpbWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CkBAIC02NSwxNCArNzgsMTQgQEAKIAljcHV0aW1lNjRfdCBwcmV2X2NwdV93YWxsOwogCWNwdXRpbWU2NF90IHByZXZfY3B1X25pY2U7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpjdXJfcG9saWN5OwotIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqZnJlcV90YWJsZTsKIAl1bnNpZ25lZCBpbnQgZnJlcV9sbzsKIAl1bnNpZ25lZCBpbnQgZnJlcV9sb19qaWZmaWVzOwogCXVuc2lnbmVkIGludCBmcmVxX2hpX2ppZmZpZXM7CiAJaW50IGNwdTsKIAl1bnNpZ25lZCBpbnQgZW5hYmxlOjEsCi0JICAgICAgICAgICAgIHNhbXBsZV90eXBlOjE7CisJCXNhbXBsZV90eXBlOjE7CiB9Owogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfZGJzX2luZm9fcywgY3B1X2Ric19pbmZvKTsKIApAQCAtMjAzLDEyICsyMTYsMjggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBzeXNmcyBpbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHNzaXplX3Qgc2hvd19zYW1wbGluZ19yYXRlX21heChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmIChidWYsICIldVxuIiwgTUFYX1NBTVBMSU5HX1JBVEUpOworCXN0YXRpYyBpbnQgcHJpbnRfb25jZTsKKworCWlmICghcHJpbnRfb25jZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJDUFVGUkVROiBvbmRlbWFuZCBzYW1wbGluZ19yYXRlX21heCAiCisJCSAgICAgICAic3lzZnMgZmlsZSBpcyBkZXByZWNhdGVkIC0gdXNlZCBieTogJXNcbiIsCisJCSAgICAgICBjdXJyZW50LT5jb21tKTsKKwkJcHJpbnRfb25jZSA9IDE7CisJfQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBNQVhfU0FNUExJTkdfUkFURSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfc2FtcGxpbmdfcmF0ZV9taW4oc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZiAoYnVmLCAiJXVcbiIsIE1JTl9TQU1QTElOR19SQVRFKTsKKwlzdGF0aWMgaW50IHByaW50X29uY2U7CisKKwlpZiAoIXByaW50X29uY2UpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVRlJFUTogb25kZW1hbmQgc2FtcGxpbmdfcmF0ZV9taW4gIgorCQkgICAgICAgInN5c2ZzIGZpbGUgaXMgZGVwcmVjYXRlZCAtIHVzZWQgYnk6ICVzXG4iLAorCQkgICAgICAgY3VycmVudC0+Y29tbSk7CisJCXByaW50X29uY2UgPSAxOworCX0KKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgTUlOX1NBTVBMSU5HX1JBVEUpOwogfQogCiAjZGVmaW5lIGRlZmluZV9vbmVfcm8oX25hbWUpCQlcCkBAIC0yMzgsMTMgKzI2NywxMSBAQAogCXJldCA9IHNzY2FuZihidWYsICIldSIsICZpbnB1dCk7CiAKIAltdXRleF9sb2NrKCZkYnNfbXV0ZXgpOwotCWlmIChyZXQgIT0gMSB8fCBpbnB1dCA+IE1BWF9TQU1QTElOR19SQVRFCi0JCSAgICAgfHwgaW5wdXQgPCBNSU5fU0FNUExJTkdfUkFURSkgeworCWlmIChyZXQgIT0gMSkgewogCQltdXRleF91bmxvY2soJmRic19tdXRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQotCWRic190dW5lcnNfaW5zLnNhbXBsaW5nX3JhdGUgPSBpbnB1dDsKKwlkYnNfdHVuZXJzX2lucy5zYW1wbGluZ19yYXRlID0gbWF4KGlucHV0LCBtaW5pbXVtX3NhbXBsaW5nX3JhdGUoKSk7CiAJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtMjc5LDE0ICszMDYsMTQgQEAKIAl1bnNpZ25lZCBpbnQgajsKIAogCXJldCA9IHNzY2FuZihidWYsICIldSIsICZpbnB1dCk7Ci0JaWYgKCByZXQgIT0gMSApCisJaWYgKHJldCAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICggaW5wdXQgPiAxICkKKwlpZiAoaW5wdXQgPiAxKQogCQlpbnB1dCA9IDE7CiAKIAltdXRleF9sb2NrKCZkYnNfbXV0ZXgpOwotCWlmICggaW5wdXQgPT0gZGJzX3R1bmVyc19pbnMuaWdub3JlX25pY2UgKSB7IC8qIG5vdGhpbmcgdG8gZG8gKi8KKwlpZiAoaW5wdXQgPT0gZGJzX3R1bmVyc19pbnMuaWdub3JlX25pY2UpIHsgLyogbm90aGluZyB0byBkbyAqLwogCQltdXRleF91bmxvY2soJmRic19tdXRleCk7CiAJCXJldHVybiBjb3VudDsKIAl9CkBAIC0zMzcsNyArMzY0LDcgQEAKIGRlZmluZV9vbmVfcncoaWdub3JlX25pY2VfbG9hZCk7CiBkZWZpbmVfb25lX3J3KHBvd2Vyc2F2ZV9iaWFzKTsKIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKiBkYnNfYXR0cmlidXRlc1tdID0geworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRic19hdHRyaWJ1dGVzW10gPSB7CiAJJnNhbXBsaW5nX3JhdGVfbWF4LmF0dHIsCiAJJnNhbXBsaW5nX3JhdGVfbWluLmF0dHIsCiAJJnNhbXBsaW5nX3JhdGUuYXR0ciwKQEAgLTUxMiw4ICs1MzksNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJX19jcHVmcmVxX2RyaXZlcl90YXJnZXQoZGJzX2luZm8tPmN1cl9wb2xpY3ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgCWRic19pbmZvLT5mcmVxX2xvLAotCSAgICAgICAgICAgICAgICAgICAgICAgIAlDUFVGUkVRX1JFTEFUSU9OX0gpOworCQkJZGJzX2luZm8tPmZyZXFfbG8sIENQVUZSRVFfUkVMQVRJT05fSCk7CiAJfQogCXF1ZXVlX2RlbGF5ZWRfd29ya19vbihjcHUsIGtvbmRlbWFuZF93cSwgJmRic19pbmZvLT53b3JrLCBkZWxheSk7CiAJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwpAQCAtNTMwLDcgKzU1Niw3IEBACiAJZGJzX2luZm8tPnNhbXBsZV90eXBlID0gREJTX05PUk1BTF9TQU1QTEU7CiAJSU5JVF9ERUxBWUVEX1dPUktfREVGRVJSQUJMRSgmZGJzX2luZm8tPndvcmssIGRvX2Ric190aW1lcik7CiAJcXVldWVfZGVsYXllZF93b3JrX29uKGRic19pbmZvLT5jcHUsIGtvbmRlbWFuZF93cSwgJmRic19pbmZvLT53b3JrLAotCSAgICAgICAgICAgICAgICAgICAgICBkZWxheSk7CisJCWRlbGF5KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRic190aW1lcl9leGl0KHN0cnVjdCBjcHVfZGJzX2luZm9fcyAqZGJzX2luZm8pCkBAIC01OTEsMTEgKzYxNyw5IEBACiAJCQlpZiAobGF0ZW5jeSA9PSAwKQogCQkJCWxhdGVuY3kgPSAxOwogCi0JCQlkZWZfc2FtcGxpbmdfcmF0ZSA9IGxhdGVuY3kgKgotCQkJCQlERUZfU0FNUExJTkdfUkFURV9MQVRFTkNZX01VTFRJUExJRVI7Ci0KLQkJCWlmIChkZWZfc2FtcGxpbmdfcmF0ZSA8IE1JTl9TVEFUX1NBTVBMSU5HX1JBVEUpCi0JCQkJZGVmX3NhbXBsaW5nX3JhdGUgPSBNSU5fU1RBVF9TQU1QTElOR19SQVRFOworCQkJZGVmX3NhbXBsaW5nX3JhdGUgPQorCQkJCW1heChsYXRlbmN5ICogTEFURU5DWV9NVUxUSVBMSUVSLAorCQkJCSAgICBNSU5fU1RBVF9TQU1QTElOR19SQVRFKTsKIAogCQkJZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSA9IGRlZl9zYW1wbGluZ19yYXRlOwogCQl9CkBAIC02MTcsMTIgKzY0MSwxMCBAQAogCQltdXRleF9sb2NrKCZkYnNfbXV0ZXgpOwogCQlpZiAocG9saWN5LT5tYXggPCB0aGlzX2Ric19pbmZvLT5jdXJfcG9saWN5LT5jdXIpCiAJCQlfX2NwdWZyZXFfZHJpdmVyX3RhcmdldCh0aGlzX2Ric19pbmZvLT5jdXJfcG9saWN5LAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5LT5tYXgsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICBDUFVGUkVRX1JFTEFUSU9OX0gpOworCQkJCXBvbGljeS0+bWF4LCBDUFVGUkVRX1JFTEFUSU9OX0gpOwogCQllbHNlIGlmIChwb2xpY3ktPm1pbiA+IHRoaXNfZGJzX2luZm8tPmN1cl9wb2xpY3ktPmN1cikKIAkJCV9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHRoaXNfZGJzX2luZm8tPmN1cl9wb2xpY3ksCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3ktPm1pbiwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgIENQVUZSRVFfUkVMQVRJT05fTCk7CisJCQkJcG9saWN5LT5taW4sIENQVUZSRVFfUkVMQVRJT05fTCk7CiAJCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKIAkJYnJlYWs7CiAJfQpAQCAtNjc3LDcgKzY5OSw3IEBACiBNT0RVTEVfQVVUSE9SKCJWZW5rYXRlc2ggUGFsbGlwYWRpIDx2ZW5rYXRlc2gucGFsbGlwYWRpQGludGVsLmNvbT4iKTsKIE1PRFVMRV9BVVRIT1IoIkFsZXhleSBTdGFyaWtvdnNraXkgPGFsZXhleS55LnN0YXJpa292c2tpeUBpbnRlbC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIidjcHVmcmVxX29uZGVtYW5kJyAtIEEgZHluYW1pYyBjcHVmcmVxIGdvdmVybm9yIGZvciAiCi0gICAgICAgICAgICAgICAgICAgIkxvdyBMYXRlbmN5IEZyZXF1ZW5jeSBUcmFuc2l0aW9uIGNhcGFibGUgcHJvY2Vzc29ycyIpOworCSJMb3cgTGF0ZW5jeSBGcmVxdWVuY3kgVHJhbnNpdGlvbiBjYXBhYmxlIHByb2Nlc3NvcnMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogI2lmZGVmIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9PTkRFTUFORApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKaW5kZXggYzBmZjk3ZC4uNWE2MmQ2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCkBAIC0yLDcgKzIsNyBAQAogICogIGRyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgVmVua2F0ZXNoIFBhbGxpcGFkaSA8dmVua2F0ZXNoLnBhbGxpcGFkaUBpbnRlbC5jb20+LgotICoJICAgICAgKEMpIDIwMDQgWm91IE5hbiBoYWkgPG5hbmhhaS56b3VAaW50ZWwuY29tPi4KKyAqICAoQykgMjAwNCBab3UgTmFuIGhhaSA8bmFuaGFpLnpvdUBpbnRlbC5jb20+LgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMjMsNyArMjMsNyBAQAogCiBzdGF0aWMgc3BpbmxvY2tfdCBjcHVmcmVxX3N0YXRzX2xvY2s7CiAKLSNkZWZpbmUgQ1BVRlJFUV9TVEFUREVWSUNFX0FUVFIoX25hbWUsX21vZGUsX3Nob3cpIFwKKyNkZWZpbmUgQ1BVRlJFUV9TVEFUREVWSUNFX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdykgXAogc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgX2F0dHJfIyNfbmFtZSA9IHtcCiAJLmF0dHIgPSB7Lm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksIC5tb2RlID0gX21vZGUsIH0sIFwKIAkuc2hvdyA9IF9zaG93LFwKQEAgLTUwLDggKzUwLDcgQEAKIAlzc2l6ZV90KCpzaG93KSAoc3RydWN0IGNwdWZyZXFfc3RhdHMgKiwgY2hhciAqKTsKIH07CiAKLXN0YXRpYyBpbnQKLWNwdWZyZXFfc3RhdHNfdXBkYXRlICh1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIGludCBjcHVmcmVxX3N0YXRzX3VwZGF0ZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBjcHVmcmVxX3N0YXRzICpzdGF0OwogCXVuc2lnbmVkIGxvbmcgbG9uZyBjdXJfdGltZTsKQEAgLTY4LDggKzY3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3QKLXNob3dfdG90YWxfdHJhbnMoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfdG90YWxfdHJhbnMoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9zdGF0cyAqc3RhdCA9IHBlcl9jcHUoY3B1ZnJlcV9zdGF0c190YWJsZSwgcG9saWN5LT5jcHUpOwogCWlmICghc3RhdCkKQEAgLTc4LDggKzc2LDcgQEAKIAkJCXBlcl9jcHUoY3B1ZnJlcV9zdGF0c190YWJsZSwgc3RhdC0+Y3B1KS0+dG90YWxfdHJhbnMpOwogfQogCi1zdGF0aWMgc3NpemVfdAotc2hvd190aW1lX2luX3N0YXRlKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3RpbWVfaW5fc3RhdGUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKIHsKIAlzc2l6ZV90IGxlbiA9IDA7CiAJaW50IGk7CkBAIC04OSwxNCArODYsMTQgQEAKIAljcHVmcmVxX3N0YXRzX3VwZGF0ZShzdGF0LT5jcHUpOwogCWZvciAoaSA9IDA7IGkgPCBzdGF0LT5zdGF0ZV9udW07IGkrKykgewogCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIldSAlbGx1XG4iLCBzdGF0LT5mcmVxX3RhYmxlW2ldLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdChzdGF0LT50aW1lX2luX3N0YXRlW2ldKSk7CisJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJY3B1dGltZTY0X3RvX2Nsb2NrX3Qoc3RhdC0+dGltZV9pbl9zdGF0ZVtpXSkpOwogCX0KIAlyZXR1cm4gbGVuOwogfQogCiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRX1NUQVRfREVUQUlMUwotc3RhdGljIHNzaXplX3QKLXNob3dfdHJhbnNfdGFibGUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfdHJhbnNfdGFibGUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKIHsKIAlzc2l6ZV90IGxlbiA9IDA7CiAJaW50IGksIGo7CkBAIC0xMzksMTEgKzEzNiwxMSBAQAogCQlyZXR1cm4gUEFHRV9TSVpFOwogCXJldHVybiBsZW47CiB9Ci1DUFVGUkVRX1NUQVRERVZJQ0VfQVRUUih0cmFuc190YWJsZSwwNDQ0LHNob3dfdHJhbnNfdGFibGUpOworQ1BVRlJFUV9TVEFUREVWSUNFX0FUVFIodHJhbnNfdGFibGUsIDA0NDQsIHNob3dfdHJhbnNfdGFibGUpOwogI2VuZGlmCiAKLUNQVUZSRVFfU1RBVERFVklDRV9BVFRSKHRvdGFsX3RyYW5zLDA0NDQsc2hvd190b3RhbF90cmFucyk7Ci1DUFVGUkVRX1NUQVRERVZJQ0VfQVRUUih0aW1lX2luX3N0YXRlLDA0NDQsc2hvd190aW1lX2luX3N0YXRlKTsKK0NQVUZSRVFfU1RBVERFVklDRV9BVFRSKHRvdGFsX3RyYW5zLCAwNDQ0LCBzaG93X3RvdGFsX3RyYW5zKTsKK0NQVUZSRVFfU1RBVERFVklDRV9BVFRSKHRpbWVfaW5fc3RhdGUsIDA0NDQsIHNob3dfdGltZV9pbl9zdGF0ZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkZWZhdWx0X2F0dHJzW10gPSB7CiAJJl9hdHRyX3RvdGFsX3RyYW5zLmF0dHIsCkBAIC0xNTgsOCArMTU1LDcgQEAKIAkubmFtZSA9ICJzdGF0cyIKIH07CiAKLXN0YXRpYyBpbnQKLWZyZXFfdGFibGVfZ2V0X2luZGV4KHN0cnVjdCBjcHVmcmVxX3N0YXRzICpzdGF0LCB1bnNpZ25lZCBpbnQgZnJlcSkKK3N0YXRpYyBpbnQgZnJlcV90YWJsZV9nZXRfaW5kZXgoc3RydWN0IGNwdWZyZXFfc3RhdHMgKnN0YXQsIHVuc2lnbmVkIGludCBmcmVxKQogewogCWludCBpbmRleDsKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzdGF0LT5tYXhfc3RhdGU7IGluZGV4KyspCkBAIC0xODMsOCArMTc5LDcgQEAKIAkJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CiB9CiAKLXN0YXRpYyBpbnQKLWNwdWZyZXFfc3RhdHNfY3JlYXRlX3RhYmxlIChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKK3N0YXRpYyBpbnQgY3B1ZnJlcV9zdGF0c19jcmVhdGVfdGFibGUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCiAJCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGUpCiB7CiAJdW5zaWduZWQgaW50IGksIGosIGNvdW50ID0gMCwgcmV0ID0gMDsKQEAgLTE5NCw3ICsxODksOCBAQAogCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKIAlpZiAocGVyX2NwdShjcHVmcmVxX3N0YXRzX3RhYmxlLCBjcHUpKQogCQlyZXR1cm4gLUVCVVNZOwotCWlmICgoc3RhdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX3N0YXRzKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJc3RhdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX3N0YXRzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKChzdGF0KSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWRhdGEgPSBjcHVmcmVxX2NwdV9nZXQoY3B1KTsKQEAgLTIwMywxMyArMTk5LDE0IEBACiAJCWdvdG8gZXJyb3JfZ2V0X2ZhaWw7CiAJfQogCi0JaWYgKChyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRhdGEtPmtvYmosICZzdGF0c19hdHRyX2dyb3VwKSkpCisJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkYXRhLT5rb2JqLCAmc3RhdHNfYXR0cl9ncm91cCk7CisJaWYgKHJldCkKIAkJZ290byBlcnJvcl9vdXQ7CiAKIAlzdGF0LT5jcHUgPSBjcHU7CiAJcGVyX2NwdShjcHVmcmVxX3N0YXRzX3RhYmxlLCBjcHUpID0gc3RhdDsKIAotCWZvciAoaT0wOyB0YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQ7IGkrKykgeworCWZvciAoaSA9IDA7IHRhYmxlW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORDsgaSsrKSB7CiAJCXVuc2lnbmVkIGludCBmcmVxID0gdGFibGVbaV0uZnJlcXVlbmN5OwogCQlpZiAoZnJlcSA9PSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQpCiAJCQljb250aW51ZTsKQEAgLTI1NSw5ICsyNTIsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQKLWNwdWZyZXFfc3RhdF9ub3RpZmllcl9wb2xpY3kgKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAotCQl2b2lkICpkYXRhKQorc3RhdGljIGludCBjcHVmcmVxX3N0YXRfbm90aWZpZXJfcG9saWN5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCXVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQogewogCWludCByZXQ7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBkYXRhOwpAQCAtMjY4LDE0ICsyNjQsMTQgQEAKIAl0YWJsZSA9IGNwdWZyZXFfZnJlcXVlbmN5X2dldF90YWJsZShjcHUpOwogCWlmICghdGFibGUpCiAJCXJldHVybiAwOwotCWlmICgocmV0ID0gY3B1ZnJlcV9zdGF0c19jcmVhdGVfdGFibGUocG9saWN5LCB0YWJsZSkpKQorCXJldCA9IGNwdWZyZXFfc3RhdHNfY3JlYXRlX3RhYmxlKHBvbGljeSwgdGFibGUpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLWNwdWZyZXFfc3RhdF9ub3RpZmllcl90cmFucyAoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCi0JCXZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGNwdWZyZXFfc3RhdF9ub3RpZmllcl90cmFucyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQl1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqZnJlcSA9IGRhdGE7CiAJc3RydWN0IGNwdWZyZXFfc3RhdHMgKnN0YXQ7CkBAIC0zNDAsMTkgKzMzNiwyMCBAQAogCS5ub3RpZmllcl9jYWxsID0gY3B1ZnJlcV9zdGF0X25vdGlmaWVyX3RyYW5zCiB9OwogCi1zdGF0aWMgaW50Ci1fX2luaXQgY3B1ZnJlcV9zdGF0c19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX3N0YXRzX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGludCBjcHU7CiAKIAlzcGluX2xvY2tfaW5pdCgmY3B1ZnJlcV9zdGF0c19sb2NrKTsKLQlpZiAoKHJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJm5vdGlmaWVyX3BvbGljeV9ibG9jaywKLQkJCQlDUFVGUkVRX1BPTElDWV9OT1RJRklFUikpKQorCXJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJm5vdGlmaWVyX3BvbGljeV9ibG9jaywKKwkJCQlDUFVGUkVRX1BPTElDWV9OT1RJRklFUik7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICgocmV0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9ub3RpZmllcigmbm90aWZpZXJfdHJhbnNfYmxvY2ssCi0JCQkJQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKSkpIHsKKwlyZXQgPSBjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZub3RpZmllcl90cmFuc19ibG9jaywKKwkJCQlDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOworCWlmIChyZXQpIHsKIAkJY3B1ZnJlcV91bnJlZ2lzdGVyX25vdGlmaWVyKCZub3RpZmllcl9wb2xpY3lfYmxvY2ssCiAJCQkJQ1BVRlJFUV9QT0xJQ1lfTk9USUZJRVIpOwogCQlyZXR1cm4gcmV0OwpAQCAtMzY0LDggKzM2MSw3IEBACiAJfQogCXJldHVybiAwOwogfQotc3RhdGljIHZvaWQKLV9fZXhpdCBjcHVmcmVxX3N0YXRzX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcHVmcmVxX3N0YXRzX2V4aXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1OwogCkBAIC0zNzksMTAgKzM3NSwxMCBAQAogCX0KIH0KIAotTU9EVUxFX0FVVEhPUiAoIlpvdSBOYW4gaGFpIDxuYW5oYWkuem91QGludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTiAoIidjcHVmcmVxX3N0YXRzJyAtIEEgZHJpdmVyIHRvIGV4cG9ydCBjcHVmcmVxIHN0YXRzICIKK01PRFVMRV9BVVRIT1IoIlpvdSBOYW4gaGFpIDxuYW5oYWkuem91QGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiJ2NwdWZyZXFfc3RhdHMnIC0gQSBkcml2ZXIgdG8gZXhwb3J0IGNwdWZyZXEgc3RhdHMgIgogCQkJCSJ0aHJvdWdoIHN5c2ZzIGZpbGVzeXN0ZW0iKTsKLU1PRFVMRV9MSUNFTlNFICgiR1BMIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIG1vZHVsZV9pbml0KGNwdWZyZXFfc3RhdHNfaW5pdCk7CiBtb2R1bGVfZXhpdChjcHVmcmVxX3N0YXRzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV91c2Vyc3BhY2UuYwppbmRleCAxNDQyYmJhLi42NmQyZDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV91c2Vyc3BhY2UuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV91c2Vyc3BhY2UuYwpAQCAtMjQsOSArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLQogLyoqCiAgKiBBIGZldyB2YWx1ZXMgbmVlZGVkIGJ5IHRoZSB1c2Vyc3BhY2UgZ292ZXJub3IKICAqLwpAQCAtMzcsNyArMzQsNyBAQAogCQkJCQkJCXVzZXJzcGFjZSAqLwogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgY3B1X2lzX21hbmFnZWQpOwogCi1zdGF0aWMgREVGSU5FX01VVEVYCSh1c2Vyc3BhY2VfbXV0ZXgpOworc3RhdGljIERFRklORV9NVVRFWCh1c2Vyc3BhY2VfbXV0ZXgpOwogc3RhdGljIGludCBjcHVzX3VzaW5nX3VzZXJzcGFjZV9nb3Zlcm5vcjsKIAogI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgXApAQCAtNDYsOSArNDMsOSBAQAogLyoga2VlcCB0cmFjayBvZiBmcmVxdWVuY3kgdHJhbnNpdGlvbnMgKi8KIHN0YXRpYyBpbnQKIHVzZXJzcGFjZV9jcHVmcmVxX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQorCXZvaWQgKmRhdGEpCiB7Ci0gICAgICAgIHN0cnVjdCBjcHVmcmVxX2ZyZXFzICpmcmVxID0gZGF0YTsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqZnJlcSA9IGRhdGE7CiAKIAlpZiAoIXBlcl9jcHUoY3B1X2lzX21hbmFnZWQsIGZyZXEtPmNwdSkpCiAJCXJldHVybiAwOwpAQCAtNTcsMTEgKzU0LDExIEBACiAJCQlmcmVxLT5jcHUsIGZyZXEtPm5ldyk7CiAJcGVyX2NwdShjcHVfY3VyX2ZyZXEsIGZyZXEtPmNwdSkgPSBmcmVxLT5uZXc7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdXNlcnNwYWNlX2NwdWZyZXFfbm90aWZpZXJfYmxvY2sgPSB7Ci0gICAgICAgIC5ub3RpZmllcl9jYWxsICA9IHVzZXJzcGFjZV9jcHVmcmVxX25vdGlmaWVyCisJLm5vdGlmaWVyX2NhbGwgID0gdXNlcnNwYWNlX2NwdWZyZXFfbm90aWZpZXIKIH07CiAKIApAQCAtOTMsOCArOTAsMTEgQEAKIAkgKiBXZSdyZSBzYWZlIGZyb20gY29uY3VycmVudCBjYWxscyB0byAtPnRhcmdldCgpIGhlcmUKIAkgKiBhcyB3ZSBob2xkIHRoZSB1c2Vyc3BhY2VfbXV0ZXggbG9jay4gSWYgd2Ugd2VyZSBjYWxsaW5nCiAJICogY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0LCBhIGRlYWRsb2NrIHNpdHVhdGlvbiBtaWdodCBvY2N1cjoKLQkgKiBBOiBjcHVmcmVxX3NldCAobG9jayB1c2Vyc3BhY2VfbXV0ZXgpIC0+IGNwdWZyZXFfZHJpdmVyX3RhcmdldChsb2NrIHBvbGljeS0+bG9jaykKLQkgKiBCOiBjcHVmcmVxX3NldF9wb2xpY3kobG9jayBwb2xpY3ktPmxvY2spIC0+IF9fY3B1ZnJlcV9nb3Zlcm5vciAtPiBjcHVmcmVxX2dvdmVybm9yX3VzZXJzcGFjZSAobG9jayB1c2Vyc3BhY2VfbXV0ZXgpCisJICogQTogY3B1ZnJlcV9zZXQgKGxvY2sgdXNlcnNwYWNlX211dGV4KSAtPgorCSAqICAgICAgY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KGxvY2sgcG9saWN5LT5sb2NrKQorCSAqIEI6IGNwdWZyZXFfc2V0X3BvbGljeShsb2NrIHBvbGljeS0+bG9jaykgLT4KKwkgKiAgICAgIF9fY3B1ZnJlcV9nb3Zlcm5vciAtPgorCSAqICAgICAgICAgY3B1ZnJlcV9nb3Zlcm5vcl91c2Vyc3BhY2UgKGxvY2sgdXNlcnNwYWNlX211dGV4KQogCSAqLwogCXJldCA9IF9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHBvbGljeSwgZnJlcSwgQ1BVRlJFUV9SRUxBVElPTl9MKTsKIApAQCAtMjEwLDkgKzIxMCwxMCBAQAogfQogCiAKLU1PRFVMRV9BVVRIT1IgKCJEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+LCBSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OICgiQ1BVZnJlcSBwb2xpY3kgZ292ZXJub3IgJ3VzZXJzcGFjZSciKTsKLU1PRFVMRV9MSUNFTlNFICgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+LCAiCisJCSJSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDUFVmcmVxIHBvbGljeSBnb3Zlcm5vciAndXNlcnNwYWNlJyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRQogZnNfaW5pdGNhbGwoY3B1ZnJlcV9nb3ZfdXNlcnNwYWNlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2ZyZXFfdGFibGUuYyBiL2RyaXZlcnMvY3B1ZnJlcS9mcmVxX3RhYmxlLmMKaW5kZXggOTA3MWQ4MC4uYTliZDNhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2ZyZXFfdGFibGUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvZnJlcV90YWJsZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAJdW5zaWduZWQgaW50IG1heF9mcmVxID0gMDsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWZvciAoaT0wOyAodGFibGVbaV0uZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EKTsgaSsrKSB7CisJZm9yIChpID0gMDsgKHRhYmxlW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgewogCQl1bnNpZ25lZCBpbnQgZnJlcSA9IHRhYmxlW2ldLmZyZXF1ZW5jeTsKIAkJaWYgKGZyZXEgPT0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEKSB7CiAJCQlkcHJpbnRrKCJ0YWJsZSBlbnRyeSAldSBpcyBpbnZhbGlkLCBza2lwcGluZ1xuIiwgaSk7CkBAIC03MCw3ICs3MCw3IEBACiAJY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhwb2xpY3ksIHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSwKIAkJCQkgICAgIHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSk7CiAKLQlmb3IgKGk9MDsgKHRhYmxlW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgeworCWZvciAoaSA9IDA7ICh0YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQpOyBpKyspIHsKIAkJdW5zaWduZWQgaW50IGZyZXEgPSB0YWJsZVtpXS5mcmVxdWVuY3k7CiAJCWlmIChmcmVxID09IENQVUZSRVFfRU5UUllfSU5WQUxJRCkKIAkJCWNvbnRpbnVlOwpAQCAtMTI1LDEzICsxMjUsMTMgQEAKIAlpZiAoIWNwdV9vbmxpbmUocG9saWN5LT5jcHUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZvciAoaT0wOyAodGFibGVbaV0uZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EKTsgaSsrKSB7CisJZm9yIChpID0gMDsgKHRhYmxlW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgewogCQl1bnNpZ25lZCBpbnQgZnJlcSA9IHRhYmxlW2ldLmZyZXF1ZW5jeTsKIAkJaWYgKGZyZXEgPT0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEKQogCQkJY29udGludWU7CiAJCWlmICgoZnJlcSA8IHBvbGljeS0+bWluKSB8fCAoZnJlcSA+IHBvbGljeS0+bWF4KSkKIAkJCWNvbnRpbnVlOwotCQlzd2l0Y2gocmVsYXRpb24pIHsKKwkJc3dpdGNoIChyZWxhdGlvbikgewogCQljYXNlIENQVUZSRVFfUkVMQVRJT05fSDoKIAkJCWlmIChmcmVxIDw9IHRhcmdldF9mcmVxKSB7CiAJCQkJaWYgKGZyZXEgPj0gb3B0aW1hbC5mcmVxdWVuY3kpIHsKQEAgLTE3OCw3ICsxNzgsNyBAQAogLyoqCiAgKiBzaG93X2F2YWlsYWJsZV9mcmVxcyAtIHNob3cgYXZhaWxhYmxlIGZyZXF1ZW5jaWVzIGZvciB0aGUgc3BlY2lmaWVkIENQVQogICovCi1zdGF0aWMgc3NpemVfdCBzaG93X2F2YWlsYWJsZV9mcmVxcyAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfYXZhaWxhYmxlX2ZyZXFzKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBjaGFyICpidWYpCiB7CiAJdW5zaWduZWQgaW50IGkgPSAwOwogCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKQEAgLTE5MCw3ICsxOTAsNyBAQAogCiAJdGFibGUgPSBwZXJfY3B1KHNob3dfdGFibGUsIGNwdSk7CiAKLQlmb3IgKGk9MDsgKHRhYmxlW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgeworCWZvciAoaSA9IDA7ICh0YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQpOyBpKyspIHsKIAkJaWYgKHRhYmxlW2ldLmZyZXF1ZW5jeSA9PSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQpCiAJCQljb250aW51ZTsKIAkJY291bnQgKz0gc3ByaW50ZigmYnVmW2NvdW50XSwgIiVkICIsIHRhYmxlW2ldLmZyZXF1ZW5jeSk7CkBAIC0yMzQsNiArMjM0LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZnJlcXVlbmN5X2dldF90YWJsZSk7CiAKLU1PRFVMRV9BVVRIT1IgKCJEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04gKCJDUFVmcmVxIGZyZXF1ZW5jeSB0YWJsZSBoZWxwZXJzIik7Ci1NT0RVTEVfTElDRU5TRSAoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDUFVmcmVxIGZyZXF1ZW5jeSB0YWJsZSBoZWxwZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==